2D欧几里得vector旋转

我坐在坐标(0, 1)有一个欧几里得vector。 我想围绕原点旋转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; 

使用上面的代码, angle值为90.0度,结果坐标是: (-1, 1) 。 而我真是太糊涂了。 在下面的链接中看到的例子肯定表示上面显示的相同的公式?

我做错了什么? 还是我误解了一个vector是如何旋转的?

你应该从函数中删除variables:

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

创build新的坐标变成,避免在到达第二行之前计算x:

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

旋转vector90度非常简单。

(x, y)围绕(0, 0) (x, y)旋转90度为(-y, x)

如果你想顺时针旋转,你只需要反过来,得到(y, -x)

绕0,0旋转90度:

 x' = -y y' = x 

围绕px旋转90度,py:

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

您正在基于新坐标的“新”x部分计算新坐标的y部分。 基本上这意味着你计算新输出的新输出…

尝试根据input和输出重写:

 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 ); 

请注意,如何为variablesselect适当的名称可以避免这个问题!

听起来更容易做到标准的类:

 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; 

向量旋转是复数乘法的一个子集。