2010-08-13 25 views
1

j'ai essayé plusieurs fonctions, y compris celles en 2D pour essayer d'obtenir ce peu de travail, mais pas encore la chance ...Calcul Intersection point de 2 lat/segments de ligne lng sur la terre

J'ai 2 segments de ligne de latlng extrémités sur la terre, et je veux savoir si et où les 2 lignes se croisent.

Je suis actuellement en train de travailler avec ce qu'un major de physique dit devrait faire le travail pour un avion 2d mais ce n'est pas le cas. il retourne toujours vrai pour Intersection

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

Répondre

0

Hypothèse: vos segments de ligne sont great circle arcs. Toute paire de grands cercles distincts se croisent exactement deux fois. Ainsi, vous pouvez:

  1. Trouvez les deux points d'intersection.
  2. Voir si les points d'intersection se trouvent dans vos arcs.

Here est une discussion de cette méthode.