2010-07-14 4 views
1

J'ai un cercle qui est en fait une position de latlon avec un rayon mesuré en mètres. Et j'ai aussi une route A-B définie comme deux positions lat-lon. Comment puis-je trouver si cette route traverse le cercle ou non. Est-il possible sans projection des positions latlon dans les positions xy? Si possible s'il vous plaît dites-moi comment le faire. Je suis en train d'essayer de mettre en œuvre une fonctionnalité snap-to-road dans un logiciel de navigation. Donc, ce n'est pas un devoir et une procédure facile à utiliser est très appréciée car je suis très mauvais en maths.Détection d'intersection de cercle et de segment de ligne (Point LatLon, Rayon de comptage et Ligne LatLon)

Merci.

Répondre

2

Je ne connais pas la représentation lat-long.
Mais - en général, cette question ne nécessite pas une mathématique élevée.
D'abord construire l'équation de la ligne entre A à B (appelez la ligne L1).
Ensuite, trouvez l'équation de la ligne perpendiculaire à L1 qui passe par le centre du cercle (appelez cela L2).
Ensuite, trouvez l'intersection des deux équations et vérifiez si le point d'intersection est à l'intérieur du cercle et s'il est dans [A-B].

+0

@Italie, mes maths sont dump. Je ne sais même pas comment construire l'équation d'une ligne. Plus d'indices pls? – VOX

+0

@VOX: Avez-vous essayé Google? –

+0

Oui. jusqu'à présent, ouf ... – VOX

0

La solution d'Itay est élégante et ne nécessite pas beaucoup de mat.

Vous pouvez toutefois opter pour un plus naïf (CPU lourd) mise en œuvre:

rendre votre ligne dans un tableau de points et de mesurer la distance de chaque point au centre de votre cercle:

Méthode pour transformer deux points en un tableau de coordonnées (je n'ai testé cette méthode brièvement)

public static Point[] generatePath(int startX, int startY, int endX, int endY) { 
     _deltaX = Math.Abs(endX - startX); 
     _deltaY = Math.Abs(endY - startY); 
     if (_deltaX >=_deltaY) { 
     //x is independent variable 
     _numpixels = _deltaX + 1; 
     _d = (2 * _deltaY) - _deltaY; 
     _dinc1 = _deltaY << 1; 
     _dinc2 = (_deltaY - _deltaX) << 1; 
     _xinc1 = 1; 
     _xinc2 = 1; 
     _yinc1 = 0; 
     _yinc2 = 1; 
     } else { 
     //y is independent variable 
     _numpixels = _deltaY + 1; 
     _d = (2 * _deltaX) - _deltaY; 
     _dinc1 = _deltaX << 1; 
     _dinc2 = (_deltaX - _deltaY) << 1; 
     _xinc1 = 0; 
     _xinc2 = 1; 
     _yinc1 = 1; 
     _yinc2 = 1; 
     } 
     // Make sure x and y move in the right directions 
     if (startX > endX) { 
     _xinc1 = -_xinc1; 
     _xinc2 = -_xinc2; 
     } 
     if (startY > endY) { 
     _yinc1 = -_yinc1; 
     _yinc2 = -_yinc2; 
     } 
     _x = startX; 
     _y = startY; 
     Point[] returnPath = new Point[_numpixels]; 
     for (int i = 0;i < _numpixels;i++) { 
     returnPath[i].X =_x; 
     returnPath[i].Y =_y; 
     if (_d < 0) { 
      _d = _d + _dinc1; 
      _x = _x + _xinc1; 
      _y = _y + _yinc1; 
     } else { 
      _d = _d + _dinc2; 
      _x = _x + _xinc2; 
      _y = _y + _yinc2; 
     } 
     } 
     return returnPath; 
    } 

méthode pour calculer la distance du centre de votre cercle à chaque point de votre ligne:

public static double GetLenghtBetweenPoints(Point Source, Point Distination) { 
     return Math.Sqrt((Math.Pow((Source.X-Distination.X), 2) + Math.Pow((Source.Y-Distination.Y), 2))); 
    } 
+0

qui ne va vraiment pas marcher pour moi. Je suis sur .NET CF avec moins de puissance du processeur. Mais merci quand même. – VOX

Questions connexes