Disons que vous avez ceci:
P1 = (x=2, y=50)
P2 = (x=9, y=40)
P3 = (x=5, y=20)
Supposons que ce P1
soit le point central d'un cercle. C'est toujours pareil. Je veux l'angle qui est constitué par P2
et P3
, ou en d'autres termes l'angle qui est à côté P1
. L'angle intérieur pour être précis. Ce sera toujours un angle aigu, donc inférieur à -90 degrés.
J'ai pensé: Mec, ce sont de simples mathématiques géométriques. Mais je cherche une formule depuis environ 6 heures maintenant, et je ne trouve que des gens qui parlent de trucs compliqués de la NASA comme des arccos et des produits scalaires vectoriels. J'ai l'impression d'être dans un frigo.
Certains gourous des mathématiques ici pensent que c'est un problème simple? Je ne pense pas que le langage de programmation compte ici, mais pour ceux qui le pensent: java et objective-c. J'en ai besoin pour les deux, mais je ne l'ai pas marqué pour ceux-ci.
Cela devient très simple si vous pensez que c'est deux vecteurs, un du point P1 à P2 et un de P1 à P3
donc:
a = (p1.x - p2.x, p1.y - p2.y)
b = (p1.x - p3.x, p1.y - p3.y)
Vous pouvez ensuite inverser la formule du produit scalaire:
pour obtenir l'angle:
Rappelez-vous que cela signifie simplement: a1 * b1 + a2 * b2 (juste 2 dimensions ici ...)
la source
La meilleure façon de traiter le calcul de l'angle est d'utiliser le
atan2(y, x)
fait qu'un point donnéx, y
renvoie l'angle à partir de ce point et l'X+
axe par rapport à l'origine.Étant donné que le calcul est
c'est-à-dire que vous traduisez fondamentalement les deux points par
-P1
(en d'autres termes, vous traduisez tout pour que celaP1
se termine à l'origine) et ensuite vous considérez la différence des angles absolus deP3
et deP2
.L'avantage de
atan2
est que le cercle complet est représenté (vous pouvez obtenir n'importe quel nombre entre -π et π) alors qu'au lieu de cela,acos
vous devez gérer plusieurs cas en fonction des signes pour calculer le résultat correct.Le seul point singulier pour
atan2
est(0, 0)
... ce qui signifie que les deuxP2
etP3
doivent être différents deP1
car dans ce cas n'a pas de sens de parler d'un angle.la source
atan2
est exactement ce qui est nécessaire pour ce problème, mais il semble que la plupart des gens qui abordent cette question ne peuvent tout simplement pas lire ou ne peuvent pas comprendre pourquoi lesacos
solutions basées sur des solutions sont mauvaises. Heureusement pour moi, j'ai quitté la phase "quelqu'un a tort sur Internet" ( xkcd.com/386 ) il y a de nombreuses années et je ne vais pas me battre pour défendre l'évidence :-)Permettez-moi de donner un exemple en JavaScript, je me suis beaucoup battu avec ça:
Bonus: Exemple avec HTML5-canvas
la source
sqrt
et en faisant la quadrature. Voir ma réponse ici (écrite en Ruby), ou dans cette démo mise à jour (JavaScript).Fondamentalement, vous avez deux vecteurs, un vecteur de P1 à P2 et un autre de P1 à P3. Il vous suffit donc d'une formule pour calculer l'angle entre deux vecteurs.
Jetez un œil ici pour une bonne explication et la formule.
la source
Si vous pensez à P1 comme le centre d'un cercle, vous pensez trop compliqué. Vous avez un triangle simple, donc votre problème peut être résolu avec la loi des cosinus . Pas besoin de toute transformation de coordonnées polaires ou autre. Disons que les distances sont P1-P2 = A, P2-P3 = B et P3-P1 = C:
Tout ce que vous avez à faire est de calculer la longueur des distances A, B et C.Celles-ci sont facilement disponibles à partir des coordonnées x et y de vos points et du théorème de Pythagore
la source
P1-P2 = A
ne doit pas être lue comme "Pour calculer A, soustraire P2 de P1", mais comme "Je définis A comme la distance de P1 à P2", qui peut ensuite être calculée en utilisant la deuxième équation. Je voulais juste définir un raccourci pour les distances, pour rendre les équations plus lisibles.J'ai récemment rencontré un problème similaire, il me suffisait de différencier les angles positifs et négatifs. Au cas où cela serait utile à quiconque, je recommande l'extrait de code que j'ai récupéré dans cette liste de diffusion sur la détection de la rotation sur un événement tactile pour Android:
la source
Solution géométrique très simple avec explication
Il y a quelques jours, un est tombé dans le même problème et a dû s'asseoir avec le livre de mathématiques. J'ai résolu le problème en combinant et en simplifiant certaines formules de base.
Considérons ce chiffre-
Nous voulons connaître ϴ , donc nous devons d'abord découvrir α et β . Maintenant, pour toute ligne droite-
Soit - A = (ax, ay) , B = (bx, by) et O = (ox, oy) . Donc pour la ligne OA -
De la même manière, pour l' OB de ligne -
Maintenant, nous avons besoin
ϴ = β - α
. En trigonométrie, nous avons une formule-Après avoir remplacé la valeur de
tan α
(de l'éqn-2) ettan b
(de l'éqn-3) dans l'éqn-4, et appliqué la simplification, nous obtenons-Alors,
C'est ça!
Maintenant, prenez la figure suivante-
Cette méthode C # ou Java calcule l'angle ( ϴ ) -
la source
Dans Objective-C, vous pouvez le faire en
Ou lisez plus ici
la source
Vous avez évoqué un angle signé (-90). Dans de nombreuses applications, les angles peuvent avoir des signes (positifs et négatifs, voir http://en.wikipedia.org/wiki/Angle ). Si les points sont (disons) P2 (1,0), P1 (0,0), P3 (0,1) alors l'angle P3-P1-P2 est conventionnellement positif (PI / 2) alors que l'angle P2-P1- P3 est négatif. L'utilisation de la longueur des côtés ne fera pas la distinction entre + et - donc si cela est important, vous devrez utiliser des vecteurs ou une fonction telle que Math.atan2 (a, b).
Les angles peuvent également s'étendre au-delà de 2 * PI et bien que cela ne soit pas pertinent pour la question actuelle, il était suffisamment important que j'écrive ma propre classe Angle (également pour m'assurer que les degrés et les radians ne se mélangent pas). La question de savoir si l'angle1 est inférieur à l'angle2 dépend essentiellement de la façon dont les angles sont définis. Il peut également être important de décider si une ligne (-1,0) (0,0) (1,0) est représentée par Math.PI ou -Math.PI
la source
Récemment, j'ai moi aussi le même problème ... En Delphi, c'est très similaire à Objective-C.
la source
Voici une méthode C # pour renvoyer l'angle (0-360) dans le sens inverse des aiguilles d'une montre à partir de l'horizontale pour un point sur un cercle.
A bientôt, Paul
la source
la source
il y a une réponse simple pour cela en utilisant les mathématiques du lycée.
Disons que vous avez 3 points
Pour obtenir l'angle du point A au point B
angle = atan2(A.x - B.x, B.y - A.y)
Pour obtenir l'angle du point B au point C
angle2 = atan2(B.x - C.x, C.y - B.y)
Je viens d'utiliser ce code dans le projet récent que j'ai fait, changez le B en P1 .. vous pourriez aussi bien supprimer le "180 +" si vous le souhaitez
la source
eh bien, les autres réponses semblent couvrir tout ce qui est requis, donc je voudrais simplement ajouter ceci si vous utilisez JMonkeyEngine:
Vector3f.angleBetween(otherVector)
car c'est ce que je suis venu ici chercher :)
la source
}
la source