2016-11-05 251 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

相關問題