Как найти угол между двумя парами точек?

Я делаю поддержку мультитач, которая позволяет вращать фотографии двумя пальцами. Есть четыре точки: 2 для предыдущих пальцев и 2 для текущих позиций пальцев.

Я вычислил новую точку, вычитая 2 предыдущих пальца, а вторую новую точку вычислил, вычитая 2 других текущих пальца.

Затем я вычисляю угол следующим образом:

радиан1 = атан ( p1.y / p1.x ); радиан2 = атан ( 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);

Выглядит нормально. но это немного медленно, когда я пытаюсь повернуть изображение


person LittleFunny    schedule 26.03.2012    source источник
comment
Взгляните на эту ссылку в Википедии, которая определенно поможет вам. en.wikipedia.org/wiki/Rotation_(математика)   -  person Surya    schedule 27.03.2012


Ответы (2)


Чистый способ сделать это — использовать формулы вычитания углов, чтобы получить значения, пропорциональные синусу и косинусу разности углов, и использовать 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)), который вы сможете использовать более непосредственно.

person comingstorm    schedule 26.03.2012

Arc тангенс карты между 0 и пи. 270 соответствует 3/2 * пи и будет складываться в пи. Могу ли я предложить вам постепенно находить угол, используя положения пальцев, а не только начальное и конечное положения.

Даже если вы решите не поворачивать фигуру на самом деле (чтобы сократить объем вычислений), вы все равно можете отобразить наклонную линию / квадрат / число, чтобы указать наклон, зарегистрированный программой.

person Lord Loh.    schedule 26.03.2012