2011-07-22 59 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」噸,但這是一個任意的錯誤和不重要的)。我真正想要的是以任何方式將我的漸變旋轉90度的傻瓜式方法。謝謝。

edit - theta是從水平到+ ve軸的角度,即梯度在紙上產生的角度。

edit-- incX和incY表示原始漸變(真的,真的)在X和Y中分別增加。

+0

A [旋轉矩陣](http://en.wikipedia.org/wiki/Rotation_matrix)是您的問題的一個很好的起點。 –

+0

...這正是@dario_ramos所做的。順便說一下,還有[矩陣剪切,縮放或反射](http://en.wikipedia.org/wiki/Transformation_matrix)向量。 –

回答

2

的一般公式是:

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

你並不需要使用標誌的方向:一個事實,即它是順時針或逆時針theta的符號來表示,您可以定義。例如,定義一個正θ意味着反向旋轉。公式考慮兩種情況

編輯:如果您只希望旋轉90度,請使用yi_H的解決方案;它的效率更高,因爲COS()和sin()是CPU昂貴相比

+0

theta是我的原始漸變的角度,我想你是說我需要添加/減去pi/2來實現90'旋轉? – John

+0

把這看成是旋轉任何矢量。這是一個漸變的事實並不重要。根據需要將公式應用到梯度向量,其中theta = pi/2或-pi/2 –

+0

順便提一下,我建議您編寫一個Vector類,一個Rotate方法並重用它。它會使你的代碼更清晰 –

5

如果你substitue在@dario_ramos 90度方程你:

x' = -y 
y' = x 

順便說一句,如果你曾經得出這樣的一個檢查你會看到爲什麼它是如此微不足道。