2011-01-25 13 views
1

私は方程式:Ax + By + Cz + D = 0によって与えられる平面を描きたい。 私は最初にx、yを設定して彼を描こうとした後、方程式からzを得ました。これは、0x + 0y + z + 0 = 0などのいくつかのプレーンが存在するためうまくいきませんでした。平面を描く

私の現在の解決策は次のとおりです。 - ZY平面上に4つの座標無限 - z軸上に を配置するために、与えられた平面(a、b、c)の法線を持たせるために行うべき回転を見つけます。 - その平面がx軸上にあるために実行すべき変換を見つけます。 - これらの回転とこの平行移動に正反対の変換を行うと、彼の代わりに
飛行機が得られます。

OK

は、誰かが私を助けることができる

これは素晴らしいことですが、私は内積となどとの適切な数学の計算(時間の試した多くを...)することができます....正確なやり方を理解しているか、ABCDを入れて適切な変換を得る数式を私に教えてください。

助けが役に立ちます!

+0

正確には何ですか?飛行機のポイントとノーマルが欲しいですか?平面上に3つの点がありますか?Z = 0平面に対して平面の角度が必要ですか? – wich

+0

こんにちは、 お返事ありがとうございます。 私は飛行機を描くことができるようにしたい。 私は飛行機で4点が必要ですが、この作業は先に提案されたものを作るのが難しいです。 私が欲しいものは、YX平面と私の平面(Ax + By + Cz + D = 0)の間のアフィン変換です。 この変換をした後、私はYX平面上に簡単に描画する平面に逆変換を適用して私の平面を描くことができます。 – talel

+0

まあ、a、b、c、dは、固定アフィン変換を得るのに十分な情報を提供していません。投影は、平面内の任意の起点であってもよく、元のXY平面のXおよびYベクトルの新しい平面へのマッピング(すなわち、回転またはスキュー)であってもよい。 – wich

答えて

0

これはあなたの質問ですか?あなたの平面にxy平面のような単純な平面を変換

はかなり簡単である:あなたの平面がアックス+によって+のCz + D = 0

ある

XY平面= 0単にZです。すなわち、A = B = D = 0であり、C =任意のものである。簡単にするために1とします。

この形で平面を有する場合、平面の法線ベクトルを(A、B、C)で定義される

だから、(0,0,1から行くことができます回転を望ん)から(A、B、C)へ*

*これは{A、B、C}が単一である場合にのみ有効です。 A BとCをそれぞれsqrt(A^2 + B^2 + C^2)で割る必要があるかもしれません。

ちょうど2つの軸の周りを回転すると、任意の方向から任意の方向に向けることができるので、xとyを選択します。

は、約x軸による回転のための回転行列であり、bは、y軸の周りの回転行列です。

のRx:= {{1、0、0}、{0、COS [A]、シン[A]}、{0、-Sin [A]、COS [A]}}

さRy = {{Cos [b]、0、-Sin [b]}、{0,1,0}、{Sin [b]、0、Cos [b]}}

x 0平面に垂直なベクトルのyについての回転、(0,0,1)、

Ry.Rx. {0,0,1} = {-Cos [a ]あなたのABC値である罪[b]、罪[a]、コス[a]コス[b]}

です。

すなわち

A = -cos [A]シン[B]

B =シン[A]

C =コス[A]コス[B]

ここから、それは簡単です。

= ASIN [B]

今A = -cos [ASIN [B]シン[B]

コス[ASIN [X] =のSQRT(1-x^2) そう:

A = -sqrt〔1-B^2] *シン[B]

B = ASIN [-A/SQRT [1-B^2]

= ASIN [B](x軸回りの回転)

b = aSin [-A/sqrt [1-B^2]](Y軸回りの回転)

これで、回転する必要があるx軸とy軸に関する角度が得られるようになりました。

この後、既に持っているものと一致するまで、飛行機を上下にシフトするだけで済みます。

あなたが現在持っている飛行機は(その2回転後)、Ax + By + Cz = 0になります。

あなたが望む飛行機はAx + Bx + Cz + D = 0です。 dを見つけるには、z軸があなたの飛行機を横切る場所がわかります。

すなわちCzを+ D = 0 - > Z = -D/C

だから我々は斧+によって+のCzであなたのz変換= 0 -D/Cを与えることで:

アックス+により、 + C(z + D/C)= Ax + By + Cz + D = 0。ああ、あなたはそれを見ますか?

角度を回転させると余分な数学を行う必要はありません。

2つのアングルはA、B、Cを与えます。Dを取得するには、持っていたものからコピーします。

いくつかの助けの者が、私はあなたが実際にいくつかの恐ろしいの書式を修正する

が編集...しかし平面を描画することを計画か全くわからないことを願っています。うまくいけばそれは今より良いです。

+0

こんにちは! 私はあなたの助けが非常にappriciateですので、かなり緩やかに数学でです! 現在のソリューションは、平面A = 0、B = 1、C = 0、D = 0(XZ平面)をどのように扱いますか? B = 1(正規化後)のプレーンをどのように処理するかをより一般的に説明します。 btd:-D/Cでのzの変換は、Cをノーマライズした後です。 TNX !!!! – talel

1

あなたは、次の変換行列になるでしょう:

ここ
[ x0_x y0_x z0_x o_x ] 
M = [ x0_y y0_y z0_y o_y ] 
    [ x0_z y0_z z0_z o_z ] 
    [ 0 0 0 1 ] 

を、Z0は、あなたの飛行機の正常であり、oはあなたの平面の原点であり、X0とY0がにあなたの垂直な面内の2つのベクトルでz0は投影の回転と歪みを定義します。

そしてあなたのXY平面上の任意の点(x、y)は点(p_x、p_y、p_z)以下を使用して新しい平面に投影することができる。今

(p_x, p_y, p_z, w) = M * (x, y, 0, 1) 

、あなたの変換行列でZ0に簡単です、それはあなたの飛行機の普通です。それは単にn = normalize(a,b,c)です。

残りの部分を選択する際には、はるかに自由度があります。原点については、飛行機がZ軸に平行でない限り、飛行機がZ軸と交差する点を取ることができます。その場合は、別のものが必要です。

実際に

if (c != 0) { //plane intersects Z axis 
    o_x = 0; 
    o_y = 0; 
    o_z = -d/c; 
} 
else if (b != 0) { // plane intersects Y axis 
    o_x = 0; 
    o_y = -d/b; 
    o_z = 0; 
} 
else { // plane must intersect the X axis 
    o_x = -d/a; 
    o_y = 0; 
    o_z = 0; 
} 

そのテストでそれも成功しますので、あなたは、(c != 0)とは異なるテストを好むしたい場合はc発言にあるように、あなたの起源をリードする、非常に非常に小さいが、ゼロからわずか異なり、x=0, y=0, z=10e100いますおそらく望ましくないでしょう。だから、おそらく(abs(c) > threshold)のようなテストが望ましいでしょう。あなたはもちろんの起源、元の座標系の原点に最も近い、おそらくポイントを置くために平面に完全に異なるポイントを取ることができるしかし、それは次のようになります。

o = n * (d/sqrt(a^2 + b^2 + c^2)) 

を最終的に我々が把握する必要がありx0とy0。これは、z0に直交する任意の2つの線形独立ベクトルとすることができる。だから、最初の

、私たちのX0ベクトルのXY平面内のベクトルを選択してみましょう:あなたのZ0は、フォーム(0、0、z0_z)であることを起こる場合

x0 = normalize(z0_y, -z0_x, 0) 

さて、これが失敗したので、我々は必要そのための特殊なケース:最後に

if (z0_x == 0 && z0_y == 0) { 
    x0 = (1, 0, 0) 
} 
else { 
    x0 = normalize(z0_y, -z0_x, 0) 
} 

のCrossProductを使用して、のは、それから、私たちはスキューたくないと言うと、両方X0に直交するようにY0を選択し、Y0せ

y0 = normalize(x0_y*y0_z-x0_z*y0_y, x0_z*y0_x-x0_z*y0_z, x0_x*y0_y-x0_y*y0_x) 

これで、すべての変換行列が完成しました。

免責事項:あなたの番号の浮動小数点表現を使用した場合、適切なケアが取られるべきである、シンプルな(のfoo == 0)のテストは、これらのケースでは十分ではありません。あなたが物事を実装する前に、浮動小数点数学を読んでください。

編集:わかりやすくするためにいくつかの変数を変更しました

+0

お返事ありがとうございます! – talel

関連する問題