Как найти угол между 2 парами точек? - PullRequest
2 голосов
/ 27 марта 2012

У меня есть мультитач поддержка, которая позволяет 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);

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

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Простой способ сделать это - использовать формулы вычитания угла, чтобы получить значения, пропорциональные синусу и косинусу разностного угла, и использовать 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 голосов
/ 27 марта 2012

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

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

...