2010-03-14 72 views
3

简单的问题在这里。可以说我有两点: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

不挑剔,但飞机上任意两点之间有无数个点。如果你指的是积分点,那就不同了,但是你的最小步数将决定有多少个最大点。 – GrayWizardx 2010-03-14 06:32:29

+0

我建议你使用一个更好的例子,因为这使得行方程y = x这不是通常的情况。 – 2010-03-14 06:51:27

回答

3

感谢您的所有帮助,但所发布的答案都不是我想要的。例如,可以说,我的观点是:

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); 
+0

您发现解决方案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

+0

更改为$步骤工作不一致。插入3,3和0.5,代码只返回两点:2,4和0.5。它错过了沿y = 4或y = 5的x = 1的插入点,其中任何一个都是我可以接受的。 – 2011-10-17 19:37:13

2

你需要先找到直线的斜率:

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

+1,你的代码似乎完全符合我原本想要的代码,它的更干净,看起来更像是一个可靠的解决方案。 – 2010-03-14 06:45:57

+0

你打败了我。无论如何,我离开我的算法为那些谁想要。 – 2010-03-14 06:52:32

+0

垂直线测试留给用户练习。 – jasonbar 2010-03-16 02:15:42

1
  1. 使用直线方程,表达式y = mx + C
  2. 穿戴(0,0)和和(10,10),以获得两个方程和解决得到的m和c的值。 (你将能够找到直接方程式来获得m和c的某个地方)。
  3. 然后创建一个循环,从x = X1(0)开始直到X = X2(10)
  4. 使用表达式y = mx + C,得到y的值(现在你知道M和C)
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; 
} 
+0

似乎并不一致。鉴于(3,3,0,5)它只返回3,3和0.5,但没有中间点。 (3,3,0,6)正确工作,这是一个完美的“45度线”,但在其他斜坡上效果不佳。 – 2011-10-17 19:32:47

+0

@DonJones:在(3,3)和(0,5)之间的线段上没有任何格点,即两个坐标都是整数的点。 – Isaac 2011-10-18 04:57:27

1

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