2010-08-13 66 views
1

我一直想多种功能,包括2D的人,试图让这个有些工作2纬度/经度线段的点,但没有运气尚未...相交计算地球上

我有2个线段在地球上的纬度端点,我想知道两条线是否相交。

我目前正在处理这个问题,物理学专业的学生应该为2d飞机做这项工作,但不是。它总是为交叉

[代码]功能intersectPoint($ line1start,$ line1end,$ line2start,$ line2end) //(返回true $ 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); (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 

} [/代码]

回答

0

假设:你的线段是great circle弧。

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

  1. 找到两个交点。
  2. 看看交点是否在你的圆弧中。

Here是对这种方法的讨论。