2016-11-05 4 views
0

enter image description here 2つの平面間の交差角度を見つけるためには、各平面に垂直な法線ベクトルの内積を使用し、角度の余弦を与えることが十分に文書化されています。私はこれをプログラムしようとしましたが、場合によっては計算結果が交差点の角度ではなく補助点になることに気付きました。ここ は、以下の2つのサンプルコードである。この示して:第1の例では、正しい角度(45度)を算出するが、第2の例では、(補足を算出すること2つの平面間の角度を正しく取得するにはどうすればよいですか?

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) 

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) 

秒116.5651度)。これを打破しようとした後、ある法線が正の向きを指し、他の法線が負の向きを指していると認識しました(図A参照)。次に、angle = 180 - (acos(ドットn1、n2)/(ノルム(v1)ノルム(v2))))* 180/pi。しかし、n1とn2の両方を図のように同じ方向(正または負)に向ける場合は、 * 180/pi

私はこれをいくつかの例でテストしましたが、私はこの慣習を確信しています。(慣例では、すべての場合に機能します。私はまた、これがいくつかの多くの人々にとって役に立つと確信しています。それにもかかわらず、私の悩ましい問題はこれをどのようにプログラムするかです。どんなアドバイス/助言/提案も非常に高く評価されます。ありがとう!

+0

と同一線上に作るためにv1を回転させるために必要な角度を与えるあなたは、出力を与えることができます予想される出力に対して? –

答えて

0

2つの平面は、2組の角度(a、Pi-a、a、Pi-a)を形成する。もちろん、それらのすべては正しいものです。そしてarrcosineアプローチは、範囲0のこれらの角度から1つを与えます。

あなたが通常の方向によって定義された指向面を持っている場合は、機能を使用して、通常の方向との間の範囲-Pi..Piの角度を計算することができます。この角度の符号は順序に依存していること

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

注意法線ベクトルの!あなたの2Dデータ用

Delphiの例では、私は、紙のスケッチから期待と同じように

angle -45.00 
angle 116.57 

を与える - この方法は、それが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度です。一方、2番目は63.4349 degとなっていますが、116.5651 – User110

+0

@MBoのコメントありがとうございますが、それでもそれぞれ同じ45度と116.5651度を返します。私は簡単に正しい結果を得るために180から116.5651を引くことができることを知っています。しかし、誰かが自分のコードを使用していたらどうでしょうか? – User110

+0

ありがとうございます@MBo。これは明らかにmatlabコードではありませんが、最後の行(および9行目の対応部分)を除いてMatlabでそのほとんどを再現することはできますが、私のコードと同じ回答が得られます。私はここに何もないのですか? – User110

関連する問題