2012-03-26 71 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。我可以建议你逐渐使用手指的位置找到角度,而不是刚开始和结束的位置。

即使您决定不实际旋转图形(以减少计算),仍可以显示倾斜的线条/方框/数字,以指示软件已注册的倾斜。