计算地球上2个lat / lng线段的交点

时间:2010-08-13 17:20:01

标签: line segment intersect

我一直在尝试多种功能,包括2D功能,试图让它有点工作,但没有运气......

我在地球上有两个latlng端点的线段,我想知道这两条线是否相交以及在哪里。

我正在使用这个,一个物理专业的人说应该为二维飞机做这个工作,但事实并非如此。对于交叉

,它总是返回true

[code] function 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

} [/代码]

1 个答案:

答案 0 :(得分:0)

假设:您的线段为great circle弧。

任何一对不同的大圆都恰好相交两次。所以,你可以:

  1. 找到两个交点。
  2. 查看交叉点是否位于弧线中。
  3. Here是对此方法的讨论。