views:

117

answers:

4

Hi all, 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 :)

+1  A: 

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.

jasonbar
+1, Your code seems to do exactly what I had wanted my code to originally do, its cleaner and looks more like a solid solution.
Anthony Forloney
you beat me to it. anyways i leave my algo up for those who want.
Alec Smart
Testing for a vertical line is left as an exercise for the user.
jasonbar
A: 
  1. Use the line equation, y = mx + c
  2. Put (0,0) and and (10,10) to get two equations and solve to get values of m and c. (you will be able to find the direct equations to get m and c somewhere).
  3. Then create a loop to start from x = x1 (0) till x = x2 (10)
  4. Using y=mx+c, get the value of y (now that you know m and c)
Alec Smart
A: 

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;
}
Isaac
A: 

Hi all, 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);
Ozzy
You found one of the two exceptions where the solution y = a + bx does not work. The reason is that the slope b would be infinite (as division by 0 is not defined, and x1 - x2 is 0). Your solution has drawbacks, though: you only calculate discrete values for the upper right quadrant (positive x and y). And the steps are arbitrarily defined by the largest coordinate: take (20,0) and (21,1): there will be 21 steps, while (0,5) and (1,3) will result in only 3 steps. Try using $steps = max($pdx, $pdy) instead.
Ralph Rickenbach