2010-11-19 3 views
2

Cela fait des jours que je travaille sur un projet dans lequel je dois utiliser une coque convexe, et une méthode spécifique de graham scan. Le problème a été résolu jusqu'à l'endroit où je veux trier les points. Donc l'histoire est que j'ai rassemblé des tas de points dont ils sont du type Point et leurs coordonnées sont apparentées. Cela signifie qu'ils proviennent de l'événement souris x et y. J'ai donc collecté les positions de la souris comme x et y des points. Et je veux trouver l'angle lié au point de pivotement. Est-ce que quelqu'un a un morceau de code pour calculer cet angle? Beaucoup et merci beaucoup, l'image ci-dessous est ce que je dois: Angles over pivotetrouver l'angle de point lié au pivot

Répondre

7

Utilisez

Math.atan2(dy, dx) 

dy et dx représentent la différence verticale et horizontale entre le point et le point de pivot.

Quelques notes à garder à l'esprit:

  • La référence (0 radians) est, par convention, pointant vers la droite, pas à gauche comme dans l'image. Si vous voulez vraiment le mesurer à partir de la gauche, vous devrez le faire pour le convertir en Math.PI - angle.

  • Les fonctions Math -trigonométrie fonctionnent en radians. Pour convertir les résultats en degrés, vous pouvez utiliser Math.toDegrees.

  • Dans le monde mathématique, l'augmentation des valeurs y pointe vers le haut. À ton image, ils pointent vers le bas.

+0

Merci à l'avance l'algorithme fonctionnait très bien, tout le problème que vous avez mentionné est parce que Java calculer Y d'un point du coin supérieur gauche de l'écran qui fait augmenter le y en descendant, si j'obtiens l'abs de l'angle c'est parfait. Merci beaucoup d'avoir aidé. – user435245

+0

Hmm. Cependant, je n'utiliserais pas 'Math.abs' sur l'angle. Puis '-45' et' + 45' seront identiques. Essayez d'utiliser '+ 360' et'% 360' si vous voulez vous débarrasser des angles négatifs. – aioobe

1

pour obtenir l'angle de l'horizontale de la ligne reliant les deux points p1 p2: & Angle = atan ((p1.y - p2.y)/(P1.x - p2.x)

Ainsi, votre angle noir = atan ((454-243)/(286-108)) REMARQUE: signe y inversé comme axe y commence en haut à gauche plutôt que

en bas à gauche

angle sera en radians, pour convertir en degrés muliply par (180/pi)

+0

Notez qu'en utilisant 'atan' vous devez déterminer manuellement dans quel quadrant se trouve l'angle. (Puisque par exemple, '(454-243)/(286-108)' ressemble à quand les points sont inversés: '(243-454)/(108-286)'.) 'Math.atan2' peut prendre prendre soin de cela pour vous. – aioobe

2

Je voudrais utiliser La double définition du dot product pour calculer ceci, comme vous sautez le point méchant de ce qui se produit aux lignes verticales, et traitant des quadrants

(Pardonnez ma notation car les maths ne fonctionnent pas trop bien dans la démarque ...)

Lorsque A et B sont tous deux des vecteurs 2D avec x et y composants, et theta est l'angle entre eux:

dot(A, B) = ax * bx + ay * by 

et

dot(A, B) = |A| * |B| * cos(theta) 

...où |A| est la longueur de A, qui peut être calculé avec Pythagorean theorem:

|A| = sqrt(ax^2 + ay^2) 

Par conséquent:

theta = acos((ax * bx + ay * by)/(|A| * |B|)) 
+1

"en passant sur le point désagréable de ce qui se passe sur les lignes verticales", ou, il pourrait simplement utiliser "Math.atan2" qui s'occupe de cela pour lui. – aioobe