我如何得到两个平面之间的正确角度?



在这里输入图像描述这是很好的记录,为了找到两个平面之间的交角,我们使用垂直于每个平面的法向量的点积-然后给出角度的余弦值。我试着编写这个程序,但意识到在某些情况下,计算结果是补而不是交点本身的角度。下面的两个示例代码显示了这一点:

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中相同的方向(正负),则:angle = acos(dot(n1, n2)/(norm(v1) * norm(v2)))) * 180/pi

我已经用几个例子测试了这个,我确信这个约定在所有情况下都能工作。我也非常肯定,这将是一些有用的许多人在那里。然而,对我来说,bug问题是如何编程。任何意见/帮助/建议都将不胜感激。谢谢!

两个平面形成两对角(a, Pi-a, a, Pi-a)。当然,他们都是正确的。arcos方法给出了0到Pi范围内的角

如果你有取向的平面,由法线方向定义,你可以在-Pi范围内计算角度。使用函数:

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

注意这个角的符号取决于法向量的阶数!

Delphi示例为您的2D数据给出

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]));

相关内容

最新更新