Координаты мыши и вращение - PullRequest
1 голос
/ 04 июня 2010

Как бы вы подошли к отображению координат мыши в мировых координатах в 2d контексте?

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

Есть идеи?

В данный момент пытаемся повернуть координаты мыши примерно так:

mouseX = ((mouseX*Math.cos(rotation*180/Math.PI))-(mouseY*Math.sin(rotation*180/Math.PI))),
mouseY = ((mouseX*Math.sin(rotation*180/Math.PI))+(mouseY*Math.cos(rotation*180/Math.PI)))

Но, похоже, это не работает ...

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

Это потому, что перевод выполняется до поворота. Позвольте мне объяснить это немного:

O=====>     (translate X)
      |     (translate Y)
      |
      x     (location)

Когда вы вращаете этот объект, вы поворачиваете переводы вместе с ним:

      O     
      |     
      |     (translate X)
      |
      |
   x==<     (translate Y & location)

Чтобы решить это; сначала вы должны повернуть объект, когда он находится в его источнике, а затем перевести.

Вращение объекта, вероятно, также будет вращать перевод этого объекта (встроенный), поэтому вам придется повернуть вспять «перевод», чтобы он получился в правильной точке, но с правильным вращением. *

translate ---> rotate ---> inverse-translate

Для этого;

x = x * cos(-rot) - y * sin(-rot)
y = x * sin(-rot) + y * cos(-rot)

Где rot в радианах.

1 голос
/ 07 января 2011

Преобразование градуса в радианы должно составлять

double angle = (double) angleOfRotation / (double)180 * 3.14;
1 голос
/ 04 июня 2010

У вас есть какое-то изображение, которое живет в мировых координатах, и вы применяете к нему аффинное преобразование (композиция вращений, переводов и масштабирования), чтобы получить то, как оно выглядит на экране:

Мир ------- [аффинное преобразование] -------> Экран

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

Если ваше преобразование является просто вращением, как в вашем фрагменте кода, отрицательное значение rotation поможет.

Как правило, вы хотите представить свое преобразование и его инверсию в виде матриц 3x3 A и A ^ -1. Если W и S - аффинные координаты мира и экрана, у вас есть S = AW и W = A ^ 1 S.

Чтобы добавить еще одно преобразование T в A, умножьте A слева на T и A ^ -1 справа на T ^ -1:

A = TA
A^-1 = A^-1 T^-1
...