Reputation: 10643
simple question here. Lets say I have two points:
point 1
x = 0
y = 0
point 2
x = 10
y = 10
How would i find out all the coordinates inbetween that programmatically, assuming there is a strait line between two points... so the above example would return:
0,0
1,1
2,2
3,3
...
8,8
9,9
10,10
Thanks :)
Upvotes: 5
Views: 9177
Reputation: 405
A simpler algorithm would be, find the midpoint by averaging out the coordinates, repeat until you're done. Just wanted to point out because no one did.
Upvotes: 1
Reputation: 10643
thanks for all your help but non of the answers posted worked how i wanted it to. For example, lets say my points were:
0, 0
0, 10
There would only be a start and a finish coordinate... it wouldnt find the ones inbetween.
Maybe i did something wrong :S but i came up with my own solution:
// 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);
Upvotes: 3
Reputation: 10834
To generate all the lattice points (points with integral coordinates) on the segment between (x1,y1) and (x2,y2), where x1, x2, y1, and y2 are integers:
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;
}
Upvotes: 1
Reputation: 13461
You need to find the slope of the line first:
m = (y1 - y2) / (x1 - x2)
Then you need to find the equation of the line:
y = mx + b
In your example you we get:
y = 1x + b
0 = 1(0) + b
or
y = x
To get all of the coordinates you simply need to plug in all values x1 -> x2. In PHP this entire thing looks something like:
// 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);
This will of course give you the coordinates for all points that fall on integer values of X, and not "all coordinates" between the two points.
Upvotes: 4
Reputation: 95900
Upvotes: 1