2010-11-28 33 views
4

J'essaie de comprendre le bon trig. eq./fonction pour déterminer ce qui suit: Angle-change (en DEGRES) entre deux VECTEURS DE DIRECTION (déjà déterminé), représentant deux segments de ligne. Ceci est utilisé dans le contexte de SHAPE RECOGTNITION (dessinés à la main par l'utilisateur à l'écran).Comment calculer l'angle entre deux vecteurs directionnels qui forment une forme fermée/ouverte?

donc en gros,

a) si l'utilisateur trace un (ébauche), comme un cercle, ou ovale, ou rectangle etc - les lignes qui composent cette forme sont ventilées pour dire .. 20 points (xy paires).

b) J'ai le DirectionVector pour chacun de ces SEGMENTS DE LIGNE. C) Ainsi, le début d'un segment de ligne (x0, y0) correspond aux points d'extrémité de la ligne précédente (de manière à former une forme fermée comme un rectangle, disons). Donc, ma question est, étant donné le contexte (c.-à-déterminer le type d'un polygone), comment trouve-t-on le changement d'angle entre deux vecteurs de direction (disponible comme deux valeurs à virgule flottante pour x et y)? ?

J'ai vu tellement de différents trig. équations et je cherche la clarté à ce sujet.

Merci beaucoup à l'avance les gens!

Répondre

6

Si (x1, y1) est le premier vecteur de direction et (x2, y2) est le second, elle est vérifiée:

cos (alpha) = (x1 * x2 + y1 * y2)/(sqrt (x1 * x1 + y1 * y1) * sqrt (x2 * x2 + y2 * y2))

sqr signifie la racine carrée.

Levez les yeux vers http://en.wikipedia.org/wiki/Dot_product

Surtout la section "représentation géométrique".

+0

brillant! Merci beaucoup! Je vais essayer vos deux suggestions et si les résultats donnent ce que l'utilisateur final cherche, alors MERCI. Sinon, je reviens peut-être! :) Forum très utile- beaucoup de gratitude! – ImmortalBuddha

+0

Une toute petite chose: Puisque vous êtes nouveau ici: Vous pouvez mettre à jour les réponses, et vous pouvez également en sélectionner une pour les réponses «acceptées». Cela soulève la "réputation" de la personne qui a répondu, donc c'est une bonne chose à faire :) – Lagerbaer

+0

Ouais .. Je viens de réaliser ça ... et je vais dire "sois gentil avec moi" car je ne suis pas vraiment Quelqu'un qui passe beaucoup de temps en ligne en général et donc ne pas faire des forums aussi fréquemment que la plupart d'entre vous. Je vais donner votre vote pour l'instant. Une fois que j'aurai implémenté la solution, je choisirai la réponse "correcte". :) Merci beaucoup! :) – ImmortalBuddha

0

Si je vous comprends bien, vous pouvez juste évaluer le produit scalaire entre deux vecteurs et de prendre les appropriés arccos pour récupérer l'angle entre ces vecteurs.

+0

C'est ce que j'ai ressenti aussi. J'essayais de comprendre ce qui se passait dans le sens contraire des aiguilles d'une montre, en fonction de la direction dans laquelle une ligne est tracée, et par conséquent de la question de savoir si je devrais considérer l'angle intérieur. entre deux lignes ou l'angle extérieur (si vous savez ce que je veux dire). mais l'angle intérieur devrait suffire pour la plupart des scénarios - je pense. – ImmortalBuddha

3

Vous pouvez essayer atan2:

float angle = atan2(previousY-currentY, previousX-currentY); 

mais aussi, comme les réponses précédentes mentionnées, le

angle

entre deux verctors = ACOS (first.dotProduct (seconde))

+0

Merci, cela semble plus simple, et les précédents ne donnent pas l'angle (qui est visuellement déterminé par moi, environ). Merci les amis. Vraiment apprécier ce forum et le recommandera à beaucoup. – ImmortalBuddha

+0

MISE À JOUR pour tous: Je n'obtiens pas l'angle correct pour toute combinaison de données (lignes tracées), en utilisant l'une des méthodes ci-dessus. J'ai pensé ... peut-être que mes fonctions de calcul de DirectionVector sont défectueuses, mais elles semblent correctes, étant donné les lignes que je dessine et la valeur fournie ... Donc, je n'ai pas besoin d'y jeter un coup d'oeil. Gardera ce blog posté, jusqu'à ce que le problème soit résolu. Merci à tous ceux qui ont contribué jusqu'à présent. ~ IB ~ – ImmortalBuddha

2

Je suppose que vous avez le vecteur comme trois points (x_1, y_1), (x_2, y_2) et (x_3, y_3).

Ensuite, vous pouvez déplacer les points de sorte que (x 1, y_1) == (0, 0) par

(x 1, y_1) = (x 2, Y_2) - (x 1, y_1) (x 2, Y_2) = (x_3, y_3) - (x 1, y_1)

maintenant, vous avez cette situation:

enter image description here

Pensez de ce triangle comme deux triangles rectangles. Le premier a l'angle alpha et une partie de bêta, le deuxième triangle rectangle a l'autre partie de bêta.

Vous pouvez ensuite appliquer:

enter image description here

Vous pouvez calculer alpha comme ceci:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here