2010-06-16 18 views
6

Por ejemplo, GetAngle ((0,0), (100,0), (100,100)) = 90. ¿Cómo puedo encontrar el ángulo entre 3 puntos 2D.Ángulo entre 3 vértices

+3

Si esto fuera un sitio de matemáticas estaría tentado de etiquetar esta tarea. ;) Esto es simple trigonometría. http://en.wikipedia.org/wiki/Trigonometry#Common_formulas – Cogwheel

+0

No, es para un proyecto personal – jmasterx

Respuesta

9

Dados los puntos A, B y C, ¿quiere el ángulo entre AB y AC? Primero calcule los vectores AB y AC - son solo las coordenadas de B menos las coordenadas de A y también para AC. Tome el dot product de los dos vectores. Esto es solo el producto de las coordenadas x más el producto de las coordenadas y de los vectores. Divida este número por la longitud de AB, y de nuevo por la longitud de CA. Este resultado es el coseno del ángulo entre los dos vectores, así que toma los arccos() y lo tienes.

+0

Gracias, haré esto – jmasterx

+1

De la pregunta, creo que el ángulo deseado es el encendido entre BA y BC –

+0

@Dave Oh , Gracias :-) – jmasterx

1

Utilizar el producto escalar:

(a,b,c) dot (d,e,f) = ad + be + bf.

A dot B = length(A)*length(B)* cos(theta) 

theta = arccos((A dot B)/(length(A)*length(B)) es el ángulo entre los vectores A y B.

0

Esto es fácil si usted tiene algunos conocimientos básicos de álgebra lineal.

Un vector v (en un sentido de álgebra lineal, no std :: vector;)) es una tupla v = (x, y, z).

La norma es la longitud del vector | v | = Sqrt (x x + y y + z z *)

El producto interno de dos vectores v1 = (x1, y1, z1) y v2 = (X2, Y2, Z2) es v1 · v2 = x1 * x2 + y1 * y2 + z1 * z2

el ángulo de los vectores V1 y V2 es a = Acos (v1 · v2/(| v1 | * | v2 |))

+0

Gracias! Me gusta esto también :-) – jmasterx

6

el problema con el uso de sólo el El producto punto aquí es inestable cerca de 0 o 180 grados: la pendiente de acos() se aproxima al infinito cerca de +/- 1.0, lo que le hará perder precisión.

Para solucionar esto, se puede calcular un producto pseudo-cruz, y utiliza atan2(), como sigue:

// given A, B, C are 2D points: 
BA= B - A; CA= C - A // vector subtraction, to get vector between points 
dot= BA.x * CA.x + BA.y * CA.y 
pcross= BA.x * CA.y - BA.y * CA.x 
angle= atan2(pcross, dot) // this should be the angle BAC, in radians 

Esto debería ser numéricamente robusto a menos que una de las patas del ángulo tiene longitud cero.

Tenga en cuenta que esto también le dará un ángulo con signo, dependiendo de si BAC gira en sentido horario o antihorario; el método acos() siempre te dará un valor positivo. Por supuesto, si solo desea un ángulo positivo, puede tomar abs(angle); el método atan2() aún será más robusto y probablemente más rápido.

Cuestiones relacionadas