• ベストアンサー

三次元のデータがある領域に含まれるかどうかの判断方法

ある三次元のデータが複数あり、閉じた立体を構成しているとします。(Aとします) そこに、あるデータaが、その立体の中にあるか、そとにあるか、という判断をしたいのですが、どうしたらよいのでしょうか? ある立体Aは単純な立体ではないため、方程式などでは表わせません。 Aから順番に3点とって、その三角形とベクトルaが交点をもつかどうかで判断しようと思っているのですが、Aもaもデータが多すぎるため、プログラムの処理が終わりません。 何かよい方法はないでしょうか?

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

  • ベストアンサー
  • age_momo
  • ベストアンサー率52% (327/622)
回答No.4

立体Aを点群でしか表せないのですからAの形状や密度によって戦略を考える必要が あると思います。形状が複雑でも全ての点において平面あるいは凸であるなら 近傍の点を探す戦略が有効だと思いますが、凹んでいる部分があるなら判断は複雑に なると思います。例えば視力検査のCのように球形の中に球形の凹んだ部分が あるならこの内側にあるaは立体Aの外側ですが完全に立体をメッシュなどで 定義してしまわないと外側という判断は出てきません。 (この『穴』が点群の密度より小さければ最早、立体Aを定義することすら無理のような気もします) aの数が多くて時間がかかっているなら一旦Aの最小包括円(球)を定義して (これならAの点の数が100万個程度ならほとんど時間はかかりません) この外側にあるものは無条件に外側、それより小さいものは球の中心と点aを 結ぶ直線に対して角度が一番小さい点(∠An・O・aが最小)より点群Aの密度以上に 遠ければ外側、近ければ内側、その範囲内なら更に近傍の点群Aを探して メッシュを形成して判断するという数段構えではどうでしょうか。 この戦略も形状がとんでもなく複雑なら誤判断が出てきそうですが。。。 いずれにせよ、Aの形状とデータ数(密度)と使えるメモリ量、色々な事情を勘案して 有効な戦術を考える必要があると思います。

shoot2
質問者

お礼

ご回答、どうもありがとうございます。 おっしゃるとおり、形状がなかなか複雑でして、鋭角で凹んでる部分などがあり、困っておりました。 球のアイディアは、なるほど、たしかにそうですね。 そうするとかなり簡略化できそうです。 誤差の状況など考慮して、場合によってはやってみる価値はありそうです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

noname#101087
noname#101087
回答No.6

#5 です。途切れとぎれですみません。 フリーのツールを追加。 三次元グラフィックスの演習に向いているかも.. 。 ---------------------------------------------  http://www.sra.co.jp/people/nisinaka/Jun4Java/index_ja.html >「じゅん」は,三次元グラフィックスおよびマルチメディアを扱うためのフレームワークとなる汎用クラスライブラリの名称です.

shoot2
質問者

お礼

いろいろとありがとうございます。 フリーのツール、Javaのライブラリなどまであるとは知りませんでした。 以上のものを駆使して、試したいと思います。

全文を見る
すると、全ての回答が全文表示されます。
noname#101087
noname#101087
回答No.5

>... ドロネー網というのですか。.... >ところで、こういうデータを処理するプログラムって、どういったものがあるのでしょうか。 (「ドロネー網」は「学界」用語のようで、「ゲー界」でいうところの「ポリゴンパッチ」でしょうか) オンライン・ソフトなら、このあたりでしょう。  http://www.softantenna.com/3.html#5 >マルチメディア//3D データ互換性が懸念されますが、とりあえず調べてみてください。

全文を見る
すると、全ての回答が全文表示されます。
noname#101087
noname#101087
回答No.3

三次元データAからドロネー網(三角形メッシュ?)を構成しておくのが正攻法みたいですが、三次元データAが変わるたびにやりなおしです。 三次元データAが変わらないのなら、初期投資(ドロネー網構成)の後は処理が迅速になりそうですけど...。 三次元データAはそのまま使うとして素朴な攻め方として頭に浮かぶのは、データaに最も近い四点をサーチして、データaが その四点を頂点とする(四面体)凸包に含まれるか否かを判定する、というやりかたです。  (1) 「最も近い四点」が一意的とは限らない。  (2) 「最も近い四点」が同一平面上でないとは限らない。 などの障害が予想されるので、サーチ戦略が先決問題なのでしょうが... 。 (やったことがなく無責任なコメントになり、すみません)

shoot2
質問者

お礼

ご回答、どうもありがとうございました。 なるほど、ドロネー網というのですか。 三次元データAは変わらないので、最初に構成するのはいいかもしれません。 ところで、こういうデータを処理するプログラムって、どういったものがあるのでしょうか。 普通に座標を計算することしかやったことないので、こういう三次元データを扱うにはどうしたら良いのでしょうか…。

全文を見る
すると、全ての回答が全文表示されます。
  • __Kei__
  • ベストアンサー率33% (1/3)
回答No.2

立体Aは点群で表されるということですよね。 近い点同士を結んでグラフ構造を作ることにより点群からメッシュへの変換を行い、このメッシュを簡略化することで計算時間を減らすというのはどうでしょうか?もちろん、簡略化のプロセスにより立体Aの表面で小さなエラーが生じることになりますが。

shoot2
質問者

お礼

ご回答、ありがとうございます。 やはり「メッシュ」がキーワードのようですね。 調べてみます。「近い点」という判断もなかなか難しいので、かなりの難問です…

全文を見る
すると、全ての回答が全文表示されます。
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

一般にはオクトツリー (八分木) を使うことになるのではないかと思います. "オクトツリー" で検索 http://www.google.co.jp/search?q=%22%E3%82%AA%E3%82%AF%E3%83%88%E3%83%84%E3%83%AA%E3%83%BC%22&sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-34,GGGL:ja "立体の内部" "判定" "アルゴリズム" で検索 http://www.google.co.jp/search?q=%22%E7%AB%8B%E4%BD%93%E3%81%AE%E5%86%85%E9%83%A8%22+%22%E5%88%A4%E5%AE%9A%22+%22%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%22&hl=ja&rls=GGGL,GGGL:2006-34,GGGL:ja&start=10&sa=N ソリッドモデリング等の話も参考になるかも. 形状モデリング特論 (東京大学 先端科学技術研究センター 精密機械工学専攻) http://www.den.rcast.u-tokyo.ac.jp/~suzuki/class/modeling/index.html

shoot2
質問者

お礼

ご回答、ありがとうございます。 検索するにもキーワードがわからず、困っておりました。 見てみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 4次元データを射影により3次元に縮小する方法

    以下のような 3本の位置ベクトルによって示される3次元空間に、4次元 データを射影し、次元縮小する方法を教えてください。  A = [a1 a2 a3 a4]、 B = [b1 b2 b3 b4]、 C = [c1 c2 c3 c4] 射影行列を求め、各データ点との積を求めるのだと思いますが、やり方 が分かりません。 仕事で次元縮小のプログラムを作らなければならないので、大変困っています。どなたか、助けてください。

  • 線形代数の3次元空間での法線ベクトル、平面の方程式

    線形代数の、3次元空間での法線ベクトル、平面の方程式の問題を教えて下さい この問題が分かりません 3 次元空間において次の問いに答えなさい. (1) 原点を含む法線ベクトル 1   2 -1 の平面S の方程式を求めなさい (2) 点(4, 5, 2) から平面S に垂線Lを下ろす. 直線Lの方程式とLとS の交点を求めなさい (3) 直線Lを含み点(0, 0, 0) も含む平面の方程式を求めなさい という問題です。皆さんお願いします 教えて下さい

  • 4次元空間上での平面の式

    任意の点を(x,y,z,u)とした4次元空間で (1)3次元の立体を表す式は ax+by+cz+du=e でいいですか? (2)2次元の平面を表す式は一般にどのような形になりますか? 上記のことに疑問を持った理由。 2次元空間で1次元の直線を表す式は、一般にax+by=cとなる。 これは、2点(x,y),(xo,yo)を通り、方向ベクトルが(a',b')で媒介変数tとして x=a't+xo y=b't+yo と書くこともできる。 3次元空間で2次元の平面を表す式は、一般にax+by+cz=d となる。 これは、 平面上の2点(x,y,z)と(xo,yo,zo)を結ぶベクトルとこの平面に垂直な直線の方向ベクトル(a,b,c)の内積が0であるという条件より導かれる。 実際に計算すると a(x-xo)+b(y-yo)+c(z-zo)=0 ax+by+cz=axo+byo+czo になり、ax+by+cz=dという形と同値であることが確認できる。 【別な考え】 3次元空間内の平面は、異なる3つの点によって決定するので、異なる3点を P(xo,yo,zo)、Q(x1,y1,z1)、R(x2,y2,z2) とする。この平面上の任意の点X(x,y,z)は、媒介変数t,sを使って OX↑=OP↑+tPQ↑+sPR↑ と書ける。 成分表示にするために OP↑=(xo,yo,zo) PQ↑=(a,b,c) PR↑=(a',b'c') と方向ベクトルを定義すると、 x=xo+at+a's......(1) y=yo+bt+b's......(2) z=zo+ct+c's......(3) という書き方も平面を表す式である。 実際に(1)と(2)から未知数t,sについてx,yの式で表すことができるので、それを(3)式に代入すれば、(1)(2)(3)式は、一つの式 a"x+b"y+c"z=d'という形になる。 直線を表す式は、媒介変数tを使って x=at+xo y=bt+yo z=ct+zo または、 (x-xo)/a=(y-yo)/b=(z-zo)/c=t となる。 4次元空間で同じように、 直線や平面や立体を考えてみた。 2次元では、(1,0)と(0,1)が直交の基底ベクトル。 3次元では、(1,0,0)と(0,1,0)と(0,0,1)が直交の基底ベクトル。 したがって、 4次元では、(1,0,0,0)と(0,1,0,0)と(0,0,1,0)と(0,0,0,1)が直交の基底ベクトル。 4次元空間では、点は4つの成分で表される。 4次元空間での直線について。 直線は2点が与えられば書ける。 2点(x,y,z,u)と(xo,yo,zo,uo)を通り、その直線の方向ベクトルが(a,b,c,d)だとしたら、媒介変数tを使って、 x=at+xo y=bt+yo z=ct+zo u=dt+uo となって (x-xo)/a=(y-yo)/b=(z-zo)/c=(u-uo)/d=t 次に4次元空間での3次元立体について。 2次元空間では、それより一つ次数が低い1次元の直線は一つの式 ax+by=c で与えられた。 3次元空間では、それより一つ次数の低い2次元の平面は、一つ式 ax+by+cz=d で表さられた。 したがって、4次元空間では、それより一つ次数の低い3次元の立体は、 ax+by+cz+du=e で表されるだろう。 【別な考え】 4次元空間では、ある方向ベクトル(a,b,c,d)に直交する立体は一つしかない。なぜなら、4次元空間での基底ベクトルは4つで空間(立体)は3つの基底ベクトルで決定されて、残り一つが残っているからだ。 立体上の2点(x,y,z,u)と(xo,yo,zo,uo)を結ぶベクトルとこの立体に垂直な直線の方向ベクトル(a,b,c,d)の内積が0であるという条件で計算すると a(x-xo)+b(y-yo)+c(z-zo)+d(u-uo)= 0 ax+by+cz+du=axo+byo+czo+duo になり、ax+by+cz+du=eという形になる。 2次元の平面はどうだろうか? (ここからが本題) 4次元空間では、ある方向ベクトル(a,b,c,d)に直交する平面は、2つあるはずだ。 なぜなら、4次元空間での基底ベクトルは4つで平面は2つの基底ベクトルで決定されて、残り2つが残っていて、それはこの平面に直交するように選べるからだ。 平面は、異なる3つの点によって決定するので、異なる3点を P(xo,yo,zo,uo)、Q(x1,y1,z1,u1)、R(x2,y2,z2,u2)、 とする。この平面上の任意の点X(x,y,z,u)は、媒介変数t,sを使って OX↑=OP↑+tPQ↑+sPR↑ と書ける。 成分表示にするために OP↑=(xo,yo,zo,uo) PQ↑=(a,b,c,d) PR↑=(a',b',c',d') と方向ベクトルを定義すると、 x=xo+at+a's......(1) y=yo+bt+b's......(2) z=zo+ct+c's......(3) u=uo+dt+d's.....(4) という書き方も平面を表す式である。 (1)と(2)を連立して、未知数t,sについてx,yの式で表すことができるので、それを(3)式と(4)式代入すれば、(1)(2)(3)(4)式は、2つの式 a"x+b"y+c"z+d"u=e' a"'x+b"'y+c"'z+d"'u=e" になる。 この2つの式からuを消去すれば、結局、 Ax+By+Cz=D という形になる。 zを消去すれば、 Ax+By+Cu=D yを消去すれば、 Ax+Bu+Cz=D xを消去すれば、 Au+By+Cz=D

  • 4次元空間の3つのベクトルが互いに直交する条件

    以前、 4次元空間の4つのベクトルが張る空間が1次元、2次元、3次元、4次元である条件 http://oshiete1.goo.ne.jp/qa3519203.html において、いろいろ教えていただけました。 同様にすれば、4次元空間の3つのベクトルが張る空間が1次元、2次元、3次元である条件、が成分を用いて書けることになります。 ところで、いくつかのベクトルが張る空間が1次元というのは、すべてのベクトルが平行ということです。 今回、それとは逆に「すべてのベクトルが互いに直交する」という条件を考えてみたいと思います。 4次元空間にゼロベクトルでない4つのベクトルを考えます。 a↑=(a[1],a[2],a[3],a[4]) b↑=(b[1],b[2],b[3],b[4]) c↑=(c[1],c[2],c[3],c[4]) d↑=(d[1],d[2],d[3],d[4]) とします。 a↑、b↑、c↑、d↑の4つのベクトルが互いに直交する条件は、 4つのベクトルでできる立体=超立方体 なので、行列式の絶対値は、各辺の積と等しく、 |a↑ b↑ c↑ d↑|^2=|a↑|^2* |b↑|^2* |c↑|^2*| d↑|^2 とかけます。成分でも書けます。 a↑、b↑の2つのベクトルが互いに直交する条件は、 内積を用いて、 a↑・b↑=0 とかけます。成分でも書けます。 最後に、a↑、b↑、c↑の3つのベクトルが互いに直交する条件を、できるだけ簡素に書きたいとき、どういった書き方になるのでしょうか? すべての組の内積が0というのより、なんらかの行列式を用いて書きたいのですが。

  • ベクトルの問題がわかりません。基本問題ですが・・・

    ベクトルの問題がわかりません。基本問題ですが・・・ xy平面上に2点A(3,1)B(1.2)があり、これらの位置ベクトルをそれぞれ、→a,→bとする。 このとき、次の各問に答えよ。 (1)ベクトル方程式 →p=→a+s(3→a-4→b) , →p=→b+t(2→a-3→b) (s,tは媒介変数) が表す2直線の交点の座標を求めよ。 (2)点Aを通り→bを方向ベクトルとする直線と、点Bを通り→aを法線ベクトルとする直線の交点の座標を求めよ。 (3)ベクトル方程式 |→p-→a|=5 が表す円をCとする。点Bを通り→aを方向ベクトルとする直線とCとの2つの交点の座標を求めよ。 わかりにくくてすいません

  • 高校数学、3次元の式の考え方

    高校数学、3次元の式の考え方 中心が(1、-3,2)で原点を通る球をSとする。 (1)Sとyz平面の交わりは円になる。この円の中心と半径を求めよ。 (2)Sとz=kの交わりは半径√5の円になるという。kの値を求めよ。 (問題集の解答) (1) Sの半径rは中心(1、-3,2)と原点との距離に等しいからr^2=1^2+(-3)^2+2^2=14 よって、Sの方程式は(x-1)^2+(y+3)^2+(z-2)^2=14 球面Sとyz平面が交わって出来る図形の方程式は (y+3)^2+(z-2)^2=13かつx=0(★) これはyz平面上で中心(0、-3,2)半径√13の円を表す。 (2) Sとz=kが交わって出来る図形の方程式は (x-1)^2+(y+3)^2+(k-2)^2=14、z=k(★) (疑問) (1)直線と直線(曲線)の交点は点になる、平面と平面のぶつかったところは線(交線)になる、というのはわかるのですが、なにとなにがぶつかると平面になるのでしょうか? (2)例えばy=x+1とy=2xは(1,2)を交点に持ちます。 このとき、(1,2)はどのように求めたのかといえば、2直線の交点というのは2つの方程式をともに成り立たせるからこの連立方程式を解けばよいと考え、(1,2)を求めた。 では、 Sとyz平面の交わりをどう考えるのか? S:(x-1)^2+(y+3)^2+(z-2)^2=14、yz平面:x=0をともに満たすのが2つの交わりの正体と考えたのですが、(y+3)^2+(z-2)^2=13かつx=0となるのがイマイチピンときません。 方程式はxyzが満たすべき条件ですから、2つに方程式がなることもあるだろうなとは思いますが、(y+3)^2+(z-2)^2=13かつx=0がSの方程式、yz平面の方程式をともに満たしているというのがわかりません。 (3)3次元では平面の方程式はax+by+cz+d=0という形で表されます。 x=0ならばx=0という条件以外任意という意味ですから、yzへと延びてゆくと考えて、yz平面と判断しているのですが、3次元では直線の方程式はどう表されるのでしょうか?2次元ではx=0は直線なので、これを見ると少し違和感があります。 中心が(1、-3,2)で原点を通る球をSとする。 (1)Sとyz平面の交わりは円になる。この円の中心と半径を求めよ。 (2)Sとz=kの交わりは半径√5の円になるという。kの値を求めよ。 (問題集の解答) (1) Sの半径rは中心(1、-3,2)と原点との距離に等しいからr^2=1^2+(-3)^2+2^2=14 よって、Sの方程式は(x-1)^2+(y+3)^2+(z-2)^2=14 球面Sとyz平面が交わって出来る図形の方程式は (y+3)^2+(z-2)^2=13かつx=0(★) これはyz平面上で中心(0、-3,2)半径√13の円を表す。 (2) Sとz=kが交わって出来る図形の方程式は (x-1)^2+(y+3)^2+(k-2)^2=14、z=k(★) (疑問) (I)直線と直線(曲線)の交点は点になる、平面と平面のぶつかったところは線(交線)になる、というのはわかるのですが、なにとなにがぶつかると平面になるのでしょうか? (II)例えばy=x+1とy=2xは(1,2)を交点に持ちます。 このとき、(1,2)はどのように求めたのかといえば、2直線の交点というのは2つの方程式をともに成り立たせるからこの連立方程式を解けばよいと考え、(1,2)を求めた。 では、 Sとyz平面の交わりをどう考えるのか? S:(x-1)^2+(y+3)^2+(z-2)^2=14、yz平面:x=0をともに満たすのが2つの交わりの正体と考えたのですが、(y+3)^2+(z-2)^2=13かつx=0となるのがイマイチピンときません。 方程式はxyzが満たすべき条件ですから、2つに方程式がなることもあるだろうなとは思いますが、(y+3)^2+(z-2)^2=13かつx=0がSの方程式、yz平面の方程式をともに満たしているというのがわかりません。 (III)3次元では平面の方程式はax+by+cz+d=0という形で表されます。 x=0ならばx=0という条件以外任意という意味ですから、yzへと延びてゆくと考えて、yz平面と判断しているのですが、3次元では直線の方程式はどう表されるのでしょうか?2次元ではx=0は直線なので、これを見ると少し違和感があります。

  • 3次元データを3D表示

    3Dプログラミング初心者です。 3次元データ(X,Y,Z)が多数あり、これらの点を3次元散布図のように表示させたいと考えてます。 3次元のデータは不規則ではなく、実物から3次元計測をして取得したデータです。 また、3次元の画像はマウスで回転させて見る方向を変えれるようにしたいです。 画像表示プログラムを、VC++もしくはVB.NETで作成したいのですが、 作成するにあたり、どのように作っていけばいいのかわかりません。 大まかな作成の流れ、もしくは参考になるサイトなどありましたら、 教えてください。 尚、プログラミングに必要な数学の知識は勉強しました。

  • 2次元における外積について

    プログラミング方面で2次元の外積なるものが定義されていました。 u=(a,b), v=(c,d)としたとき、 u×v=ad-bc というものです。3次元とは異なり、ベクトルからスカラーへの演算になっています。 外積は3次元でしか定義されないと教えられたので、 これは外積なのか、外積もどきなのか判断に困っています。 数学的にはこれを外積と呼ぶのでしょうか?

  • 外積 商 次元

    前回、内積にはなぜ商が定義されないのか 質問させて頂きました。 URL:http://okwave.jp/qa/q7403145.html 外積の商が定義されないことを示そうとしています。 ベクトルa=(1,0,0)とベクトルxの外積を以下に示すと、 a×x=bから、 (1,0,0)×(0,1,0)=(0,0,1) (1,0,0)×(1,1,0)=(0,0,1) (1,0,0)×(2,1,0)=(0,0,1) とベクトルbとなるベクトルxが複数存在します。 よって、 (1,0,0)×(γ,1,0)=(0,0,1)が成り立つ。 γ成分は、a=(1,0,0)における並行成分が任意であるということ。 したがって、ベクトルaとベクトルbが既知でもベクトルxが一意に 定まらないため商が定義されない。 上記の内容でOKでしょうか? また、内積と外積が定義される次元についてですが、 スカラーの内積とスカラーの外積は存在しないと思うので最低でも 2次元以上のn次元で定義されると認識でOKでしょうか? 以上、ご回答よろしくお願い致します。

  • ベクトルが3次元実ベクトル空間を動くとき

    以下の行列Aについて、すべての問いに答えなさい。   |1 4 0 | A = |1 0 2 |   |0 2 -2 | (1) 行列Aの固有値を求めなさい。 (2) 行列Aの各列をベクトルa1,a2,a3で以下のように表す。    A=(a1,a2,a3) これらの3個のベクトルの従属関係を式で示しなさい。 (3) ベクトルxが3次元実ベクトル空間(線型空間)V全体を動くとき、これによってつくられる点の集合を    W1={Ax|x∈V} とする。この集合がつくる実ベクトル空間の次元を求めなさい。 (4) ベクトルpをp=t(1,2,1)とする。ベクトルxがx・p=0となるような3次元実ベクトル空間Vを動くとき、xがどのような図形を描くか答えなさい。なお、t()は転置を表し、x・pはxとpの内積を表す。 (5) (4)のようにxが動くとき、集合    W2={Ax|x∈V,x・a=0} がつくる実ベクトル空間の次元を求めなさい。 という問題があるのですが、 (1):λ1=3, λ2=0, λ3=-3 (2):略 (1),(2)は合ってる自信があります。 (3)   |1 4 0 |   |1 4 0 | A = |1 0 2 | = |0 -4 2 |   |0 2 -2 |   |0 0 0 | これはrank=2となり、xをかけてもrankは変わらないので、 次元は2 (3)は次元は合ってる気がするのですが、答え方が間違ってるような気がします。 (4),(5)の解き方が分かりません。 (4)はx・p=0なので直交することは分かるのですが、これをどう使うかが分かりません。 (5)は(4)が解けないと解けないのですが、(4)が解けたとしてもaというよく分からないの出てきてて、解けなくなってしまいそうです。 どなたか(3),(4),(5)を解いて下さる方いらっしゃいませんか?