2016-11-05 250 views
0

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同时指向相同的方向(正向或负向),如图1所示。 B,然后:angle = acos(dot(n1,n2)/(norm(v1)* norm(v2))))* 180/pi

我已经用几个例子测试过了,将在所有情况下工作。我也非常肯定,这对一些很多人来说是有用的。尽管如此,对我来说,这个问题是如何编程的。任何建议/帮助/建议将非常感激。谢谢!

+0

你能给输出需要的角度与预期产出? –

回答

0

两个平面形成两对角度(a,Pi-a,a,Pi-a)。当然,它们都是正确的。并且arrcosine方法在范围0..Pi中从这些角度给出一个。

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

注意这个角度说符号取决于顺序:

如果你有面向飞机,正常的方向定义,你可以使用功能的正常方向之间的范围-Pi..Pi计算角度正常矢量!

德尔福例如,对于你的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])); 
+0

@Eli Sadoff:第一个答案是45度。而第二个应该是63.4349度,但是返回116.5651 – User110

+0

感谢您对@MBo的评论,但是它们仍分别返回45度和116.5651度。我知道我可以很容易地从180减去116.5651,以得到正确的结果。但是,如果有人要使用我的代码呢? – User110

+0

谢谢@MBo。这显然不是一个matlab代码,虽然我可以在Matlab中复制大部分代码,但最后一行(和第9行中的对应行)除外,我仍然可以得到与我的代码相同的答案。请,我在这里错过了什么? – User110

相关问题