i有一个欧几里得矢量
a
坐在坐标(0, 1)
。
我想围绕原点旋转90度(顺时针):a
。
如果我对它的工作原理有正确的了解,则旋转后的结果(x,y)应为
(0, 0)
。
如果我将其旋转45度(仍然顺时针顺时针),我本来可以预计结果坐标为(1, 0)
.。
(0.707, 0.707)
通过上述代码为90.0度的值,结果坐标为:theta = deg2rad(angle);
cs = cos(theta);
sn = sin(theta);
x = x * cs - y * sn;
y = x * sn + y * cs;
。
我很困惑。
以下链接中看到的示例表示上面显示的相同公式?
我做错了什么? 还是我误解了如何旋转向量?
旋转向量90度非常简单。
angle
周围旋转90度
(-1, 1)
(x, y)
。
如果您想顺时针旋转,则只需以相反的方式进行操作,然后获得(0, 0)
。
您应该从函数中删除var:
(-y, x)
创建新坐标,以避免在x到达第二行之前计算x:
(y, -x)
x = x * cs - y * sn; // now x is something different than original vector x
y = x * sn + y * cs;
在px周围呈90度,py:
px = x * cs - y * sn;
py = x * sn + y * cs;
x' = -y
y' = x
矢量旋转是复杂乘法的子集。要旋转角度
x' = -(y - py) + px
y' = (x - px) + py
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;
您根据新坐标的“新” X部分计算新坐标的Y部分。 基本上,这意味着您根据新输出来计算新输出...
trory以输入和输出来重写:alpha
然后您可以这样做:
std::complex<double> { cos(alpha), sin(alpha) }
注意如何为您的变量选择专有名称可以避免此问题!