2012-03-26 37 views
2

我正在做一些允許2個手指旋轉照片的多點觸控支持。有四點:前手指2點,當前手指位置2點。如何找到2對點之間的角度?

我通過減去前兩個手指來計算一個新點,並且通過減去另外兩個當前手指來計算第二個新點。

然後,我計算這樣的角度:

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

我減去radian2和radian1得到最終的角度。

問題是我可以旋轉圖像很漂亮,但有時如果我旋轉到某些位置照片翻轉例如一張照片應該在270度,但它翻轉並出現在90度。

這是我根據下面的書面答覆的JavaScript:

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

是尋找確定。但是當我嘗試旋轉圖像時,速度很慢

+0

看看這個維基百科鏈接,這一定會對你有所幫助。 http://en.wikipedia.org/wiki/Rotation_(mathematics) – Surya 2012-03-27 13:27:03

回答

1

乾淨的方式做,這是使用角度,減法公式得到成正比的差角的正弦和餘弦值,並利用ATAN()只有一次:

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) 

另外,如果你想旋轉圖像的結果,您可能不需要將(c12,s12)轉換爲一個角度,無論如何:最終,您的圖像旋轉器將使用具有所得旋轉角度的正弦和餘弦的矩陣。通過​​(c12,s12),您將最終得到(cos(a12), sin(a12)),您可能會更直接地使用它。

0

0到pi之間的圓弧圖。 270對應於3/2 * pi並將摺疊到pi。我可以建議你逐漸使用手指的位置找到角度,而不是剛開始和結束的位置。

即使您決定不實際旋轉圖形(以減少計算),仍可以顯示傾斜的線條/方框/數字,以指示軟件已註冊的傾斜。