我正在尝试使用矢量数据来计算两个矢量之间的角度。我正在使用atan2,它在x平面上运行,但我想从y平面上移除点。
如何旋转数据以便我的y平面是我的x平面,进行分析,然后再旋转?我已经为我的分析进行了计算,只是不知道如何在保留每个位置的同时旋转矢量数据。
答案 0 :(得分:6)
假设您的数据点位于N x 3
矩阵中,其中N
是您拥有的总点数,只需将rotation matrix应用于每个点。
您可以通过执行非常简单的矩阵乘法来旋转点。给定一个点作为3元素列向量X
,输出点X'
就是:
X' = R*X
R
是一个旋转矩阵。根据您想要相对于哪个轴旋转,有三个旋转矩阵。在您的情况下,您希望绕x
- 轴顺时针旋转90度。这里给出了围绕逆时针方向围绕每个轴旋转的一般形式:
来源:Wikipedia
在您的情况下,您需要第一个矩阵。因为您想要顺时针旋转90度,您可以指定角度为-90度。因此,为x
- 轴构造旋转矩阵,如下所示:
R = [1 0 0; 0 cosd(-90) -sind(-90); 0 sind(-90) cosd(-90)];
此外,cos(90) = 0
和sin(-90) = -1
假定为度数,因此这实际上简化为:
R =
1 0 0
0 0 1
0 -1 0
要撤消您所做的旋转,只需应用90度逆时针旋转,因此将90度替换为上述表达式。这样做可以让我们:
R =
1 0 0
0 0 -1
0 1 0
但是,您的积分位于N x 3
矩阵中。我们希望将每个列表示为一个点,因此您需要做的是转置您的矩阵,然后进行乘法,然后转置回(如果需要)。假设您的积分存储在X
中,请执行以下操作:
R = [1 0 0; 0 cosd(-90) -sind(-90); 0 sind(-90) cosd(-90)];
Xrotate = (R*X.').';
Xrotate
将包含一个N x 3
矩阵,其中包含您的旋转点数。给定原始X
矩阵中的源点,每列将是一个旋转点。应该注意的是X
的每一行都会被旋转并放入Xrotate
中的一列中,我们需要调整此结果以使其恢复为X
的形状。进行处理,当你准备就绪时,你可以回转你的积分。假设Xrotate
为N x 3
,只需执行以下操作:
R2 = [1 0 0; 0 cosd(90); -sind(90); 0 sind(90); cosd(90)];
Xout = (R2*Xrotate.').';
Xout
包含旋转并重新转换回来,以便每行都是一个点,每列都是一个维度。
答案 1 :(得分:-1)
无论如何,计算2个向量之间角度的最佳方法是使用点积:u·v = norm(u,2)* norm(v,2)* cos(angle)
你可以用这种方式快速计算它。你是2次和3次乘法,并且norm函数有3次乘法,2次求和和一个平方根,以及acos()之前的2个除法。将它们计算为20次操作以获得角度,比将矩阵乘以向量,改变坐标系统,应用您正在尝试的操作要好得多......
答案 2 :(得分:-1)
引自the manual:
语法
rotate(h,direction,alpha) rotate(...,origin)
描述
旋转功能以三维方式旋转图形对象 空间。
rotate(h,direction,alpha)
将图形对象h
旋转alpha
度。direction
是描述的两元素或三元素向量 旋转轴与轴的原点一起 回转。旋转轴的默认原点是 情节框。这一点不一定是轴的起源。正面
alpha
被定义为右边的规则角度 方向矢量,因为它从旋转原点延伸。如果
h
是句柄数组,则所有对象都必须是子句的子句 相同的轴。
rotate(...,origin)
指定旋转轴的原点为a 三元素向量[x0,y0,z0]。