2012-01-09 11 views
4

私は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); 
... 
+0

だけXを交換し、Yは – yas4891

答えて

4

ですさて、あなたのオブジェクトは、いくつかの開始座標(x、y)^ Tで表されます。 2D空間で、あなたはまた、翻訳T(正弦波に沿って移動する)を実行するので、あなたはあなたの2Dを拡張したアフィン変換を行うことができ、回転行列

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

を使用することを回転させるために3次元同次座標に座標変換する。あなたの翻訳が(ラジアン)(TX、TY)と回転のあなたの角度であり、あなたのオリジナルの点(x、y)は(x、yに変換すると、変換行列が

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

になりますとなりますと仮定、1)単純です

T * (x,y,1)^t 

トリックを行います。

すべての要素を最後の要素で分割する(つまり、1つの次元が緩くなる)ことによって、均質からデカルト座標に戻ることができます。この単純なケースでは常に1になっているので、最後の座標を削除して2Dに戻ります。

編集: Mulitplying 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 
+0

「SIN(A)COS(A値90度反時計回りに回転させます)はsin(a)にcos(a)を乗じたものですか? –

+0

いいえ、Tは3行3列の行列です。ここを見てください:http://ja.wikipedia.org/wiki/Matrix_multiplication –

+0

私は数学を含めるために私の答えを編集しました(注意^ tは "転置"を意味します) –

関連する問題