2011-09-14 22 views
6

Quiero obtener ángulos entre dos líneas. Así que usé este código.El ángulo entre dos líneas es incorrecto


int posX = (ScreenWidth) >> 1; 

int posY = (ScreenHeight) >> 1; 

double radians, degrees; 

radians = atan2f(y - posY , x - posX); 

degrees = -CC_RADIANS_TO_DEGREES(radians); 

NSLog(@"%f %f",degrees,radians); 

Pero no funciona. El registro es que: 146.309935 -2.553590

¿Qué pasa? No puedo saber la razón. Por favor, ayúdenme.

enter image description here

+0

¿Y qué pasa con la línea vertical, siempre es vertical? – Ariel

+1

su fórmula es incorrecta – duedl0r

+1

No conozco los valores de 'x',' y', 'ScreenWidth' y' ScreenHeight', pero esto parece correcto, aparte del hecho de que está cambiando el signo del valor en grados . ¿Qué resultado esperabas? – filipe

Respuesta

5

Si usted utiliza simplemente

radians = atan2f(y - posY , x - posX); 

que obtendrá el ángulo con la línea y=posY (ángulo azul) horizontal.

enter image description here

Usted tendrá que añadir a su valor M_PI_2 radianes para obtener el resultado correcto.

+0

Explique con más detalle. – bTagTiger

+0

He editado su imagen. Está calculando el ángulo azul en lugar del rojo. – Saphrosit

4

Aquí hay una función que uso. Funciona muy bien para mí ...

float cartesianAngle(float x, float y) { 
    float a = atanf(y/(x ? x : 0.0000001)); 
    if  (x > 0 && y > 0) a += 0; 
    else if (x < 0 && y > 0) a += M_PI; 
    else if (x < 0 && y < 0) a += M_PI; 
    else if (x > 0 && y < 0) a += M_PI * 2; 
    return a; 
} 

EDIT: Después de algunas investigaciones descubrí que sólo puede utilizar atan2(y,x). La mayoría de las librerías compiladoras tienen esta función. Puedes ignorar mi función anterior.

1

Si usted tiene 3 puntos y desea calcular un ángulo entre ellos aquí es una forma rápida y correcta de calcular el valor de ángulo recto:

double AngleBetweenThreePoints(CGPoint pointA, CGPoint pointB, CGPoint pointC) 
{ 
    CGFloat a = pointB.x - pointA.x; 
    CGFloat b = pointB.y - pointA.y; 
    CGFloat c = pointB.x - pointC.x; 
    CGFloat d = pointB.y - pointC.y; 

    CGFloat atanA = atan2(a, b); 
    CGFloat atanB = atan2(c, d); 

    return atanB - atanA; 
} 

Esto funcionará para usted si se especifica el punto en uno de las líneas, el punto de intersección y el punto en la otra línea.

Cuestiones relacionadas