• ベストアンサー

3次元の平面上の点かどうかを判定したい

3次元空間の3点で三角形を作って、その三角形上に点があるかどうかを判定したいのですが、どうすればよいでしょうか? 例えば3点、a(0,0,0),b(10,0,0),c(0,10,0)で三角形abcをつくったとき、(0,1,1)はabcの平面上、(0,10,10)は平面外という風に判定したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sanori
  • ベストアンサー率48% (5664/11798)
回答No.7

#2#6です。 >>> そうです!△abcの内部ということです。 例として書いたのは「△abcの内部」ということを分かってもらうために簡単なものを書きました。 なので、例の3点だけでなく、任意の△abcの内部にたいして、任意の点を判定するには、どうすれば良いでしょうか? 私は公式を覚えるのが不得意な人間なので、あくまでも「前回回答までのような考え方を踏襲」してやりたいと思います。 ------------- では、やってみましょうか。 ただし、私は、計算が非常に不得意(笑)←マジ なので、 以下の手順は検算(検証)してみてください。 三角形△ABCの3頂点が、 A(xa, ya, za) B(xb, yb, zb) C(xc, yc, zc) であり、 判定対象の点は X(X, Y, Z) であると置きます。 まず、点Aが原点(0,0,0)になるように、全部の点を平行移動します。 A' ≡ O (0, 0, 0) B' (xb-xa, yb-ya, zb-za) ≡ ベクトルOB'→ = b→ C' (xc-xa, yc-xa, zc-xa) ≡ ベクトルOC'→ = c→ X' (X-xa, Y-xa, Z-xa) ≡ ベクトルOX' → = x→ このとき、 x→ = [0~1]×b→ +[0~1]×c→ であれば、Xは△ABCの内部(辺の上も含む)です。 x→ = アb→ + イc→ (0≦ア≦1,0≦イ≦1) したがって X -xa = ア(xb - xa) + イ(xc - xa) Y -ya = ア(yb - ya) + イ(yc - ya) Z -za = ア(zb - za) + イ(zc - za) ここで、未知の数は、アとイだけです。 つまり、解が2個しかないのに、3本の式があるという、へんてこりんな連立一次方程式です! ですから、 1本目の式と2本目の式から、アとイを確定させて、それが3本目の式と矛盾していないかを調べれば、点Xが三角形の内部であるかどうかが判定できます! ------------------------------------------------------ 1本目の式より、 (X -xa)(yb-ya) = ア(xb-xa)(yb-ya) + イ(xc-xa)(yb-ya) 2本目の式より、 (xb-xa)(Y-ya) = ア(xb-xa)(yb-ya) + イ(xb-xa)(yc-ya) 引き算すれば、 (X -xa)(yb-ya) - (xb-xa)(Y-ya) = イ(xc-xa)(yb-ya) - イ(xb-xa)(yc-ya)  = イ{(xc-xa)(yb-ya) - (xb-xa)(yc-ya)} よって イ = {(X -xa)(yb-ya) - (xb-xa)(Y-ya)}/{(xc-xa)(yb-ya) - (xb-xa)(yc-ya)} これを再び1本目に代入すれば、 X -xa = ア(xb - xa) + (xc - xa){(X -xa)(yb-ya) - (xb-xa)(Y-ya)}/{(xc-xa)(yb-ya) - (xb-xa)(yc-ya)} よって、 ア =[ (X -xa -(xc - xa){(X -xa)(yb-ya) - (xb-xa)(Y-ya)}/{(xc-xa)(yb-ya) - (xb-xa)(yc-ya)}]÷(xb - xa) さらに、上の上の上の式に代入すれば、 イ = ・・・(略) こうして求めたアとイがそれぞれ、0から1の範囲内に入っていれば、第1、第2段階はクリア。 残る第3段階は、それらを3本目の式に代入して、左辺と右辺がぴったり一致していれば、第3段階(=最終段階)もクリアです。 ------- なお、 もしも点A(xa, ya, za)が最初から原点(0,0,0)であれば、 X = ア・xb + イ・xc Y = ア・yb + イ・yc Z = ア・zb + イ・zc 1本目の式より、 X・yb = ア・xb・yb + イ・xc・yb 2本目の式より、 Y・xb = ア・xb・yb + イ・xb・yc 引き算。 X・yb - Y・xb = イ・(xc・yb - xb・yc) イ = (X・yb - Y・xb)/(xc・yb - xb・yc) ↑これが0~1の範囲か? この判定結果が合格ならば、次、 1本目の式にイを代入。 X = ア・xb + xc (X・yb - Y・xb)/(xc・yb - xb・yc) 移項。 ア・xb = X - xc (X・yb - Y・xb)/(xc・yb - xb・yc)   = {X(xc・yb - xb・yc) - xc (X・yb - Y・xb)}/(xc・yb - xb・yc)   = {X(0 - xb・yc) - xc (0 - Y・xb)}/(xc・yb - xb・yc)   = xb・(Y・xc - X・yc) /(xc・yb - xb・yc) よって、 ア = (Y・xc - X・yc) /(xc・yb - xb・yc) ↑これが0~1の範囲か? この判定結果が合格ならば、次、 以上で求めた ア=* と イ=* を、3本目の式 Z = ア・zb + イ・zc に代入してみる。 ↑これで、左辺と右辺がピタリと一致するか? この判定結果が合格ならば、全条件クリア。 ------------------------------------------------------ 他の考え方も紹介しましょう。 その考え方とは、「影踏み」です。 三角形の内部に点があるためには、 z=0の点だけを集めた平面(XY平面と言う)に対して、垂直方向から光を当てたとき、XY平面というスクリーンに投射された影ににおいて、点は、三角形の内部に入っていないといけません。 つまり、Z座標を無視して、X座標とY座標だけを見て2次元で考えればよいです。 これを式で書けば、 ベクトル(X-xa,Y-ya) = ア×ベクトル(xb-xa, yb-ya) + イ×ベクトル(xc-xa, yc-ya) ということは、1本目の式は、 X -xa = ア(xb - xa) + イ(xc - xa) ↑ この式、どっかで見たことありませんか? (以下、略) いずれにしろ、上記のような地道な作業になりそうです。 色々な点Xの座標について確かめたければ、表計算ソフトにぶちこめばよいでしょう。

その他の回答 (7)

回答No.8

三次元って難しく感じるかもしれませんが、ベクトルをしっかり学んでいればこの程度なら二次元とほぼ同様に解くことができます。 つまり、 △ABC上に点Xがあるかどうかを判別するための条件は →AX=s×→AB+t×→AC  と書いたときに 0≦s≦1 かつ 0≦t≦1 かつ 0≦s+t≦1 を満たしているかどうかを調べればよいです。 (最初の2つを調べて3つめを調べないと→AD=→AB+→ACを満たす点をDとしたときの平行四辺形ABDC上の点を調べることになります) 今回は →AB=(10,0,0) →AC=(0,10,0) だから →AX=s×→AB+t×→AC=(10s,10t,0) (ただし0≦s≦1 かつ 0≦t≦1 かつ 0≦s+t≦1) を満たす領域が△ABC内部の範囲です。

  • sanori
  • ベストアンサー率48% (5664/11798)
回答No.6

#2の者です。 もしや、 「平面上」というのは、「△abcの内部」ということですか? この場合、aの座標が原点なので、話は簡単です。 ベクトルab→は、(10,0,0) ベクトルac→は、(0,10,0) そして、三角形の中の全ての点は、 ab→の0~1倍 + ac→の0~1倍 で表すことができます。 (紙に書いて、すぐ分かるはず。) すなわち、この場合、 (0~10、0~10、0) にある全ての点は、△abcの内部です。 よって、 (0,1,1)と(0,10、10)は、いずれも、三角形の内部に無いことが一目で分かります。 ちなみに、余計なこと言いますが、 ベクトルbc→は、 bc→ = ba→ + ac→  = ac→ - ab→   = (-10、10,0) ということは、 点bの座標(10,0,0)に、 (-10、10,0)の0~1倍を掛けたもの を足した座標は、全て、辺bcの、ちょうど上です。

milakulugou
質問者

補足

そうです!△abcの内部ということです。 例として書いたのは「△abcの内部」ということを分かってもらうために簡単なものを書きました。 なので、例の3点だけでなく、任意の△abcの内部にたいして、任意の点を判定するには、どうすれば良いでしょうか?

  • eatern27
  • ベストアンサー率55% (635/1135)
回答No.5

平面ABC上に点Pがあるかどうかを判定するとします。 (↑AB×↑AC=0 の場合、ABCは一直線上にあるので考えません) ↑AP・(↑AB×↑AC)=0 ⇒ Pは平面ABC上にある ↑AP・(↑AB×↑AC)≠0 ⇒ Pは平面ABC外にある (×は外積、・は内積です)

  • kohta83
  • ベストアンサー率31% (12/38)
回答No.4

No3です。失礼しました。 k+l+m=1 は三角形の外周上に点がある場合ですね。 あるベクトルdが三角形abc内部にあるための条件は、 d = k(a-c)+ l(b-c), k+l<1 と書けること。

  • kohta83
  • ベストアンサー率31% (12/38)
回答No.3

a, b, cを3次元ベクトルと考えて、もし、ある点dが d = k*a + l*b + m*c (k,l,m は何らかのスカラー) と表せるなら、(つまり、a,b,cの線形結合で表せるなら) a,b,cと同一平面上にあることになります。 さらに、k, l, m に一定の制限をかけてやれば三角形内に収まりそうです。 計算していないけど、たぶん、k+l+m=1 のとき、三角形内の点になるのではないでしょうか。 2次元空間で、ある2点の内分点であるための条件のアナロジーです。 間違っていたら教えてください。

  • sanori
  • ベストアンサー率48% (5664/11798)
回答No.2

平面の方程式は、一般に Ax+By+Cz+D=0 と書けます。 これに、点a、b、cの座標を代入し、連立方程式を解くと、平面の方程式が判明します。 ただし、A~Dという4つの変数にたいして、3本の方程式なので、絶対に解けません。(不定になります) ですから、A~Dのうち、1つをあらかじめ好きな数字に決めます。(ただし、ゼロは駄目) Aを1にすれば、 x+By+Cz+D=0 です。 そうして、B~Dが求まり、 平面の方程式が、例えば、 x+2y+3z+4=0 という式になったとしましょう。 これに、 (0,1,1) を代入して左辺が目出度く、丁度ゼロになれば、 (0,1,1) は、その平面内にある、ということです。

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.1

三点A,B,Cの位置ベクトルを それぞれa,b,cとしたとき, 平面ABC上の点Pの位置ベクトルpは p=s a + t b + u c (s+t+u=1) と表せる.これを使えば, 平面にのってるかは判別可能です. ちょっと考えれば, 三角形の内部・周上・外部も 判別可能です 二次元の場合とほとんど同じです