2011-09-14 8 views
6

Voglio ottenere angoli tra due linee. Quindi ho usato questo codice.L'angolo tra due linee è errato


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); 

Ma non funziona. Il registro è quello: 146.309935 -2.553590

Qual è il problema? Non posso sapere il motivo. Per favore aiutatemi.

enter image description here

+0

E per quanto riguarda la linea verticale, è sempre verticale? – Ariel

+1

la tua formula è errata – duedl0r

+1

Non conosco i valori di 'x',' y', 'ScreenWidth' e' ScreenHeight', ma questo sembra corretto, a parte il fatto che stai cambiando il segno del valore in gradi . Quale risultato ti aspettavi? – filipe

risposta

5

Se si usa semplicemente

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

si otterrà l'angolo con la linea orizzontale y=posY (angolo blu).

enter image description here

È necessario aggiungere M_PI_2 al valore di radianti per ottenere il risultato corretto.

+0

Si prega di spiegare in modo più dettagliato. – bTagTiger

+0

Ho modificato la tua immagine. Stai calcolando l'angolo blu invece di quello rosso. – Saphrosit

4

Ecco una funzione che utilizzo. E le grandi opere per me ...

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: Dopo alcune ricerche ho scoperto che si può semplicemente utilizzare atan2(y,x). La maggior parte delle librerie del compilatore ha questa funzione. Puoi ignorare la mia funzione sopra.

1

Se si dispone di 3 punti e si desidera calcolare un angolo tra loro qui è un modo rapido e corretto di calcolo del valore ad angolo retto:

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; 
} 

Questo funziona per voi se si specifica il punto su uno dei le linee, il punto di intersezione e il punto sull'altra linea.

Problemi correlati