所有
假设我有两个矢量U和V,分别为2个单位和1个单位长度,如草图所示。矢量U旋转了角度θ。
至少有两种可能的情况,即矢量U可以“向上”或“向下”,如草图所示。
我的问题是,拥有上述数据集是否可以将一个通用公式转换为Matlab以获得M点的坐标?
矢量U和V的长度以及角度θ是任意的。
谢谢!
答案 0 :(得分:2)
有一种更有效的解决方案。
U
端点的坐标由下式给出:
(U * cos(theta), U * sin(theta))
对于任何向量(x, y)
,顺时针垂直方向(即第二个图“向下”)是(y, -x)
,而逆时针方向} em>方向是减去这些。因此M
的坐标由下式给出:
逆时针(“向上”):(U * cos(theta) - M * sin(theta), U * sin(theta) + M * cos(theta))
顺时针(“向下”):(U * cos(theta) + M * sin(theta), U * sin(theta) - M * cos(theta))
无需拨打arctan
或sqrt
这些费用非常高昂。您也可以只计算一次sin/cos
并将结果用于两个组件。
答案 1 :(得分:1)
来自Pythogoras我们知道
M = sqrt(U ^ 2 + V ^ 2)
M和U之间的角度是
alpha = arctan(V / U)
那么你就知道M的x坐标和y坐标是:
“up”案例:
M =(sqrt(U ^ 2 + V ^ 2)* cos(theta + sign(cosd(theta))* arctan(V / U)),sqrt(U ^ 2 + V ^ 2)* sin( theta + sign(cosd(theta))* arctan(V / U)))
“向下”案件:
M =(sqrt(U ^ 2 + V ^ 2)* cos(theta - sign(cosd(theta))* arctan(V / U)),sqrt(U ^ 2 + V ^ 2)* sin( theta - sign(cosd(theta))* arctan(V / U)))
另一种计算方法是在x和y方向上添加U
和V
的长度,并将它们相加。
U的坐标为:
(U cos(theta),U sin(theta))
对于这个坐标,我们必须加上/减去V的x和y坐标。沿x和y的V长度为:
(abs(sin(theta)),abs(cos(theta))
是否应该从U中添加或减去这些取决于theta。一般来说,我们可以将Vup和Vdown写为
Vup =(V * sign(-cos(theta)) sin(theta),V 符号(cos(theta))* cos(theta))
Vdown =(V * sign(cos(theta)) sin(theta),V 符号(-cos(theta))* cos(theta))
然后我们总是可以将U添加到Vup和Vdown。最后
Mup = U + Vup
Mdown = U + Vdown
答案 2 :(得分:1)
只是另一个紧凑的解决方案
theta = 30;
L = 2; % norm of U vector
U = L*[cosd(theta) ; sind(theta)];
Vup = [-U(2) ; U(1)] / L; % Normal vectors, unit length
Vdown = [U(2) ; -U(1)] / L;
Mup = U + Vup; % Two possible values of M
Mdown = U + Vdown;
% Bonus plot
figure
plot([0 U(1)] , [0 U(2)] , 'k-')
hold on; axis equal;
plot([0 Vup(1)]+U(1) , [0 Vup(2)]+U(2) , 'r-')
plot([0 Vdown(1)]+U(1) , [0 Vdown(2)]+U(2) , 'r-')
text(Mup(1),Mup(2),'M_u_p')
text(Mdown(1),Mdown(2),'M_d_o_w_n')
答案 3 :(得分:-1)
您可以利用Uinit
和Urot
的叉积的属性。产品的标志将告知您生成的矢量的方向。
假设原点为O(0,0)
,您的初始向量为Uinit(x1,y1)
,最终向量为Urot(x2,y2)
。此外,M(x,y)
也可轻松计算。
如果要过滤最终在'上方'或'下方'Urot
上方的旋转矢量M
与三角形的上一个方向相比较,您可以采用以下交叉产品:
M cross Uinit
和M cross Urot
。
如果它们的符号相同,那么得到的旋转矢量不会越过OM线,如果符号不同则相反。