如何在轴上旋转正弦曲线

时间:2012-01-09 18:19:44

标签: android andengine

我正在编写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 个答案:

答案 0 :(得分:4)

嗯,您的对象用一些起始坐标(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,y,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