• 検索結果がありません。

第 4 章 使用する LS 18

5.3 Convexhull

次に、Convexhullの実装についてを述べる。本研究では、3次元空間上における

Con-vexhullを表現する要素として、

頂点

面(ファセット)

を規定する。これらはそれぞれ、リストで管理する。3次元空間上におけるConvexhullを 作成するアルゴリズム[6]を参考に、3次元空間上における点集合を入力とし、その点集 合に対するConvexhullを作成するjavaプログラムの作成を行った。3次元空間上におけ るConvexhullを作成するアルゴリズムをAlgorithm 1に示す。また、上記に述べた頂点、

辺、面のデータ構造としては、Apache Commons Mathライブラリ[10]を使用し表現し た。最終的に、計算が行われ全ての点、辺、ファセットが入ったConvexhullが出力され るが、出力されたConvexhullを可視化するために、Convexhullを.plyファイルに書き落 とす機能もつけ、Convexhullの可視化についても実装を行った。本研究では作成した.ply ファイルの可視化ツールとして、Meshlab[11]を用いた。

5.3.1 Convexhull 同士の和集合

統合処理で2つのConvexhullの共通部分を算出するために、2つのConvexhullの共通 部分を算出して1つのConvexhullを導出するプログラムの実装を行った。5.3節で実装

したConvexhullを作成するjavaプログラムは、頂点の集合を入力すればそれらに対する

Convexhullを作成してくれるため、共通部分のConvexhullの作成にはこのプログラムを

Algorithm 1Calculate Convexhull(3D) Require: 3次元空間におけるn点の集合P Ensure: PのConvexhull:CH(P)

1: 4面体を構成するPの4点p1, p2, p3, p4を求める。

2: C ←CH(p1, p2, p3, p4)

3: 残りの点のランダムな順列p5, p6, ..., pnを求める。

4: 全ての可視点対(pt,f)を求めて衝突グラフgを初期化する。ただし、fはCのファセッ ト(面)であり、t >4である。

5: for r 5 to n do

6: {(*prをCに挿入する:*)}

7: if Fconf lict(pr)は空でない{(すなわち、prCの外にある)} then

8: Fconf lict(pr)のファセットを全てCから削除する

9: prから見える領域の境界を順に辿り(その領域はFconf lict(pr)のファセットから構 成されている)地平面の辺のリストLを順に作る

10: for すべてのe∈L do

11: 三角形のファセットfを作ることによりeをprにつなぐ

12: if fがeに沿った近傍のファセットと同一平面にある then

13: fとf’を1つのファセットに統合する。ただし、その衝突リストはf’のもの と同じである。

14: else

15: {(*fの衝突リストを定める:*)}

16: gにfに対する節点を作る。

17: f1f2を元のConvexhullでeに接していたファセットとする。

18: P(e)←Pconf lict(f1)∪Pconf lict(f2)

19: for 全ての点p∈P(e)do

20: fがpから見えるなら、(p,f)をgに加える。

21: end for

22: end if

23: end for

24: prに対応する節点とFconf lict(pr)のファセットに対応する接点をそれらに接続す る枝とともにgから削除する。

25: end if

26: end for

27: return C

のConvexhullと捉えた時、このConvexhullの頂点はAの頂点のうちBの内部にあるも の、Aの辺とBのファセットの交点、同様にBの頂点のうちAの内部にあるもの、Bの 辺とAのファセットの交点で構成される。なので、2つのConvexhullを入力とし、これ らの頂点を計算し出力した後、この頂点を入力とし5.3節で作成したjavaプログラムで計 算を行わせれば、2つのConvexhull A,Bにおける共通部分(A∩B)をのConvexhullが導 出される。2つのConvexhull A,Bにおいて、和集合をとったConvexhullを図5.1に示す。

図 5.1: Convexhullの和集合を取った様子

5.3.2 Convexhull 同士の差集合

同様に統合処理で2つのConvexhullの差集合を算出する必要がある。これにおいても 5.3節で実装したjavaプログラムを用いて行う。2つのConvexhullをA,Bにおいて、Aか らBの部分を引いた(A\B)Convexhullの頂点は、Aの頂点のうちBの内部にないもの、

Aの辺とBのファセットの交点、Bの頂点のうちAの内部にあるもの、Bの辺とAのファ セットの交点で構成される。そのため同様に2つのConvexhullを入力とし、これらの頂 点を計算し出力した後、この頂点を入力とし5.3節で作成したjavaプログラムで計算を行 わせれば、2つのConvexhull A,Bにおける差集合(A\B)のConvexhullが導出される。

2つのConvexhull A,Bにおいて、差集合をとったConvexhullを図5.2に示す。図5.2は、

集合を取ったConvexhull (A\B)(黄色のConvexhull)を示している。ただし、差集合にお いては凹面を持つものも存在するが、差集合の立体を構成する頂点を与えてConvexhull を計算した場合、Convexhullの定義上、凹面の部分が埋め合わされて凸面となった立体 となるため、差集合のConvexhullにおいては、厳密な差集合を作成できるとは限らない 場合も存在する。

図 5.2: Convexhullの差集合を取った様子

関連したドキュメント