PHP найти координаты между двумя точками - PullRequest
3 голосов
/ 14 марта 2010

простой вопрос здесь.Допустим, у меня есть две точки:

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 ]

3 голосов
/ 15 марта 2010

спасибо за вашу помощь, но ни один из опубликованных ответов не сработал так, как я хотел. Например, скажем, мои очки были:

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);
2 голосов
/ 14 марта 2010

Сначала нужно найти наклон линии:

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 голос
/ 29 февраля 2012

Более простой алгоритм - найти среднюю точку путем усреднения координат, повторять до тех пор, пока вы не закончите. Просто хотел указать, потому что никто не сделал.

1 голос
/ 14 марта 2010
  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 голосов
/ 14 марта 2010

Чтобы сгенерировать все точки решетки (точки с целыми координатами) на отрезке между (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...