2d欧几里得矢量旋转

问题描述 投票:0回答:5

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)
c++ math vector rotation trigonometry
5个回答
117
投票
(x, y)

如果您想顺时针旋转,则只需以相反的方式进行操作,然后获得

(0, 0)

您应该从函数中删除var:
(-y, x)

创建新坐标,以避免在x到达第二行之前计算x:

(y, -x)


96
投票
在0,0左右的rotate 90 dgress:

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;
    

25
投票
易于完成标准类:

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;

7
投票

您根据新坐标的“新” X部分计算新坐标的Y部分。 基本上,这意味着您根据新输出来计算新输出...

trory以输入和输出来重写:
alpha

然后您可以这样做:
std::complex<double> { cos(alpha), sin(alpha) }

注意如何为您的变量选择专有名称可以避免此问题!

6
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.