Как вращать синусоиду на оси - PullRequest
4 голосов
/ 09 января 2012

Я программирую игру в 2D.Что я достиг, так это переместил спрайт на основе пользовательского пути.Путь может быть представлен математически как: y = sin (x). Так что движение является волной.Я хочу повернуть эту волну таким образом, чтобы движение было не горизонтальным, а вертикальным или с некоторым произвольным углом относительно исходного положения.Я немного слаб с математикой.Сожалею.Любой может помочь.Мой код это

for (int i=0; i<300; i++) {
  coordinatesX[i] = i;
  coordinatesY[i] = (float) (50 * Math.sin(coordinatesX[i]));
}

createpath (coordinatesX, coordinatesY);
...

1 Ответ

4 голосов
/ 09 января 2012

Ну, ваш объект представлен некоторыми начальными координатами (x, y) ^ t.Чтобы повернуть это в 2D-пространстве, вы должны использовать матрицу вращения

R = [ cos(a) -sin(a)]
    [ sin(a) cos(a) ]

Поскольку вы также хотите выполнить перевод T (перемещение по синусоиде), вы можете создать аффинное преобразование, расширяяваши 2D координаты в 3D однородные координаты.Предположим, что ваш перевод будет (tx, ty) и ваш угол поворота (в радианах) равен a, матрица преобразования будет

T = [ cos(a) -sin(a) tx
      sin(a) cos(a)  ty 
       0       0     1 ]

Когда вы преобразуете свою исходную (x, y) точку в (x, у, 1) простое

 T * (x,y,1)^t

сделает свое дело.

Вы можете вернуться от однородных к декартовым координатам, разделив все элементы на последний (т.е. вы потеряете одно измерение).Так как в этом простом случае они всегда равны 1, вы можете просто отбросить последнюю координату и вернуться в 2D.

Редактировать: множители T и (x, y, 1) ^ t дают:

T*(x,y,1)^t = [ cos(a) -sin(a) tx ] [ x ]
              [ sin(a) cos(a)  ty ]*[ y ]  =
              [   0      0      1 ] [ 1 ] 

             = [ cos(a)*x - sin(a)*y + tx ]
               [ sin(a)*x + cos(a)*y + ty ] = 
               [           1              ] 

             = (cos(a)*x - sin(a)*y + tx, sin(a)*x + cos(a)*y + ty, 1)^t
...