2012-03-26 12 views
2

Ich mache einige Multitouch-Unterstützung, die 2 Finger erlauben, Fotos zu drehen. Es gibt vier Punkte: 2 für vorherige Finger und 2 für aktuelle Fingerpositionen.Wie finde ich den Winkel zwischen 2 Punktpaaren?

Ich berechnete einen neuen Punkt durch Subtraktion der 2 vorherigen Finger, und der zweite neue Punkt wurde berechnet, indem die anderen 2 aktuellen Finger subtrahiert wurden.

Dann berechne ich die Winkel wie folgt aus:

radian1 = atan (p1.y/P1.x); radian2 = atan (p2.y/p2.x);

Ich subtrahiere radian2 und radian1, um den endgültigen Winkel zu erhalten.

Das Problem ist, dass ich das Bild schön drehen kann, aber irgendwann, wenn ich zu einer bestimmten Position rotiere, wurde das Foto z. ein Foto in 270 angenommen, aber es drehte und erschien in 90 Grad.

Dies ist Javascript ich nach der Antwort unten geschrieben haben:

var x1 = this.previousMousePoint.x * this.previousMousePoint2.x + this.previousMousePoint.y * this.previousMousePoint2.y; 
var y1 = this.previousMousePoint.x * this.previousMousePoint2.y - this.previousMousePoint.y * this.previousMousePoint2.x; 

var x2 = center.x * point.x + center.y * point.y; 
var y2 = center.x * point.y - center.y * point.x; 

var radian1 = Math.atan(y1/x1); 
var radian2 = Math.atan(y2/x2); 

this.anchor.matrix = this.anchor.matrix.rotate(radian2-radian1, pivot); 

Sucht ok

. aber es ist irgendwie langsam, wenn ich versuche, ein Bild zu drehen

+0

Werfen Sie einen Blick auf diesen Wikipedia-Link, der Ihnen auf jeden Fall helfen wird. http://en.wikipedia.org/wiki/Rotation_(mathematik) – Surya

Antwort

1

Der saubere Weg, dies zu tun, ist die Verwendung winkel Subtraktion Formeln Werte proportional zum Sinus und Kosinus des Differenzwinkels zu bekommen, und nur einmal atan() verwenden:

relevant formulas: 
    cos(a2 - a1) = cos(a1)*cos(a2) + sin(a1)*sin(a2) 
    sin(a2 - a1) = cos(a1)*sin(a2) - sin(a1)*cos(a2) 

    p1.x = cos(a1) * len(p1) 
    p1.y = sin(a1) * len(p1) 

    p2.x = cos(a2) * len(p2) 
    p2.y = sin(a2) * len(p2) 

-> angle-subtraction: compute values proportional to sin and cos of (a2 - a1) 
    c12 = p1.x*p2.x + p1.y*p2.y [ = len(p1)*len(p2) * cos(a2 - a1) ] 
    s12 = p1.x*p2.y - p1.y*p2.x [ = len(p1)*len(p2) * sin(a2 - a1) ] 

-> final result: find resulting difference angle a12 [ = a2 - a1 ] 
    a12 = atan(s12/c12) 
or (if you want a full 360-degree range): 
    a12 = atan2(s12, c12) 

Auch, wenn Sie wollen Um ein Bild mit dem Ergebnis zu drehen, müssen Sie möglicherweise (c12,s12) sowieso nicht in einen Winkel konvertieren: Ihr Bildrotator wird letztendlich eine Matrix mit den Sinus- und Kosinuskurven des resultierenden Rotationswinkels verwenden. Durch normalizing(c12,s12) werden Sie mit (cos(a12), sin(a12)) enden, die Sie möglicherweise direkter verwenden können.

0

Arc Tan maps zwischen 0 und Pi. 270 entspricht 3/2 * pi und wird auf pi umgefaltet. Darf ich vorschlagen, dass Sie den Winkel schrittweise anhand der Positionen der Finger finden, anstatt nur die Anfangspositionen und die Endpositionen zu wählen.

Auch wenn Sie sich entschließen, die Figur nicht zu drehen (um die Berechnung zu reduzieren), können Sie immer noch eine gekippte Linie/Box/Nummer anzeigen, um die von der Software registrierte Neigung anzuzeigen.