简单的问题在这里。可以说我有两点:PHP查找两点之间的坐标
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
谢谢:)
简单的问题在这里。可以说我有两点:PHP查找两点之间的坐标
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
谢谢:)
感谢您的所有帮助,但所发布的答案都不是我想要的。例如,可以说,我的观点是:
0,0
0,10
只会有一个起点和一个终点坐标...它wouldnt插图中找到的。
也许我做错了什么:秒,但我想出了自己的解决方案:
// 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);
您发现解决方案y = a + bx不起作用的两个例外之一。原因是斜率b将是无限的(因为0的除法没有定义,并且x1 - x2是0)。 但是,您的解决方案有一些缺点:您只计算右上象限的离散值(正x和y)。步骤由最大坐标任意定义:take(20,0)和(21,1):将会有21步,而(0,5)和(1,3)只会导致3步。 尝试使用$ steps = max($ pdx,$ pdy)来代替。 – 2010-03-15 15:19:12
更改为$步骤工作不一致。插入3,3和0.5,代码只返回两点:2,4和0.5。它错过了沿y = 4或y = 5的x = 1的插入点,其中任何一个都是我可以接受的。 – 2011-10-17 19:37:13
你需要先找到直线的斜率:
m = (y1 - y2)/(x1 - x2)
然后,你需要找到线方程:
y = mx + b
在您的例子,你可以得到:
y = 1x + b
0 = 1(0) + b
或
y = x
要得到所有你只需要简单的坐标插入所有值x1 - > 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上的整数值,而不是两点之间“的所有坐标”的所有点的坐标。
+1,你的代码似乎完全符合我原本想要的代码,它的更干净,看起来更像是一个可靠的解决方案。 – 2010-03-14 06:45:57
你打败了我。无论如何,我离开我的算法为那些谁想要。 – 2010-03-14 06:52:32
垂直线测试留给用户练习。 – jasonbar 2010-03-16 02:15:42
要生成所有晶格点上(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;
}
似乎并不一致。鉴于(3,3,0,5)它只返回3,3和0.5,但没有中间点。 (3,3,0,6)正确工作,这是一个完美的“45度线”,但在其他斜坡上效果不佳。 – 2011-10-17 19:32:47
@DonJones:在(3,3)和(0,5)之间的线段上没有任何格点,即两个坐标都是整数的点。 – Isaac 2011-10-18 04:57:27
一个更简单的算法是,发现通过平均出坐标的中点,重复,直到你完成。只是想指出,因为没有人。
不挑剔,但飞机上任意两点之间有无数个点。如果你指的是积分点,那就不同了,但是你的最小步数将决定有多少个最大点。 – GrayWizardx 2010-03-14 06:32:29
我建议你使用一个更好的例子,因为这使得行方程y = x这不是通常的情况。 – 2010-03-14 06:51:27