You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何循环坐标数组(含首尾)计算多边形线段中点?

简洁实现多边形线段中点计算(首尾衔接)

给定用于ImageMagick绘制多边形的坐标数组:

$points = [
    ['x' => 40, 'y' => 10],
    ['x' => 20, 'y' => 20],
    ['x' => 70, 'y' => 50],
    ['x' => 60, 'y' => 15],
];

要计算每条连续线段(含最后一点与第一点的线段)的中点,完全可以不用繁琐的计数判断,以下是两种高效的程序化实现方式:


方法1:模运算自动处理首尾衔接

利用模运算的循环特性,直接通过索引获取下一个点,无需修改原数组:

$midpoints = [];
$count = count($points);

foreach ($points as $index => $point) {
    // 下一个点的索引:当前索引+1,超出数组长度时取模回到0
    $nextIndex = ($index + 1) % $count;
    $nextPoint = $points[$nextIndex];
    
    // 计算中点坐标
    $midpoints[] = [
        'x' => ($point['x'] + $nextPoint['x']) / 2,
        'y' => ($point['y'] + $nextPoint['y']) / 2,
    ];
}

// 输出结果
print_r($midpoints);

核心逻辑:当遍历到最后一个元素时,$index + 1等于数组长度,取模运算后得到0,自动指向第一个元素,完美实现首尾衔接,全程无额外条件判断。


方法2:扩展数组简化遍历逻辑

将第一个元素追加到数组末尾,让最后一个元素的下一个点自然是第一个点:

$midpoints = [];
// 扩展数组,把第一个点放到最后
$extendedPoints = array_merge($points, [$points[0]]);

// 遍历次数与原数组长度一致
for ($i = 0; $i < count($points); $i++) {
    $current = $extendedPoints[$i];
    $next = $extendedPoints[$i + 1];
    
    $midpoints[] = [
        'x' => ($current['x'] + $next['x']) / 2,
        'y' => ($current['y'] + $next['y']) / 2,
    ];
}

// 输出结果
print_r($midpoints);

核心逻辑:通过扩展数组让线段配对逻辑变得直观,遍历过程无需考虑首尾边界,适合需要直观理解逻辑的场景。


内容的提问来源于stack exchange,提问作者Noel Whitemore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:41:13