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: trouver l'angle de point lié au pivot
Répondre
Utilisez
Math.atan2(dy, dx)
où 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 utiliserMath.toDegrees
.Dans le monde mathématique, l'augmentation des valeurs y pointe vers le haut. À ton image, ils pointent vers le bas.
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 à gaucheangle sera en radians, pour convertir en degrés muliply par (180/pi)
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
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|))
"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
- 1. Problème lié au SUBSTRING
- 2. Trouver Bound Point de TreeViewItem de ContextMenu
- 3. C# détecter l'application mise au point mise au point
- 4. cellule de mise au point flex datagrid
- 5. formes de mise au point
- 6. Problème lié au fichier de téléchargement WebClient
- 7. Modèle ASP.NET lié au type de base
- 8. Impossible de trouver un point d'entrée (cpp)
- 9. Pivot requête sql
- 10. style de mise au point de contrôle
- 11. Mise au point de travail de quartz
- 12. Mise au point de l'avertissement de batterie
- 13. ComboBox personnalisé lié au type dérivé de ComboBox
- 14. ASP.AJAX UpdatePanel - probablement lié au mappage d'application
- 15. Problème lié au répéteur via l'appel ajax
- 16. Sous-domaine PHP lié au contrôleur?
- 17. IE: commentaire conditionnel lié au fichier
- 18. Connexion au serveur lié SQL 2008
- 19. Mise au point d'un service
- 20. WPF TextBox Mise au point
- 21. Mise au point dans ASP
- 22. Excel Pivot
- 23. Aide PIVOT
- 24. Mise au point des 403?
- 25. Mesure de mise au point Javascript
- 26. jQuery ScrollBar - Pas de mise au point?
- 27. Mise au point de OutputCache dans ASP.Net
- 28. QLineEdit - événement de mise au point
- 29. Architecture d'application au point de vente
- 30. Mise au point de la caméra S60
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
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