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;
向量旋转是复数乘法的一个子集。