2010-11-02 9 views
7

Ich muss den Winkel zwischen den Zeilen berechnen. Ich muss atan berechnen. Also habe ich einen solchen Code bin mitHilfe um atan2 richtig zu berechnen

static inline CGFloat angleBetweenLinesInRadians2(CGPoint line1Start, CGPoint line1End) 
{ 
    CGFloat dx = 0, dy = 0; 

    dx = line1End.x - line1Start.x; 
    dy = line1End.y - line1Start.y; 
    NSLog(@"\ndx = %f\ndy = %f", dx, dy); 

    CGFloat rads = fabs(atan2(dy, dx)); 

    return rads; 
} 

Aber ich kann nicht über 180 Grad erhalten ((Nach 179 ° 178..160..150 gehen und so weiter.

muss ich auf 360 Grad drehen . Wie kann ich es tun Was ist los

maby das hilft:?

//Tells the receiver when one or more fingers associated with an event move within a view or window. 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSArray *Touches = [touches allObjects]; 
    UITouch *first = [Touches objectAtIndex:0]; 

    CGPoint b = [first previousLocationInView:[self imgView]]; //prewious position 
    CGPoint c = [first locationInView:[self imgView]];   //current position 

    CGFloat rad1 = angleBetweenLinesInRadians2(center, b); //first angel 
    CGFloat rad2 = angleBetweenLinesInRadians2(center, c); //second angel 

    CGFloat radAngle = fabs(rad2 - rad1);   //angel between two lines 
    if (tempCount <= gradus) 
    { 
     [imgView setTransform: CGAffineTransformRotate([imgView transform], radAngle)]; 
     tempCount += radAngle; 
    } 

} 

Antwort

5

Entfernen Sie den fabs Anruf und es einfach machen:

CGFloat rads = atan2(dy, dx); 
+0

Ich versuche es nicht funktionieren – yozhik

+0

@yozhik: Vielleicht sollten Sie ex klar, was nicht funktioniert. Was ist das erwartete Ergebnis und was siehst du? – casablanca

+0

Ich habe ein Dekart-Koordinatensystem. Auf dem ich Bild beziehe. Es gibt eine Imaging-Null. Wenn ich mein Bild in den oberen 180 Grad nehme und bewege - alles in Bewegung. Wenn ich versuche, Ander 180 Grad zu bewegen, zum Beispiel 190 - zeigt es mir 170 Grad. Ich brauche das dort wo 190 Grad sind. Sie sehen ... – yozhik

7

atan2 liefert Ergebnisse in [-180.180] (oder -pi, pi in Radiant) Um die Ergebnisse von 0360 Gebrauch.:

float radians = atan2(dy, dx); 
if (radians < 0) { 
    radians = TWO_PI + radians; 
} 

Es sollte beachtet werden, dass es typisch ist, Drehungen in [-pi, pi] zum Ausdruck bringen und auf diese Weise können Sie einfach das Ergebnis von atan2 nutzen, ohne sich um das Zeichen besorgniserregend.

+0

funktionieren nicht – yozhik

+0

:(ich meine Frage bearbeitet, maby es, was ist falsch. Erhalten hilft – yozhik

+0

Was didn Ich nehme an, Sie haben eine richtige Konstante für 'TWO_PI' ebenfalls ersetzt. –

0

Mit dieser Funktion können in Swift. Dadurch wird sichergestellt, dass der Winkel von "fromPoint" zu "toPoint" zwischen 0 und < 360 (nicht 360) liegt. Beachten Sie, dass die folgende Funktion davon ausgeht, dass sich CGPointZero in der oberen linken Ecke befindet.

func getAngle(fromPoint: CGPoint, toPoint: CGPoint) -> CGFloat { 
    let dx: CGFloat = fromPoint.x - toPoint.x 
    let dy: CGFloat = fromPoint.y - toPoint.y 
    let twoPi: CGFloat = 2 * CGFloat(M_PI) 
    let radians: CGFloat = (atan2(dy, -dx) + twoPi) % twoPi 
    return radians * 360/twoPi 
} 

Für den Fall, dass der Ursprung in der linken unteren Ecke ist

let twoPi = 2 * Float(M_PI) 
let radians = (atan2(-dy, -dx) + twoPi) % twoPi 
let angle = radians * 360/twoPi 
Verwandte Themen