Math 如何找到两对点之间的角度?

Math 如何找到两对点之间的角度?,math,rotation,multi-touch,angle,Math,Rotation,Multi Touch,Angle,我正在做一些多点触摸支持,允许两个手指旋转一张照片。共有四个点:前一个手指2点,当前手指位置2点 我通过减去前两个手指计算出一个新点,第二个新点是通过减去另外两个当前手指计算出来的 然后,我这样计算角度: 弧度1=atan(p1.y/p1.x); 弧度2=atan(p2.y/p2.x) 我减去弧度2和弧度1得到最终的角度 问题是,我可以漂亮地旋转图像,但有时如果我旋转到某个位置,照片会被翻转,例如,一张应该是270度的照片,但它翻转了90度 这是我根据以下回复编写的javascript: va

我正在做一些多点触摸支持,允许两个手指旋转一张照片。共有四个点:前一个手指2点,当前手指位置2点

我通过减去前两个手指计算出一个新点,第二个新点是通过减去另外两个当前手指计算出来的

然后,我这样计算角度:

弧度1=atan(p1.y/p1.x); 弧度2=atan(p2.y/p2.x)

我减去弧度2和弧度1得到最终的角度

问题是,我可以漂亮地旋转图像,但有时如果我旋转到某个位置,照片会被翻转,例如,一张应该是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和pi之间旋转图像时,速度有点慢。270对应于3/2*pi,并将折叠为pi。我建议你用手指的位置,而不仅仅是开始和结束的位置,逐渐地找到角度


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

执行此操作的干净方法是使用角度减法公式获得与差分角度的正弦和余弦成比例的值,并使用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))
,您可以更直接地使用它。

看看这个维基百科链接,它肯定会对您有所帮助。