Question

J'essaie de vérifier l'emplacement d'un point (px, py) sur un graphe 2D par rapport à un segment de droite (lx1, ly1) (lx2, ly2), en utilisant la logique des directions Nord Sud Est Ouest. La logique que j'ai implémentée consiste à dessiner une perpendiculaire sur le segment de droite à partir du point.

si perpendiculaire est en ligne, cela signifie que son sud.

Si le point du côté droit signifie son est.

Si le point du côté gauche signifie l'Ouest.

Si la perpendiculaire est éloignée de la ligne en avant signifie le nord.

Si la perpendiculaire est éloignée de la ligne en arrière signifie le sud.

Mon problème est que cette logique semble bonne sur le papier, mais il devient très difficile de décider s’il s’agit d’un cas de NW, NE, SW ou SE. Quelqu'un peut-il me suggérer comment calculer cette logique? J'utilise C ++, mais un algorithme dans n'importe quel langage sera d'une grande aide.

J'utilise le point final du segment de ligne pour calculer la relation nord-sud-ouest.

A bientôt

Était-ce utile?

La solution

  • delta_x = x2 - x1
  • delta_y = y2 - y1
  • distance = sqrt (delta_x ^ 2 + delta_y ^ 2)
  • tan (thêta) = delta_y / delta_x
  • theta = arctan (delta_y / delta_x) ;; mais ne divisez pas par zéro!
  • multipliez thêta par 180 / PI pour obtenir les diplômes

Les degrés sont dans le sens anti-horaire à partir du côté positif de l'axe des x. Finalement, vous devrez faire une petite quantité d’algèbre pour réorienter les degrés de façon à ce que 0 soit relevé (au lieu de celui à droite) et qu’il tourne dans le sens des aiguilles d’une montre. Mais avant cela:

Un problème est que arctan (1 / -1) est identique à arctan (-1 / 1) . I.e. , vous obtiendrez -PI / 4 en radians ou -45 degrés, en haut à gauche (nécessite un décalage de 180 degrés) et en bas à droite (ok tel quel). Vous devrez faire des tests sur le signe delta_y vs. delta_x pour voir si le résultat de arctan doit être ajusté.

Avant de coder votre solution, veillez également à coder les tests pour vous assurer que les fonctions que vous appelez génèrent les valeurs attendues.

Autres conseils

Je sympathise avec ndim . Calculer la direction d'un point à un autre est facile. Je ne comprends pas quel contexte vous obligerait à vouloir une ligne. Est-ce une application de cartographie? Y a-t-il une route et à peu près à mi-chemin d'un segment de route, vous avez un point de côté?

La sémantique de ce que "nord" ou " NE " ou " est " d'un segment de ligne signifie en fait n'est pas clair.

Des indications telles que "Nord" ou " est " ou " NE " sont généralement utilisés pour décrire l'emplacement d'un point par rapport à un autre point (de base). Quel est le point sur le segment de ligne que vous utilisez comme point de base?

EDIT: Maintenant que vous dites que vous voulez utiliser le point final (x2, y2) comme point central du compas, un point (x , y) sera localisé par rapport à la boussole en examinant le vecteur delta (x-x2, y-y2) .

La méthode facile à raisonner sur la méthode utilise atan2 () sur le vecteur delta et considère l'angle renvoyé par atan2 () .

Cependant, il pourrait également être judicieux de comparer les arguments entre atan2 () et de déterminer les plages d'angle résultantes à partir de cela. Cela évite essentiellement d'appeler atan2 () à l'exécution, au prix de quelques calculs à effectuer (ou avant) au moment de la compilation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top