Вычисление точки пересечения 2 сегментов линии широта / долгота на земле - PullRequest
1 голос
/ 13 августа 2010

Я пробовал несколько функций, включая 2D, чтобы попытаться заставить это работать, но пока не повезло ...

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

В настоящее время я работаю с этим, который, по словам специалиста по физике, должен выполнять работу для двумерной плоскости, но это не так.всегда возвращает true для функции intersect

[code] intersectPoint ($ line1start, $ line1end, $ line2start, $ line2end) // ($ p0_x, $ p0_y, $ p1_x, $ p1_y, $ p2_x, $ p2_y, $ p3_x, $ p3_y) {$ p0_x = $ line1start ['lat'];$ p0_y = $ line1start ['lng'];$ p1_x = $ line1end ['lat'];$ p1_y = $ line1end ['lng'];$ p2_x = $ line2start ['lat'];$ p2_y = $ line2start ['lng'];$ p3_x = $ line1end ['lat'];$ p3_y = $ line1end ['lng'];

$s1_x = (double) $p1_x - (double) $p0_x;
$s1_y = (double) $p1_y - (double) $p0_y;

// s1_x = p1_x - p0_x;// s1_y = p1_y - p0_y;$ s2_x = (double) $ p3_x - (double) $ p2_x;$ s2_y = (double) $ p3_y - (double) $ p2_y;$ s3_x = (double) $ p0_x - (double) $ p2_x;$ s3_y = (double) $ p0_y - (double) $ p2_y;// s2_x = p3_x - p2_x;// s2_y = p3_y - p2_y;

$s = (double) ((double)(-$s1_y * $s3_x + $s1_x * $s3_y) / (double) (-$s2_x * $s1_y + $s1_x * $s2_y));
$t = (double) ((double)( $s2_x * $s3_y - $s2_y * $s3_x) / (double) (-$s2_x * $s1_y + $s1_x * $s2_y));

// s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);// t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);

if ($s >= 0 && $s <= 1 && $t >= 0 && $t <= 1)
{
    AppCommUtility::echof(" FUNC RETURNED TRUE $s >= 0 && $s <= 1 && $t >= 0 && $t <= 1");
    // Collision detected
    return array(
        'lat' => $p0_x + ($t * $s1_x),
        'lng' => $p0_y + ($t * $s1_y)
    );
}

return null; // No collision

} [/ code]

1 Ответ

0 голосов
/ 13 августа 2010

Предположение: ваши отрезки большой круг дуги.

Любая пара отличных больших кругов пересекается ровно дважды. Итак, вы можете:

  1. Найдите две точки пересечения.
  2. Посмотрите, лежат ли точки пересечения в ваших дугах.

Здесь - обсуждение этого метода.

...