2011-07-22 11 views
0

私はいくつかの基本的なレイトレーシングを試みていますが、私は2Dグラジエント(dybydxと呼ばれています)を持っています。私は、0.5,0.5の正方形の中心から辿り、勾配に垂直な追加の痕跡を設定して観測フィールドを増やしたいと考えています(~< 0.5)。私はかなりfpの算術演算に新しいです、これは私がデバッグするときに頭が引っかかる原因になります。任意のグラデーションを90度回転させるアルゴリズム

私は次のコードは、残りの部分を説明願っています:

 if (incX) { 
     if (incY) { 
      if (cclockwise) { 
       x -= System::Math::Sin(theta)/2; 
       y += System::Math::Cos(theta)/2; 
      } else { 
       x += System::Math::Sin(theta)/2; 
       y -= System::Math::Cos(theta)/2; 
      } 
     } else { 
      if (cclockwise) { 
       x += System::Math::Cos(theta)/2; 
       y += System::Math::Sin(theta)/2; 
      } else { 
       x -= System::Math::Cos(theta)/2; 
       y -= System::Math::Sin(theta)/2; 
      } 
     } 
    } else { 
     if (incY) { 
      if (cclockwise) { 
       x -= System::Math::Cos(theta)/2; 
       y -= System::Math::Sin(theta)/2; 
      } else { 
       x += System::Math::Cos(theta)/2; 
       y += System::Math::Sin(theta)/2; 
      } 
     } else { 
      if (cclockwise) { 
       x += System::Math::Sin(theta)/2; 
       y -= System::Math::Cos(theta)/2; 
      } else { 
       x -= System::Math::Sin(theta)/2; 
       y += System::Math::Cos(theta)/2; 
      } 
     } 
    } 

私は紙の上でのラウンドと象限ラウンドしてきたが、私はWindowsは、従来のy軸を逆に忘れてしまった(私は時計回りISN」だと思ったので、何tですが、これは任意のエラーであり、重要ではありません)。私が本当に好きなのは、グラデーションを90度回転させることはできません。ありがとう。

編集 - thetaは、グラデーションが(用紙上で)作る水平から水平方向の角度です。

edit_incXとincYは、元のグラデーション(実際には本当に)がXとYでそれぞれ増加していることを意味します。

+0

[Rotation matrix](http://ja.wikipedia.org/wiki/Rotation_matrix)は、問題の出発点です。 –

+0

...それはまさに@dario_ramosの機能です。ところで、[剪定、拡大縮小または反映する行列](http://ja.wikipedia.org/wiki/Transformation_matrix)ベクトルもあります。 –

答えて

2

一般式は以下のとおりです。

x' = x cos(theta) - y sin(theta) 
y' = x sin(theta) + y cos(theta) 

あなたはオリエンテーションのためのフラグを使用する必要はありません:それは時計回りまたは反時計回りであるという事実は、シータの符号で表され、あなたはそれを定義します。たとえば、正のθは反時計回りを意味すると定義します。数式は両方の場合を考慮します

編集: 90度回転させたい場合はyi_Hの解決策を選択してください。あなたは@dario_ramosで90度をsubstitue場合のcos()と罪()は、比較

+0

thetaは私の元の勾配の角度です、私はあなたが90 /回転を加えるためにpi/2を追加/減算する必要があると思いますか? – John

+0

これをベクトルの回転とみなしてください。グラデーションであるという事実はここでは重要ではありません。必要に応じてtheta = pi/2または-pi/2を使って、勾配ベクトルに式を適用してください。 –

+0

ところで、私はあなたにVectorクラスを書き、Rotateメソッドを使って再利用することをお勧めします。それはあなたのコードを明確にする –

5

にCPU-高価であるためには、より効率的なあなたが得る方程式です:

ところで
x' = -y 
y' = x 

あなたが確認でこれを描く場合あなたはなぜそんなに些細なのか分かりません。

関連する問題