PHP查找两点之间的坐标

时间:2010-03-14 06:09:32

标签: php math loops coordinates

这里有一个简单的问题。让我们说我有两点:

point 1

x = 0
y = 0


point 2

x = 10
y = 10

我如何以编程方式找出中间的所有坐标,假设两点之间有一条直线...所以上面的例子会返回:

0,0
1,1
2,2
3,3
...
8,8
9,9
10,10

谢谢:)

5 个答案:

答案 0 :(得分:3)

感谢您的所有帮助,但没有发布的答案符合我的要求。例如,让我说我的观点是:

0,0

0,10

只有一个开始和结束坐标......它不会找到中间的那些。

也许我做错了什么:S我想出了自己的解决方案:

// Points
$p1 = array(
    'x' => 50,
    'y' => 50
);

$p2 = array(
    'x' => 234,
    'y' => 177
);

// Work out distances
$pxd = $p2['x'] - $p1['x'];
$pyd = $p2['y'] - $p1['y'];

// Find out steps
$steps = max($p1['x'], $p1['y'], $p2['x'], $p2['y']);

$coords = array();

for ($i = 0; $i < $steps; ++ $i) {
    $coords[] = array(
        'x' => round($p1['x'] += $pxd / $steps),
        'y' => round($p1['y'] += $pyd / $steps)
    );
}

print_r($coords);

答案 1 :(得分:2)

您需要先找到该行的斜率:

m = (y1 - y2) / (x1 - x2)

然后你需要找到该行的等式:

y = mx + b

在你的例子中我们得到:

y = 1x + b
0 = 1(0) + b

y = x

要获得所有坐标,您只需插入所有值x1 - &gt; X2。在PHP中,整个事情看起来像:

// These are in the form array(x_cord, y_cord)
$pt1 = array(0, 0);
$pt2 = array(10, 10);
$m = ($pt1[1] - $pt2[1]) / ($pt1[0] - $pt2[0]);
$b = $pt1[1] - $m * $pt1[0];

for ($i = $pt1[0]; $i <= $pt2[0]; $i++)
    $points[] = array($i, $m * $i + $b);

这当然会为您提供落在整数X值上的所有点的坐标,而不是两点之间的“所有坐标”。

答案 2 :(得分:1)

  1. 使用线方程y = mx + c
  2. 放置(0,0)和(10,10)得到两个方程并求解得到m和c的值。 (你将能够找到直接的方程式来获得m和c)。
  3. 然后创建一个从x = x1(0)开始直到x = x2(10)
  4. 的循环
  5. 使用y = mx + c,得到y的值(现在你知道m和c)

答案 3 :(得分:1)

更简单的算法是,通过平均坐标找到中点,重复直到你完成。只是想指出,因为没有人这样做。

答案 4 :(得分:0)

在(x1,y1)和(x2,y2)之间的段上生成所有格点(具有整数坐标的点),其中x1,x2,y1和y2是整数:

function gcd($a,$b) {
    // implement the Euclidean algorithm for finding the greatest common divisor of two integers, always returning a non-negative value
    $a = abs($a);
    $b = abs($b);
    if ($a == 0) {
        return $b;
    } else if ($b == 0) {
        return $a;
    } else {
        return gcd(min($a,$b),max($a,$b) % min($a,$b));
    }
}

function lattice_points($x1, $y1, $x2, $y2) {
    $delta_x = $x2 - $x1;
    $delta_y = $y2 - $y1;
    $steps = gcd($delta_x, $delta_y);
    $points = array();
    for ($i = 0; $i <= $steps; $i++) {
        $x = $x1 + $i * $delta_x / $steps;
        $y = $y1 + $i * $delta_y / $steps;
        $points[] = "({$x},{$y})";
    }
    return $points;
}