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
相关产品推荐
相关产品推荐

