• 締切済み

Cによる ベクトル計算

CVector{ double x; double y; double z; } CVector V[4]; この V[0] V[1] V[2] V[3] は 四角形Vの頂点を表しています。 ここでは rand 関数を 用いて 適当に数値を代入します。 つぎに CVector B[4]; これは 四角形B の頂点を 表しています。 ここでも rand関数を用いて 頂点の値を代入します。 そして この 二つの 四角形が 交わっているかいないかを しらべたいのです。 どうすればいいのでしょうか?高校数学のベクトルの知識はあるのですが、どうプログラムしていいのか わかりません。 どなたか わかる人いらっしゃいましたら、簡単にプログラムとして 書いていただけないでしょうか? お願いします。

みんなの回答

回答No.7

>三角錐でも立体でもありません。 3次元空間における 平面の四角形です。 4点をランダムに選んだら4点すべてが一平面上にあるとは限らないので、4点目はランダムに選んだ3点と同じ平面状にランダムに置く。ということでよろしいですか? 方針としては、四角形を三角形2つに分解して、三角形同士の交差判定、もしくは三角形と線分の交差判定でいけそうな気がしますが。。

  • keikan
  • ベストアンサー率42% (75/176)
回答No.6

#4です。 まず、与えられた、4角形の3点から、 この3点を含む平面を次式に代入し連立をときます aX+bY+cZ=d 平面Vと平面Bをそれぞれ求めたら、 平面の式2つを連立させて平面が交わって出来る直線を求めます。 x-a y-b z-c ---=---=---  i   j   k  この直線は平面V、Bの両方の上に存在します。 この直線と四角形Vと四角形Bの各位置関係を求めます。 この直線に対して四角形Vの各頂点がすべて同一方向にあれば四角形Vはこの直線を含んでいません。 すなわち平面Bとは交わっていません。 (頂点が直線上にある場合もあるので注意) 四角形Vの頂点がこの直線を挟む場合、四角形Vは平面Bと交わっています。 同様に四角形Bについて平面Vと交わっているかを確認します。 四角形VとBがお互いに相手の平面に交わっていれば、四角形Vと四角形Bは空間上で交わっていると考えられる。 四角形の頂点と直線の位置関係は各頂点から直線におろした垂線のベクトルの向きを調べれば良いと思う。 これで何とかならないかな^^;; ソースはないけど、良さそうなライブラリを見つけたので使ってみる、参考にして見るのもいいかな^^ このリンクを上にたどっていくとライブラリがDLできる。

参考URL:
http://www.sccs.chukyo-u.ac.jp/~miyazaki/education/vc/ggl_manual/Geometry.html
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.5

>交差点が四角形B内であるというのは どうやって しれべればいいのでしょうか・・・ 多角形の内外判定については参考サイトに分かりやすくありますが、基本的には 点から右に直線を引いて、多角形の辺と奇数回交差すれば点は多角形内 という方法で行います。 「右」は面に垂直でなければどの方向でもいいので(1,0,0)か(0,1,0)を使い、前者ならy,z、後者ならz,xだけを使って2次元で計算できます。 辺との交差は、辺の両端の座標と点の座標の相対位置から分かります。

参考URL:
http://kone.vis.ne.jp/diary/diarylst.html
  • keikan
  • ベストアンサー率42% (75/176)
回答No.4

その四角形は平面とういう前提なのか、#2さんの言うような立体なのか? 三角錐どうしのあたり判定?

akagenoanfan
質問者

補足

三角錐でも立体でもありません。 3次元空間における 平面の四角形です。

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.3

4角形2つの交差ということなら、 四角形Vの辺のいずれかが、 平面Bと交差し、なおかつ交差点が四角形B内 ならば4角形同士が交差しています。

akagenoanfan
質問者

補足

交差点が四角形B内であるというのは どうやって しれべればいいのでしょうか・・・ すみません 数学の話ですが お願いします。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

空間上に4点を置いてできるのは、四角形というより四面体ですね。 1) CVector V[4]; // 四面体 CVector p; // 点 で、点が四面体に含まれるかどうか? 2) CVector V[4]; // 四面体 CVector l[2]; // 線分 で、線分が四面体と交わるかどうか? 3) CVector V[4]; // 四面体 CVector d[3]; // 三角形 で、三角形が四面体と交わるかどうか? と、順を追って考えてゆくとよろしいのでは?

akagenoanfan
質問者

補足

・・・たしかにそうなのですが・・・

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>rand 関数を用いて適当に数値を代入します。 適当に入力したら、四角形にならない場合があると思いますが。

akagenoanfan
質問者

補足

たしかに そうです。しかし 今回は 四角形の頂点が与えられているという 前提で お願いします。

関連するQ&A

専門家に質問してみよう