如何获得两架飞机之间的正确角度?

时间:2016-11-05 01:19:09

标签: matlab geometry linear-algebra

enter image description here有充分证据表明,为了找到两个平面之间的交叉角,我们使用垂直于每个平面的法向量的点积 - 然后给出角度的余弦。我试图对此进行编程,但意识到在某些情况下,计算结果是补充而不是交叉角本身。 以下是两个示例代码:

x = linspace(-10,20, 12)
y1 = (0*x) + 9
y2 = -x + 19

figure
k = plotyy(x,y1, x,y2);
set(k(2),'YDir','reverse')

%vectors and normal vectors 
n1 = [0, 1];
v1 = [1, 0];

n2 = [1, 1];
v2 = [1, -1];

angle = (acos(dot(v1, v2) / (norm(v1) * norm(v2))) * 180/pi)

第二个:

x = linspace(-10,10, 12);
y1 = -(0.5*x) + 1.333;

plot(x, y1); hold on

%2nd line
xd = 5;
plot(xd, x, 'o')

%vectors and normal vectors 
n1 = [0.5, 1]; v1 = [1, -0.5];
n2 = [-5, 0]; v2 = [0, 5];

angle = (acos(dot(v1, v2) / (norm(v1) * norm(v2))) * 180/pi)

请注意,第一个示例计算正确的角度(45度),但第二个示例计算补充量(116.5651度)。经过多次尝试破解这一点,我意识到如果一个法线指向正方向而另一个指向负方位(见图A)。然后:angle = 180 - (acos(dot(n1,n2)/(norm(v1)* norm(v2))))* 180 / pi。然而,如果n1和n2都指向相同的方向(正或负),如图2所示。 B,则:angle = acos(dot(n1,n2)/(norm(v1)* norm(v2))))* 180 / pi

我已经用几个例子对此进行了测试,我确信该约定适用于所有情况。我也非常确定这对那里的许多人都有用。然而,对我来说,问题在于如何对此进行编程。任何建议/帮助/建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

两个平面形成两对角度(a,Pi-a,a,Pi-a)。当然,所有这些都是正确的。并且arrcosine方法从0..Pi。

范围内的这些角度给出一个

如果你有定向平面,由法线方向定义,你可以使用函数计算正常方向之间的角度-Pi..Pi:

Angle = atan2(vectorproduct(normal1, normal2), dot(normal1, normal2))

请注意,此角度的符号取决于法线向量的顺序!

您的2D数据的Delphi示例

angle -45.00
angle 116.57

正如我对纸质草图所期望的那样 - 方法提供旋转v1以使其与v2

共线所需的角度
var
  an, v1x, v1y, v2x, v2y: Double;
begin
  v1x := 1;
  v1y := 0;
  v2x := 1;
  v2y := -1;
  an := RadToDeg(ArcTan2(v1x * v2y - v2x * v1y, v1x * v2x + v1y * v2y));
  Memo1.Lines.Add(Format('angle %5.2f', [an]));
  v1x := 1;
  v1y := -0.5;
  v2x := 0;
  v2y := 5;
  an := RadToDeg(ArcTan2(v1x * v2y - v2x * v1y, v1x * v2x + v1y * v2y));
  Memo1.Lines.Add(Format('angle %5.2f', [an]));