2012-01-08 27 views
3

したがって、法線ベクトルで与えられた平面で3次元形状の断面を計算するアルゴリズムがあります。法線ベクトルで与えられる平面からXY平面に座標をマッピングする

しかし、私の現在の問題は、断面が3D点(そのすべての面にある)に設定されていることです。この座標をXY平面にマッピングする必要があります。

プレーンノーマルが(0,0、c)のようなものなら、これは完璧です - ちょうどxとy座標をコピーしてzを破棄します。

ここに私の質問があります:私は他の平野をどのように変換するかわからないので、誰が私に今何をすべきかについて何かヒントを与えることができますか?

+0

私はあなたがしたいことは、ペイン(断面)から別の(x、y)への投影か、または座標変換のいずれかであると思われます。 –

+0

現在、私は3D座標系で3D点(x、y、z)(実際には(x、y、z、1))のセットを持っています。 XY平面のマッチ(x、y、z)の(x '、y')のような2D点(x '、y')のセット(よく、実際には(x '、y'、1) )を、法線ベクトルによって与えられる3D平面内に置く。これまでのところ、ベクトルで与えられた平面を回転させることができれば、私はその点を次のように投影することができたと考えました。(x、y、z、1) - >(x、y、1) – stollgrin

+0

@EugenRieck Hey Eugen、あなたの言うことは、 "あなたの断面(あなたの断面)から別のもの(x、y)への投影か、またはある座標変換から別の座標変換への変換"の違いです。 – user1084113

答えて

7

はあなたのペインには、私たちは「私たちは、これらを選んだ2つの基底ベクトルとペインのためのゼロ点

基本ベクトル

を必要とする座標変換のために法線ベクトル

n=(xn,yn,zn) 

によって定義されますx/yペインにフィッティングすることができます(後でエッジケースを参照してください)。

b1=(1,0,zb1) 
b2=(0,1,zb2) 

そして、我々は

​​(constのスカラーC)

は今、この解決これら二つは本当に

を塩基であることを確認したい:

b1 x b2= (0*zb2-zb1*1,zb1*0-1*zb2,1*1-0*0) = (zb1,zb2,1) 
zb1*c=xn 
zb2*c=yn 
1*c=zn 

c=zn, 
zb2=yn/c=yn/zn 
zb1=xn/c=xn/zn 

b1=(1,0,yn/zn) 
b2=(0,1,xn/zn) 

をし、それを

bv1=(1,0,yn/zn)*sqrt(1+(yn/zn*yn/zn)) 
bv2=(0,1,yn/zn)*sqrt(1+(xn/zn*xn/zn)) 
を正規化

このケースでは法線ベクトルはx/yペインに平行であり、自然な基底ベクトルは存在しません。この場合、エステティックPOVで基底b1とb2ベクトルを選択し、同じソリューションプロセスか、単にbv1とbv2を選択してください。

ゼロポイント

あなたはOQであなたのペインにはアンカーポイントの話を聞いたが、並列ペインの無限の家族からあなたのウィンドウを区別する必要があります。そうでない場合、私はあなたが(XAのアンカーポイントを持っていると仮定し、あなたのアンカーポイントがある場合

は、(0,0,0)が、これは座標変換のための完璧なアンカーポイントであり、あなたのペインには、

x*xn+y*yn+z*zn=0, 
(y0,y0,z0)=(0,0,0) 

を持っています、ya、za)、ペインは

x*xn+y*yn+z*zn=d 

とd constスカラーを持っています。

x*xn+y*yn+z*zn=d 
に対してこれを解決

(x0, y0, z0) = c * (xn,yn,zn) 

P0=(x0,y0,z0) 

:自然に適合されたがペイン上に元のゼロ点の通常の投影によって定義され、ウィンドウのポイントであろう

c*xn*xn+c*yn*yn+c*zn*zn=d 

c=d/(xn*xn+yn*yn+zn*zn) 

従って

P0=(x0,y0,z0)=c*(xn,yn,zn) 

が発見されました。

最終的な変換が

新しい座標である

P0+x'*bv1+y'*bv2 
xは

「とY」としてあなたペインのすべてのポイント(表示したい、すなわち、これらの点を)表すことによって達成されます。私たちはP0、bv1、bv2を知っているので、これはかなり簡単です。エッジケースではない場合、bv1.yとbv2.xにはゼロがあり、さらに問題が軽減されます。

x 'とy'は、あなたが望む新しい座標です。

+0

とてもいい説明です!私は同じ問題に直面し、計算された基底ベクトル上に3D点を表現するために、ドットプロダクトを使ってそれらを基底ベクトルに射影しました。 'x '= pt3d.dot(bv1) y' = pt3d.dot(bv2)' 正しいですか? – Dexter

+0

こんにちは、ここではマイナーエラーがあると思います。 'b1 =(1,0、yn/zn) b2 =(0,1、xn/zn)' 実際にはb1 * n =マイナス。'b1 =(1,0、-yn/zn) b2 =(0,1、-xn/zn)' –

関連する問題