2D 欧几里得向量旋转
我有一个欧几里得向量 a
位于坐标 (0, 1)
处。 我想围绕原点 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;
使用上述代码,angle
值为 90.0 度,所得坐标为:(-1, 1)
。 我真的很困惑。 以下链接中看到的示例肯定代表上面显示的相同公式吗?
我做错了什么? 或者我是否误解了矢量如何旋转?
I have a euclidean vector a
sitting at the coordinates (0, 1)
.
I want to rotate a
by 90 degrees (clockwise) around the origin: (0, 0)
.
If I have a proper understanding of how this should work, the resultant (x, y) coordinates after the rotation should be (1, 0)
.
If I were to rotate it by 45 degrees (still clockwise) instead, I would have expected the resultant coordinates to be (0.707, 0.707)
.
theta = deg2rad(angle);
cs = cos(theta);
sn = sin(theta);
x = x * cs - y * sn;
y = x * sn + y * cs;
Using the above code, with an angle
value of 90.0 degrees, the resultant coordinates are: (-1, 1)
.
And I am so damn confused.
The examples seen in the following links represent the same formula shown above surely?
What have I done wrong?
Or have I misunderstood how a vector is to be rotated?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
将矢量旋转 90 度特别简单。
(x, y)
绕(0, 0)
旋转90度为(-y, x)
。如果您想顺时针旋转,只需以相反的方式进行即可,得到
(y, -x)
。Rotating a vector 90 degrees is particularily simple.
(x, y)
rotated 90 degrees around(0, 0)
is(-y, x)
.If you want to rotate clockwise, you simply do it the other way around, getting
(y, -x)
.您应该从函数中删除变量:
创建新坐标变为,以避免在到达第二行之前计算 x:
you should remove the vars from the function:
create new coordinates becomes, to avoid calculation of x before it reaches the second line:
围绕 0,0 旋转 90 度:
围绕 px,py 旋转 90 度:
Rotate by 90 degress around 0,0:
Rotate by 90 degress around px,py:
听起来使用标准类更容易做到:
向量旋转是复数乘法的子集。要旋转角度
alpha
,请乘以std::complex{ cos(alpha), sin(alpha) }
Sounds easier to do with the standard classes:
Vector rotation is a subset of complex multiplication. To rotate over an angle
alpha
, you multiply bystd::complex<double> { cos(alpha), sin(alpha) }
您正在根据新坐标的“新”x 部分计算新坐标的 y 部分。基本上,这意味着您根据新输出计算新输出...
尝试根据输入和输出重写:
然后您可以执行以下操作:
注意如何为变量选择正确的名称可以完全避免此问题!
You're calculating the y-part of your new coordinate based on the 'new' x-part of the new coordinate. Basically this means your calculating the new output in terms of the new output...
Try to rewrite in terms of input and output:
Then you can do this:
Note how choosing proper names for your variables can avoid this problem alltogether!