【问题标题】:How do I obtain the correct angle between two planes?如何获得两个平面之间的正确角度?
【发布时间】:2016-11-05 01:19:09
【问题描述】:

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)。然后:角度 = 180 -(acos(dot(n1, n2) / (norm(v1) * norm(v2)))) * 180/pi。但是,如果 n1 和 n2 都指向同一个方向(正或负),如图所示。 B、则:角度 = acos(dot(n1, n2) / (norm(v1) * norm(v2)))) * 180/pi

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

【问题讨论】:

  • 你能给出输出与预期输出的对比吗?

标签: matlab geometry linear-algebra


【解决方案1】:

两个平面形成两对角(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]));

【讨论】:

  • @Eli Sadoff:第一个答案是 45 度。而第二个应该是 63.4349 度,但返回 116.5651
  • 感谢您的评论@MBo,但仍然分别返回相同的 45 度和 116.5651 度。我知道我可以轻松地从 180 中减去 116.5651 以获得正确的结果。但是,如果有人要使用我的代码怎么办?
  • 谢谢@MBo。这显然不是 matlab 代码,虽然我可以在 Matlab 中重现大部分代码,除了最后一行(以及第 9 行中的对应部分),我仍然得到与我的代码相同的答案。请问,我这里有什么遗漏吗?
  • 您似乎用自己的规则解释了“角度之间”,它们确实与共同协议不同
  • 嗯,这些不是正确的计算。就像我之前说的,答案是 45 度。和 63.4 度。你只是得到了第二个的补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2021-11-03
  • 2019-09-28
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多