2011-01-24 78 views
39

我坐在座標(0, 1)座標的歐美矢量a。 我想圍繞原點旋轉a 90度(順時針):(0, 0)二維歐幾里德矢量旋轉

如果我對這應該如何工作有一個正確的理解,旋轉後的結果(x,y)座標應該是(1, 0)。 如果我要將它旋轉45度(仍然是順時針),那麼我會期望得到的座標爲(0.707, 0.707)

theta = deg2rad(angle); 

cs = cos(theta); 
sn = sin(theta); 

x = x * cs - y * sn; 
y = x * sn + y * cs; 

使用上述代碼,以90.0度的angle值,所得到的座標爲:(-1, 1)。 而我非常困惑。 在以下鏈接中看到的例子肯定表示上面顯示的相同公式嗎?

我做錯了什麼? 或者我誤解了一個矢量是如何旋轉的?

+0

所有變量的類型是什麼? – 2011-01-24 08:55:34

+0

雙打,但答案很簡單,謝謝卡斯帕。 – dcousens 2011-01-24 09:04:32

+0

另外 - 這不是逆時針嗎? – 2015-11-08 17:47:38

回答

63

您應該從功能刪除VARS:

x = x * cs - y * sn; // now x is something different than original vector x 
y = x * sn + y * cs; 

創建新座標變,以避免x的計算到達第二行之前:

px = x * cs - y * sn; 
py = x * sn + y * cs; 
+3

哦,上帝,我需要新鮮的眼睛...再次的東西如此明顯......感謝隊友(作品漂亮,2小時後...哈哈) – dcousens 2011-01-24 08:59:31

68

旋轉的矢量90度是特別簡單。

(x, y)圍繞(0, 0)旋轉90度是(-y, x)

如果你想順時針旋轉,你只需要反過來,得到(y, -x)

5

您正在計算基於新座標的「新」x部分的新座標的y部分。基本上,這意味着你的計算新的輸出方面新的輸出...

嘗試在輸入和輸出方面重新改寫:

vector2<double> multiply(vector2<double> input, double cs, double sn) { 
    vector2<double> result; 
    result.x = input.x * cs - input.y * sn; 
    result.y = input.x * sn + input.y * cs; 
    return result; 
} 

然後,你可以這樣做:

vector2<double> input(0,1); 
vector2<double> transformed = multiply(input, cs, sn); 

請注意,如何爲變量選擇正確的名稱可以避免這個問題!

5

聽起來很容易做到與標準類:

std::complex<double> vecA(0,1); 
std::complex<double> i(0,1); // 90 degrees 
std::complex<double> r45(sqrt(2.0),sqrt(2.0)); 
vecA *= i; 
vecA *= r45; 

矢量旋轉是複數乘法的一個子集..

17

旋轉90個輩分周圍0,0:

x' = -y 
y' = x 

圍繞px旋轉90度,py:

x' = -(y - py) + px 
y' = (x - px) + py