定番:境界表現モデルの基礎 鈴木宏正 東京大学精密機械工学専攻 [email protected] 定番:境界表現モデルの基礎 鈴木宏正 平成 14 年 8 月 1 日 目次 1 境界表現の数学的基礎 1.1 1.2 1.3 1.4 1.5 1 はじめに : : : : : : : : : : : : : : 向き付け可能な閉曲面 : : : : : : 閉曲面へのグラフの埋め込み : : 2 胞体埋め込み : : : : : : : : : : 2 胞体埋め込みのローテーション : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2 境界表現のデータ構造 2.1 2.2 2.3 グラフ上の隣接関係 表現の拡張 : : : : : 幾何表現 : : : : : : : 1 1 6 11 17 24 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24 31 35 3 オイラー操作 (Euler Operation) 37 4 オイラー操作による立体操作 45 4.1 4.2 基本立体生成 切断操作 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 45 46 5 集合演算 51 6 インバージョンアルゴリズム 52 7 非多様体 (Non-Manifold Model) 58 7.1 背景 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8 各種の立体表現の関係 58 59 i 1 境界表現の数学的基礎 1.1 はじめに CSG モデルは,r 集合という抽象立体を表現するものであった.もう一 つの代表的な立体モデリングの手法は境界表現 (boundary representation) あるいは簡単に B-Rep と呼ばれる方法である. 我々の身の回りにある物体を考えると,物体の内部,すなわち中実な部 分はその物体の表面によって覆われており,いいかえると物体の表面は 空間を物体の内部と外部 (空気) とに分けている.したがって表面によっ て物体の形を表現できるとが考えられる. すなわち,立体の占める空間の領域を表現するのではなく,その領域 の境界を表現することによって,立体の占める領域を表現しようとする のが,境界表現の考え方である. 1.2 向き付け可能な閉曲面 境界の性質 境界表現の名前の通り,立体の境界 (あるいは表面) の位相幾何学的 性質を考える.図 1(a) は多面体であり、(c) は円柱である。これら は r 集合で、すなわち、これらの立体の境界の点と内部の点からな る集合は r 集合になる。ここでは,その内の境界を構成している図 形(部分集合)だけに注目する. 例えば図 1(a) の図形は多面体であるから,その境界は複数の多角形 (b) で構成されている.また,(c) の円柱の境界は、図 (d) のように 二つの円盤と円筒上の曲面で構成されている.これらの境界を表す 図形を S とすると、S にはいくつかの共通する性質がある. 有界性 r 集合が有界な図形であるから,その部分集合である S も有 界な図形となる. 閉集合 S は,E 3 の閉集合となる.例えば多面体では,S を構成す る個々の多角形は (辺や頂点も含めて)E 3 の閉集合であるから, その有限個の和集合である S も閉集合となる. 2 多様体 図 2 のように図形 S のどんな点 p をとってきても,p を含 _ 2 ) と位相同型なも む S の開集合 (開近傍) で 2 次元の開円盤 (D のが存在する.このような図形を 2 多様体という.多面体の辺 1 (a) (b) (c) 図 1: 立体とその境界 上の点 q では,開近傍は,その辺を共有する二つの多角形上に またがって存在し,また頂点 q では,その頂点周りの多角形 にまたがって存在する. 0 向き付け可能 図 3 のように,面上の各点において,その点を中心 として,時計回り,あるいは反時計回りの指定を,面全体で一 斉に矛盾なく指定を行なうことができる.これに対して有名な メビウスの帯は向き付け不能である. 境界がない S 上を自由に動く点を考えると、どのように動いても、 S からはみ出すことがない。つまり、これは S に縁がないこ とを意味する。これを境界なしの 2 多様体という。より正確に は、S のどの点も S の内点になる場合である. 向き付け可能な閉曲面 3 E の部分集合で有界性と閉集合の性質を満たすものは,コンパク ト集合といいかえることができる.コンパクトで境界のない 2 多様 体を閉多様体あるいは閉曲面 (closed surface) という.さらに向き 付け可能性の条件を加え,これらのすべての条件を満たす図形を, 向き付け可能な閉曲面 という. 連結和 図 4(左図) に示すように,任意の向き付け可能な閉曲面 F は球面に いくつかのハンドルを取り付けて構成できることが知られている. 2 (d) P q q’ D 2 図 2: 2 多様体 ? 図 3: 向き付け可能性 3 あるいは (右図) のように,複数のトーラスをなめらかにつないだ 閉曲面と考えても良い.このように曲面をなめらかにつないだも のを連結和という.トーラスを T 2 で表すと、g 個の T 2 の連結和を 2 2 2 T #T 1 1 1 #T と書く. 閉曲面の分類定理 このときのトーラスの個数 (ハンドルの個数) を向きづけ可能な閉 曲面 F の種数 (genus) という.球面 (S 2 と書く) の種数は 0 であり, トーラス T 2 は種数 1 である.そして一般に任意の向きづけ可能な 閉曲面は,球面か,あるいはいくつかのトーラスの連結和と位相同 型であることが閉曲面の分類定理として証明されている. 図 4: 向き付け可能な閉曲面 図 5: r 集合の境界,実現不可能 実現可能性 (realizability) 4 向き付け可能な閉曲面 S は,球面あるいはトーラスをいくつか連結 したものに位相同型であることから,全空間を曲面の内部と外部に 分ける.つまり,S は E 3 を 2 つの領域に分ける.このうちの内部 の領域 X に S を加えたものは r 集合となる. つまり,すべての向き付け可能な閉曲面は r 集合をユニークに決め るのである.この逆,r 集合の境界は,必ずしも向き付け可能な閉 曲面にならないことは,図 5 に示す反例によってわかる.つまり, この図形は r 集合であるが,その境界は 2 多様体にならない。それ は境界のくびれた部分の点における開近傍は開円盤と同相にならな いからである. このような r 集合と境界の関係を,実現 (realization) という概念で 表す.つまり閉曲面 M とある r 集合 A の境界 @ A が位相同型ならば, A を M の実現と呼ぶ.またそのような M を実現可能 (realizable) で あるという.図 5 のような r 集合を実現とする閉曲面はない.また 射影平面 P 2 やクライン管のような向き付け不能な閉曲面は実現可 能でない. 閉曲面の展開図 閉曲面の性質を調べるために,閉曲面の展開図というものを用いる. 例えばトーラスを展開するには,図 6 のように閉曲面に切れ目を二 ついれて,平面に展開する.切れ目には a,a のように名前を付け, また切り裂いた方向に矢印を付けておく.これを使って平面図から トーラスを復元することができる.つまり,同じ矢印のついた辺同 士を,矢印の向きが一致するように張り合わせればよい. 0 展開図が四角形になるような閉曲面の例を図 7 に示す.この中で向 き付け可能な閉曲面は球面とトーラスだけである.その他の面は, 向きづけ不可能な閉曲面として知られているものであり,それぞれ クラインの壷,射影平面(P 2 という名前がついている)という.こ れらの向きづけ不可能な閉曲面の展開図を 3 次元空間で張り合わせ ることはできない.それは自己交差がおきてしまうからである.例 えば射影平面 P 2 では図 8 のような傷(自己交差線)が生じる.こ の形はクロスキャップ(十字帽)と呼ばれる. 図 7 の(4)のクラインの壷は、図に示すような貼り合わせとなる。 このような貼り合わせ方を、捩れハンドルによるつなぎ合わせと 言う. 5 図 7 の(2)のクラインの壷を張り合わせるのはちょっと分かり難 いかもしれない.図 1.2 に示すように、まず,四隅を一点に集める. そうすると,各辺がループになる.ループは円であるから,ループ 同士で張り合わせることができる.同図 (C) のように、そこで矢印 の向きが合うようにループ同士を張り合わせて行けばよい.この張 り合わせは、図 7 の (4) のクラインの壷と同じ要領で行う。この例 では、捩れハンドルを二つ使うことになる。これも3次元空間では 不可能な張り合わせである. 向きづけ可能な閉曲面の展開図 さて,一般に種数 g の向きづけ可能な閉曲面は 4g 角形に展開でき る。図 1.2(A) は g = 3 の例である。同じラベルの辺を,その矢印 の向きが一致するように張り合わせれば,任意の種数の閉曲面が得 られる.この例では、まず (B) のように a1, a2, a3 のラベルの付い た辺同士を貼り合わせる。次に、(C) のように中央で対応する 3 点 を貼り合わせる。そうすると、b1, b2, b3 のラベルのついた穴が 6 個できる (D)。このうち同じラベルのついた穴は、それぞれ向きが ことなるので、(E) のようにハンドルをつけてつなぐことができる。 これによって全ての切断線の貼り合わせが終わり、トーラスが三つ 繋がった閉曲面ができる。 1.3 閉曲面へのグラフの埋め込み 面分 (face) 多面体の境界が複数の多角形面から構成されているように、境界表 現では,境界をいくつかの面分に分割して表現する.これは,境界 の具体的な形を方程式などで表現する場合に便利なようにである. つまり面分が,ある基本的な方程式で表現できるような曲面 (平面 や球面,円柱面など) の部分集合になるようにしている. 境界表現では,この面分が表現の中心となるが,向き付け可能な閉 曲面という考え方だけでは,この面分という概念は出てこない.そ のためには,次に述べるグラフの埋め込みという操作が必要になる. グラフの埋め込み 図 12 で,5 面体の表面と球面 S 2 は位相同型であり,向き付け可能 な閉曲面である.5 面体を構成している頂点と辺を使ってグラフ (図 (b)) を定義する. 6 図 6: 閉曲面の展開図 図 7: 4 角形の展開図をもつ閉曲面 図 8: 射影平面 P 2 7 a1 b2 a1 b1 b1 b1 a1 a2 b3 b3 b2 a3 a1 a3 b1 b3 b1 a3 a2 a2 b2 b3 a2 a3 b3 b2 b3 b2 b2 (A) (B) (C) b1 b1 b2 b3 b1 b3 b1 b2 b3 b2 b3 b2 (E) (D) 図 9: 閉曲面の展開図の標準形 b b b a b b a b a a a a (A) (B) 図 10: 図 6 の (2) のクラインの壷の例 8 (C) b2 図 11: 閉曲面の展開図の標準形 (g=3 の場合) このグラフを平面の上に描くことを考える.グラフの各頂点に対応 した点を平面上に適当に配置して,隣接しているものどうしを曲線 (直線) で結ぶ.点の配置の仕方や辺の書き方によって,図の (c) の ようにグラフの絵は異なる.特に (2) と (3) のグラフには辺の無駄 な交差がない.このように辺同士が,共通に隣接する頂点以外では 交わらないようにできるとき,そのグラフを平面的グラフ (planar graph) といい,その平面上の図を,そのグラフの平面埋め込みとい う.さらに,平面上の図自身をグラフと考えるときには,それを平 面グラフ (plane graph) という.図から分かるように,平面的グラ フ (b) は,異なる平面埋め込み ((c) の (2) と (3)) をもつことがある. 連結グラフ グラフにおいて,任意の頂点から他の任意の頂点へ辺を辿って移る ことができる時,これを連結グラフという.なお,1頂点のみから なるグラフも連結グラフとする. 閉曲面グラフ 同様の考えで,今度はグラフを図の (d) のように閉曲面に埋め込ん でみよう.共通に隣接する頂点以外では交差しないように描かれた グラフを,そのグラフの閉曲面上への埋め込みという.さらに,平 面グラフと同様に,その埋め込まれた図自身をグラフと考えるとき には,それを閉曲面グラフという. 埋め込み可能 9 (a) S2 (b) (1) (2) (d) (3) (c) 図 12: グラフの埋め込み 10 グラフ G のある閉曲面上の埋め込みが存在する時,そのグラフはそ こに埋め込み可能であるという.平面グラフと同様に G は複数の埋 め込みをもつことがある. 1.4 2 胞体埋め込み 領域 図 13 のように,閉曲面に埋め込まれた閉曲面グラフ G は,閉曲面 をいくつかの領域に切り刻む.その各領域をグラフの領域 (region) という.この領域の性質について調べてみよう. 領域の境界 図 13 の領域 A の境界には辺と頂点が交互に並んでいる.それをあ る頂点を起点にして並べてみる. W : v 1 e1 v2 e2 1 1 1 ek vk+1 このようにすると,それぞれの vi ei vi+1 において vi ; vi+1 は ei の端 点である.さらに,最初の頂点 v1 と最後の頂点 vk+1 が一致してい る (v1 = vk+1 ) ことがわかる.このような W を閉歩道 (closed walk) という. 一般に領域 X の境界とは,領域 X のまわりにそってグラフ G をた どった時の閉歩道であると定義する.これを @X で表す.境界は複 数の閉歩道で構成されることもある.図の B や C の境界は 2 つの 閉歩道を持つ. 閉曲線による切断 図 14 のように,閉曲面に閉曲線を書き,それにそって閉曲面を切っ てみる.その結果によって,閉曲線にはいくつかのタイプに分けら れる. 1. 分離閉曲線/非分離閉曲線 閉曲面を二つに分離するものと,分離しないもの. 2. 可縮な閉曲線 分離閉曲線で,連続的に変形して 1 点につぶせるもの.すなわ ち単連結な領域 (開 2 胞体) の境界になっているものと,そう でないもの. 11 6A B C A 6C 6B 図 13: 閉曲面グラフの領域 図 14: 閉曲面上の閉曲線 C A B 図 15: 開 2 胞体 (2-open cell) 12 開 2 胞体領域 これを利用して、B のようなタイプの領域と A のような領域の違い をはっきりさせるために領域の内部に閉曲線を書き,その閉曲線を 連続的に変形して 1 点につぶしてみる.図 15 のように,A ではどの ような閉曲線も 1 点につぶすことができるが (可縮 (contractible)), B ではつぶすことのできない閉曲線があることがわかる.実際に B の境界である閉歩道にそった閉曲線はつぶせないのである.また、C の領域には非分離な閉曲線を書くことができるが、A にはできない。 のような領域を単連結 (simply connected) という.単連結な領域 の内部は開円盤 D_ 2 に位相同型である.このような開円盤 D_ 2 に位 相同型な図形を一般に開 2 胞体 (2-open cell) という.境界もふくめ た円盤 D 2 に位相同型な領域を閉 2 胞体という. A グラフの埋め込みの可能性 任意のグラフは適当な種数の閉曲面に埋め込み可能である.これは 次のように考えられる.まず,球面上にグラフを埋め込んでみる. 埋め込めない場合というのは,どこかで辺同士が重なってしまうこ とである.この重なりを解消するには,道路の立体交差のようなこ とを行う.つまり,橋を架けるようにしてトーラスを連結し,重なっ ている辺の内の一方を持ち上げてそのトーラスに載せてやるのであ る.このような操作を繰り返し,トーラスを連結していく内に,す べての重なりは解消し,埋め込みが完成する. グラフの最小種数 グラフ G を埋め込むことができ,しかも種数 (トーラスの数) が最 小になるような向きづけ可能な閉曲面を考える.この時の種数をグ ラフ G の最小種数といい, (G) で表す. 連結グラフの開 2 胞体埋め込み いかなる連結なグラフも向き付け可能な閉曲面に埋め込めることが 分かったが、さらに、そのすべての領域が開 2 胞体になるように埋 め込めるかどうか考えてみる.そのために、ある閉曲面埋め込みを 考え、その領域のうち,開 2 胞体でないものについて、それが 2 胞 体になるように曲面を修正する。 まず,図 16 のように、領域の境界が分離閉曲線となっていて開 2 胞 体でない場合は、領域がトーラスを含む場合であり,この時は,領 域に分離閉曲線を書いて,そのトーラスを切り離す.そして,切り 13 離したトーラスの代わりにその切口に円盤をはめ込み,その領域を 開 2 胞体とすることができる. また,領域の境界が分離閉曲線にならない場合は,図 17 のような 場合で,このときは非分離閉曲線 を書いて,曲面を切断し,その 切り口に二つの円盤をはめ込むことによってトーラスを消去するこ とができる.この二つの状況が重なっているときは,両者を適宜行 えばよい. このようにしてトーラスを消去してゆくと,ある所で,すべての領 域は開 2 胞体になり、それ以上のトーラスは消せなくなる。つまりグ ラフを埋め込むために必要な最小の個数のトーラス (G の種数 (G) 個) だけが残る. 図 16: トーラス消去による開 2 胞体埋め込みの生成 まとめると,連結グラフ G が最小種数 (G) 個の閉曲面に埋め込ま れているときには,どの領域も開 2 胞体になっている.このような すべての領域が開 2 胞体になっている埋め込みを 2 胞体埋め込み (2-cell embedding) という. 三角形埋め込み 2 胞体埋め込みの各領域は唯一の境界 (閉歩道) を持つ.特にすべて の領域の閉歩道の長さ (閉歩道に含まれる辺の数) が 3 の時,三角形 14 δ 図 17: 非分離な場合の開 2 胞体埋め込みの生成 埋め込みという.さらにグラフが単純グラフ (ループや多重辺がな いグラフ) の時には,その三角形埋め込みを三角形分割という. オイラーの公式 閉曲面 F への 2 胞体埋め込みにおける,連結な閉曲面グラフの頂点 数,辺数,領域数には関係がある.それぞれの値を p : 頂点数, q : 辺数, r : 領域数 としたときに,p 0 q + r の値: ( )=p0q+r F は閉曲面 F を固定すれば,グラフやその 2 胞体埋め込みのしかたに よらずに一定となる.この値をオイラー標数 (Euler Characteristics) という.オイラー標数については次のオイラー式 (Euler's Formula), あるいは Euler-Poincare の式が成立する.すなわち,F を種数 g の 向き付け可能な閉曲面とする.F 上の任意の連結グラフ G の 2 胞 体埋め込みに対して, ( ) = p 0 q + r = 2 0 2g F 位相不変量 オイラー標数 (F ) は位相不変量.つまり,位相同型 (同相) な閉曲 面のオイラー標数は一致する.球に同相な図形では 2,トーラスに 同相な図形では 0 である.これは,その図形のグラフによる分割, すなわちグラフの埋め込み方に依存しない.問題となるのは,埋め 15 込みのしかたであり,上では 2 胞体埋め込みという条件を課した. この条件の元での埋め込みであれば,埋め込まれたグラフの頂点数, 辺数,領域数の間にこの式が成立する. 極端な場合 (図 18) 1. (G) = fv0 g,辺の集合 E (G) = (境界として長さ 0 の閉歩道も許す.球面から一点を除いたも のは,開円盤と同相なので,領域は開 2 胞体) V p 2. V 0q+r =100+1=2 (G) = fv0 g,辺の集合 E (G) = f(v0; v0 )g p 0q+r =101+2=2 v0 v0 (1) (2) 図 18: ある極端な場合 1.5 2 胞体埋め込みのローテーション 境界表現とグラフの 2 胞体埋め込みの関係が明らかになったところで、 ここからは 2 胞体埋め込みを表すためのデータ構造について考える。 ローテーション 図 19 は,K5 と呼ばれるグラフとその 2 胞体埋め込みである.頂点 v1 には,辺 v1 v2 ; v1 v3 ; v1 v4 ; v 1 v5 が接続している.そして,それら 16 v5 R5 v2 R1 R4 R2 v1 R3 v4 v3 K5 図 19: グラフ K5 のトーラスへの 2 胞体埋め込み の辺を介して,頂点 v2 ; v3 ; v4 ; v5 は,v1 とつながっている.この頂点 の集合 fv2 ; v3; v4; v5 g を v1 の近傍といい,N (v1) と書くことにする. グラフが埋め込まれている閉曲面は向き付け可能であるから,曲面 の各点のまわりに,一斉に" 時計回り" あるいは" 反時計回り" の向 きを決めることができる.いまそれを紙面上で反時計回りとする. 頂点 v1 に接続している 4 本の辺を,ちょうど時計の針が v1 の回り に反対に回るように並べると, v1 v2 ; v1 v3 ; v1 v4 ; v1 v5 が得られる.あるいは v1v3 を始まりとすれば, v1 v3 ; v1 v4 ; v1 v5 ; v1 v2 ただし vi vj は頂点 vi と vj とを結ぶ辺である. 同様にして辺を介して接続している N (v1) の頂点 v2 ; v3 ; v4 ; v5 を並 べると, (v2 ; v3 ; v4 ; v5 ) あるいは, (v3 ; v4 ; v5 ; v2 ) あるいは, (v4 ; v5 ; v2 ; v3 ) あるいは, (v5 ; v2 ; v3 ; v4 ) が得られる.これを v1 のまわりのローテーション (rotation) とい い,1 で表す. 17 循環置換 このローテーションを見れば,例えば v2 の" 次の" 頂点は v3 であり, v3 の" 次の" 頂点は v4 であり,…,v5 の" 次の" 頂点は v2 であるこ とが分かる.これによって,ある頂点から" その次の頂点" を対応 させる関数を定義することができる.いま頂点 v1 のローテーション を考えているので,この関数を 1 と書くと1 ( ) = v3 ( ) = v4 ( ) = v5 ( ) = v2 1 v2 1 v3 1 v4 1 v5 このような関数 1 : mutation) という. ( )! N v1 ( ) を一般に巡回置換 (cyclic per- N v1 同様にして,頂点 v2 について考えてみると,ローテーションは 2 = (v 1 ; v5 ; v4 ; v3 ) となり循環置換 2 は, ( ) = v5 ( ) = v4 ( ) = v3 ( ) = v1 2 v1 2 v5 2 v4 2 v3 このようにしてすべての頂点 vi に循環置換 i を決めることができ る.グラフ全体では,これを並び (1 ; 2; : : : ; 5 ) で表す. 巡回置換の並びと 2 胞体埋め込み わざわざこのような概念を定義したのは,各頂点における巡回置換 の並びの全体 5 = (1 ; 2; : : : ; 5 ) と,2 胞体埋め込みの間には強い 関係があるからである. これまでの議論によって,任意のグラフは向き付け可能な閉曲面に 埋め込むことができ,しかもそのグラフの最小種数に等しい種数の 閉曲面に埋め込まれた時にはすべての領域が開 2 胞体になることを 示した. 1 1 の添え字の 1 は、頂点番号の 1 を表す. 18 一般に,連結なグラフの 2 胞体埋め込みのしかたは何通りかあるの で,グラフだけではその埋め込みは一意に決まらない.問題は,何 を情報としてグラフに追加すれば,ある一つの埋め込みを特定でき るかということである.これが分かれば,グラフにその情報を追加 することによって,2 胞体埋め込みを一意に決めることができる.つ まり閉曲面の表現として利用できるのである. 次項では、ある 2 胞体埋め込みと巡回置換の並び (1 ; 2 ; : : : ; 5 ) が 1 対 1 の関係にあることが示される.つまり各頂点において,その 近傍の頂点がどのような円順序で並んでいるかということを定める と,2 胞体埋め込みが決まるのである.これについて述べる前に,上 で述べたことを一般的にまとめておこう. 定義 { 近傍 グラフ G の頂点の集合を V (G),辺の集合 E (G) とすると,頂 点 vi の近傍 N (vi ) は次のように定義される. ( ) = fvj 2 V (G)jvi vj 2 E (G)g N vi { ローテーションと巡回置換 グラフ G の 2 胞体埋め込みにおいて,閉曲面の向き (時計方向 あるいは反時計方向) を決めると,各頂点 vi 2 V (G) において, その近傍 N (vi ) の頂点 uj を,vi の周りでその向きに並べるこ とができる. i = (u1 ; u2 ; u3 ; : : : ; un ) ただし,n は vi の次数 (vi に接続する辺の数).これを vi のロー テーション i という vi のローテーションに従って次のように 巡回置換 i : N (vi ) ! N (vi ) を定義する. ( ) 7! u(j +1)mod n i uj 回転埋め込みスキーム 各頂点における巡回置換の並びの全体 5 = (1; 2 ; : : : ; m ) によっ て 2 胞体埋め込みが一意に決まることを示そう.その逆が成り立つ ことは明らかだから、5 によって,埋め込みの 2 胞体領域が曖昧な く決まることを示せばよい.そのために、5 によってすべての領域 の境界の閉歩道が曖昧なく辿れることを示す。 19 v5 R1 v1 v4 v2 v3 図 20: 領域のトレース 図 19 の例には,五つの領域 R1; R2 ; : : : ; R5 がある.この内の R1 の境 界となる閉歩道上の辺をたどってみよう (図 20).辺は領域の周りに 並んでいるので,時計周りに,辺 v1v2 からスタートして,v2 v5 ; v5 v1 とたどる.頂点には複数の辺が接続しているので,次にたどるべき 辺を決めなければならない.例えば v1 v2 から始めた時には,頂点 v2 のまわりには 4 個の辺があるが,その中から辺 v2v5 を選ばなければ ならない.これを v2 のローテーションによって決めるのである.つ まり,v2 のローテーション 2 = (v1 ; v5 ; v4; v3) から,v2 のまわり に反時計方向にまわったときの v1 の次の頂点が v5 であることが分 かり,それによって v2 において v1v2 という辺の次にたどるべき辺 は,その v5 と v2 を結ぶ辺 v2 v5 であることが分かる.関数 2 を使 えば,v5 = 2 (v1 ) であるから、v2 2 (v1 ) と書ける.v2v5 の次の辺は v5 5 (v2 ) である.このようにしてローテーションを使って領域 R1 の 境界をたどることができたが,同様にしてすべての領域の境界をた どることができる. これをもう少し詳しく見てみよう.この方法では境界の辺をたどる" 向き" が重要である.そこで,図 21 のようにそれぞれの辺を,二つ の反対方向を向いた有向辺の対と見なす.グラフは有向グラフとな る.これを D とする. から vj への有向辺を (vi ; vj ) と書けば,領域 R1 の境界,すなわち 例題の R1 は次のように書ける. vi (v1 ; v2 ); (v2 ; v5); (v5 ; v1) 20 vi vj vi vj 図 21: 有向グラフへの置き替え あるいは (v1 ; v2 ); (v2 ; 2 (v1)); (v5 ; 5(v2 )) (1) そこで,グラフ D の辺の集合 E (D) の上の写像 ^ : E (D) ! E (D) を ^ (a) = ^ ((vi ; vj )) = 定義する.ある辺 a = (vi ; vj ) 2 E (D) に対して ^ (vi ; vj ) と書くと, ^( vi ; vj ) (vj ; j (vi )) (2) 写像 ^ は E (D) の上の 1 対 1 の写像であるから,E (D ) の置換 (permutation) になっている. 式 (1) と式 (2) とを比べれば, ^ (a) がある領域をたどったときの辺 a の次の辺を表していることが分かるであろう.そこで,ある辺 a に ^ を繰り返し適用すると,領域を一周して a にもどる.例えば, v1 ; v 2 ^( ) = (v2 ; 2(v1 )) = (v2; v5 ) v2 ; v 5 ^( ) = (v5 ; 5(v2 )) = (v5; v1 ) ^( ) = (v1 ; 1(v5 )) = (v1; v2 ) v5 ; v 1 これを簡略化して, v1 0 v2 0 v5 0 v1 とかく.これを軌道 (orbit) という.この軌道は R1 の境界に対応し ていることがわかる. 同様にして適当な辺から始めて ^ を繰り返し適用し,軌道を求める と,次の五つの軌道が得られる. R1 : v1 0 v2 0 v5 0 v1 R2 : v1 0 v3 0 v2 0 v1 21 R3 : v1 0 v4 0 v3 0 v1 R4 : v1 0 v5 0 v4 0 v1 R5 : v2 0 v3 0 v5 0 v2 0 v4 0 v5 0 v3 0 v4 0 v2 これらはそれぞれの領域に対応している. 注意すべき点は,有向辺のグラフ D の、すべての辺は必ずどれかの 軌道に含まれているということと,ある軌道に含まれる辺は他の軌 道には含まれない,ということである.つまりすべての辺は、どれ か一つの軌道にだけ含まれているので、 ^ 軌道 (の全体) は有向辺の 集合 E (D) の分割 (partition) になっている. グラフ D は,元のグラフ G の各辺を,二つの反対方向を向いた有 向辺の対と見なすことによって得られた.元のグラフ G について考 えると,G の各辺は 5 つの軌道の中にちょうど 2 回現れ,相異なる それぞれ向きに 1 回ずつ現れることがわかる. 以上見てきたことは,グラフ K5 の 2 胞体埋め込みにしたがって 5 = (1; 2; : : : ; 5 ) を一意に定めることができ,また逆にある 5 によっ てグラフ K5 の 2 胞体埋め込みをあいまいなく決めることができる, ということである. この事実が一般的に成立することを証明でき、次の定理となる。 定理 1 グラフ G を (非自明な) 連結グラフで V (G) = fv1; v2 ; : : : ; vp g とする.G の向き付け可能な閉曲面への 2 胞体埋め込みのそれぞれ に対して,p 項の並び 5 = (1 ; 2; : : : ; p ) が一意に存在する.ただ し,i = 1; 2; : : : ; p に対して i : V (i) ! V (i) は,vi に接続する頂 点 (V (i) の要素) を vi のまわりに反時計方向順に並べた時の巡回置 換を表す. 逆に,5 に対して,ある向き付け可能な閉曲面への 2 胞体埋め込み が存在する.ただし,その埋め込みにおいて,各 vi ; (i = 1; 2; : : : ; p) に接続する頂点を vi のまわりに反時計方向順の並びは i によって 定義される. 1. M. Behzad, G. Chartrand and L. Lesniak-Foster: Graphs & Digraphs, Wadsworth International Group, (1979) 2. 前原,根上:幾何学的グラフ理論,朝倉出版 (1992) 3. 瀬山士郎:トポロジー:柔らかい幾何学,日本評論社 (1988) 22 2 境界表現のデータ構造 2.1 グラフ上の隣接関係 前節では,ある立体の境界を考え,そこにグラフを埋め込み,2 胞体に 分割した.ここではそのような 2 胞体埋め込みの閉曲面グラフを計算機 上に記述するためのデータ構造を考える.また、実用性から 2 胞体埋め 込みの条件の緩める方法についても紹介する。 2 胞体埋め込みを表現する情報は,グラフ G(V ; E ) と巡回置換 5 前節まで領域と呼んでいたものは,立体の面あるいは面分 (face) に 対応するものである.ここから先は面分と呼ぶことにする.また, 辺を稜線と呼ぶこともある. ( ) の表現 グラフを表現するには,辺にその両端の頂点を関連付ければよい. データ構造 (レコード,あるいは構造体) としては, G V; E { vertex:一つの頂点を表現するデータ構造 { edge:一つの頂点を表現するデータ構造 Pascal 風に書くと, type edge = record vertex1: ^vertex; vertex2: ^vertex; end; 5 の表現 は頂点 vi において,vi に接続する頂点を反時計周りに並べるもの であった.一つの方法は,この並び (循環) をリストとして表現し, 頂点に付与する方法がある。しかし、接続する頂点の数によってリ ストの長さが変化する可変長データとなるので扱いが面倒である. 別の方法として,vi に接続する辺にこの情報を持たせる.つまり, 図 22(1) で,頂点 vi について,i (vj ) = vk の情報を,(2) のように 『頂点 vi の周りに,辺 ea から反時計方向に回った次の辺は eb 』を表 現することによって表す. 23 vk vk vk vl eb eb eb eb vi vi vertex1 vertex1 vi ccw1 ea ea ccw1 ea vj vj (1) cw1 ccw2 vj vertex2 ccw2 vertex2 (2) (3) (4) 図 22: 巡回置換の表現 (3) に示すように,辺 ea には二つの頂点が接続するので,そのうちの どちらの頂点周りに回るのかを指定するする必要がある.vertex1 の周りに反時計方向に回ったところにある稜線をccw1,vertex1 の 周りに反時計方向に回ったところにある稜線をccw2 とすると, type edge = record vertex1: ^vertex; vertex2: ^vertex; ccw1: ^edge; ccw2: ^edge; end; ついでに,(4) のように時計方向の巡回置換の情報も持たせるのが 有名なウィングドエッジデータ構造である. 頂点のデータ構造 辺に の情報をもたせたときには、頂点のデータとしては,その頂 点に接続するどれか一つの辺を参照すればよい. type vertex = record edge: ^edge; end; 24 cw2 稜線中心のデータ構造 このように,境界表現では主に稜線にグラフの位相構造の情報を持 たせることが多い. 半稜線 (ハーフエッジ) 前節の巡回置換を用いて領域の境界を辿るところで見たように,一 つの辺を,二つの有向辺に分けて考えると,境界を辿るのが容易に なる.この有向辺に対応するのが半稜線 (half edge) である. 図 23 では,一つの辺を二つの半稜線に分け,半稜線の対を作る.そ して,それぞれ半稜線の終端の頂点がどれであるかと,その頂点 の周りに反時計方向に回った時の次の半稜線がどれかを情報として 持つ. mate vertex next next half edge 図 23: 半稜線 (ハーフエッジ) type half_edge = record mate: ^half_edge; vertex: ^vertex; next: ^half_edge; 対の一方の半稜線 終端の頂点 終端の頂点の周りに次の半 稜線 end; 25 頂点には,その頂点に入ってくる半稜線の一つを表す. type vertex = record half_edge: ^half_edge; end; 頂点v の周りに半稜線を回り,頂点v に接続する頂点を反時計回り に列挙するには, start := v.half_edge; he:=start; repeat next := he.next; writeln(next.vertex); he := next.mate; until(he = start) 以上のようにしてグラフ G(V; E ) と巡回置換 5 が表現できる.そし てこれらから領域 (面分) の境界情報、つまり、境界を構成する閉歩 道は、次のような手続きによって導出することができる. start := he; repeat writeln(he); he := he.next; until(he = start) この手続きによって、ある半稜線 (he) からスタートして、その半稜 線が境界となっている面分の境界を抽出することができる。つまり、 境界上の半稜線を、面分の反時計周りに列挙することができる。 一つの面分を辿り終わり、もし、まだ辿られていない半稜線があっ たら、その中から一つを選んで、上記の手続きを行えば、また別の 面分の境界が抽出される。これを、すべての半稜線が辿られるまで、 繰り返せば、すべての面分を求めることができる。 26 しかし,面分のデータが必要になる度にこの計算を行うのは面倒だ し,また,曲面の方程式のデータなども表現する必要があるので, データ構造として面分を表現するものを用意する。そのデータ構造 では、面分を構成するある半稜線を参照するようにし、また、反対 に、半稜線からは、それが境界となっている面分を参照するように する。 { face:立体の面分を表現するデータ構造 これに加えて,複数の立体を扱うために, { object:一つの立体を表現するデータ構造 object vertex edge face 図 24: 境界表現データ構造の要素 面分の半稜線データ構造の拡張 半稜線は,ある面分の境界を構成しているので,その面分を参照す るようにする. type half_edge = record mate: ^half_edge; vertex: ^vertex; next: ^half_edge; face: ^face; end; <--- 面分のデータ構造 面分は,その境界を構成する半稜線の一つを参照する. 27 type face = record half_edge: ^half_edge; end; 立体のデータ構造 立体 (object) は,その立体に属する面分の集合をデータとしても つ.実際には同じ立体に含まれる面分同士を双方向リストにし,立 体からはその面分の一つを参照する. type object = record face: ^face; end; type face = record half_edge: ^half_edge; prev_face: ^face; next_face: ^face; end; 実際には,データのアクセスを高速化するために,さらに補助の データを表現する. 位相要素の隣接関係 境界表現のデータ構造には,頂点,辺,面分という三つの要素があっ た.頂点,辺,面分をそれぞれ V,E, F で表すと,それらの間には, 次の九つの隣接関係が考えられる. VV EV FV VE EE FE VF EF FF 頂点と頂点の隣接関係 辺と頂点の隣接関係 面分と頂点の隣接関係 頂点と辺の隣接関係 辺と辺の隣接関係 面分と辺の隣接関係 頂点と面分の隣接関係 辺と面分の隣接関係 面分と面分の隣接関係 28 VV FV EV VE FE EE VF EF FF 図 25: 位相要素の隣接関係 29 参考文献 様々な境界表現のデータ構造とそれらの解析については,下記の Weiler85 が詳しい. Baumgart75 B.G.Baumgart: A polyhedron representation for computer vision, Proc. of National Computer Conference (1975). Mantyla84 M.Mantyla:An Introduction to Solid Modeling,Computer Science Press, (1988). Requicha80 A.A.G.Requicha:Representaion for Rigid Solids: Theory,Methods and Systems, ACM Computign Surveys, Vol.12, No.4 (1980). Weiler84 K.Weiler:Topology as a Framework for Solid Modeling, Extended Abstract for Graphic Interface '84 (1984). Weiler85 K.Weiler:Edge-Based Data Structures for Solid Modeling in Curved-Surface Environments, IEEE CG&A, January (1985). Weiler86 K.Weiler: Non-Manifold Geometric Modeling, Extended Abstract for IFIP W.G. 5.2 Workshop on Geometric Modelling (1986). Woo85 T.C.Woo:A Combinatorial Analysis of Boudary Data Structure Schemata, IEEE CG&A, March (1985). 千代倉 85 ソリッドモデリング, 工業調査会 (1985). 中塚 85 中塚久世:形状モデルと知識工学 (1), Pixel, No.29 (1985 年 2 月 号) (1985). 2.2 表現の拡張 面の穴 領域を開 2 胞体だけでなく,内部に穴を持つような領域に拡張する. これは,図 26 に示すように,面分に穴があるような場合に対応し, 開 2 胞体から,いくつかの閉 2 胞体を切りとったものに同相なもの と考えられる.この穴のことをリング (ring) という. 一つの方法は,図 (2) のように,穴と外周の間にそれらを橋渡しす るような辺を入れて開 2 胞体とするものである。ここで、橋渡しを する辺の右側と左側の面が、同じ面になっていることに注意するこ と。このような場合でも循環置換に基づいた表現には問題がない。 30 loop face (1) (2) (3) 図 26: ループ このような橋渡しによる方法は、" 穴を消している" ようなもので あり、実用的にはデータ表現上で穴があることが表現できたほうが よい。穴を表現する場合の問題は,これまでは一つだった面分の境 界を表す閉歩道が複数になることである.そのために、(3) では境 界を構成するそれぞれの閉歩道をループ (loop) というもので表し, 面分の境界を複数のループ表す. ループのデータ構造 ループは,これまでの面分 (face) に代わるものであるから,今まで のface をloop に書き直す. type loop = record half_edge: ^half_edge; prev_loop: ^loop; <--next_loop: ^loop; <--end; ここで,prev_loop, next_loop は,同じ面分に属するループをつ ないだ双方向リストを作るもの. また、次の様にhalf_edge からはloop を参照する. type half_edge = record mate: ^half_edge; vertex: ^vertex; 31 loop next: ^half_edge; loop: ^loop; end; <--- さらに,face からは,その境界にあるどれか一つのループを参照 する. type face = record loop: ^loop; prev_face: ^face; next_face: ^face; end; また、面の中に孤立点のある場合,頂点 1 個からなるloop が存在す ることになる。これを表すためにvertex にもloop へのポインター を用意する必要がある。 オイラー式 面の穴 (内部ループ) を扱うことによって、オイラー式も拡張する必 要がある。頂点,辺,面分の数を,それぞれ v ,e,f とする.また種 数 g は立体に付けられたハンドルの数であるので h で表す.厳密に オイラー式を定義することはできないが,面の穴の数を r とすると v 0 e + f 0 r = 2 0 2h (3) が成り立つ。この式にはあまり厳密な根拠はないが,図 26 の (2) か ら (3) への変化を考えると,r 個の穴を消すには,r 個の辺を加えれ ばよい.すなわち穴を消した後の稜線の数 e は,消す前の稜線の数 を e とすれば,e = e + r となる.e については,元々のオイラー式 0 0 0 v 0 e + f = 2 0 2h 0 (4) が成り立つので,この e を e = e + r で置き換えると,式 (3) が得 られる. 0 0 32 object shell shell shell 図 27: シェル 複数の閉曲面を持つ立体 立体の中には,内部に空洞があるものがある.この場合,立体は複 数の閉曲面を境界として持つことになる.一つ一つの閉曲面を殻と かシェル (shell) と呼ぶ. データ構造の拡張 { これまでのobject をshell に置き換える. type shell face: prev: next: end; = record ^face; ^shell; ^shell; prev とnext は,同一object に含まれるシェルのリストを表す.ま た,face は同一shell に含まれるものをリストでもつ. object は一つのshell を参照するようにする. type object = record shell: ^shell; end; 33 オイラー式 シェルが s 個あるとして,i 番目のシェルについては,オイラー式: vi 0 ei + fi 0 ri = 2 0 2hi が成り立つので,これを加え合わせると,立体についてのオイラー 式は, v 0 e + f 0 r = 2s 0 2 h ダイアグラム(図 28) next 1 1 object 1 n shell 1 n face 1 n loop 1 mate 1 half_edge 1 1 1 1 vertex 図 28: データ構造のダイアグラム 2.3 幾何表現 頂点は座標値,稜線には曲線,面分には曲面を対応付ける. 稜線は,曲線の一部.面分は曲面の一部 (トリム曲面). 制約 { 頂点の座標は,頂点で交差する曲面群の交点となる. 34 { 頂点の座標は,それを端点とする辺の曲線上にある. { 稜線はそれを境界とする二つの面の曲面上にある. 35 3 オイラー操作 (Euler Operation) 境界表現における立体モデリングとは,境界表現のデータ構造を操作 することに他ならない.そのための基本的な操作にオイラー操作と呼ば れるものがある.理論的にはオイラー操作だけで任意の立体を生成する ことができる. 立体は拡張されたオイラー式 v 0 e + f 0 r = 2s 0 2 h を満たすことを要請される.例えば,ある立体に稜線を一つ加える ことを考えると,e ! e + 1 になるので,上式を満たすためには,頂 点や面などの他の要素の数が変わる必要がある。つまり,他の要素 を新しく生成したり,消去したりする必要がある. 例えば,図 29 では,右から左へと稜線を一つ追加する様子を示し ている.(1) では,稜線とともに頂点を一つ生成し,(2) では,面分 を追加し,(3) では,穴を消去している. 操作の名前 { 要素を生成することを M(make) で表し,消すことを K(kill) で 表す. { 要素については,V(vertex), E(edge), F(face), R(ring), S(shell), H(handle) 逆操作 MEV,MEF,MEKR には,その逆の操作,KEV, KEF, KEMR が 存在する. オイラー操作群 { MVFS/KVFS(図 30) { MEV/KEV(図 31) { MEF/KEF(図 32) { KEMR/MEKR(図 33) { KFMRH/MFKRH(図 34) { KFSMR/MFSKR(図 35) 36 (1) MEV v KEV (2) MEF f1 e f1 e KEF (3) f2 MEKR h KEMR e 図 29: 稜線の追加と削除 f MVFS NULL v KVFS 図 30: MVFS/KVFS 37 MEV KEV MEV KEV MEV KEV 図 31: MEV/KEV MEF KEF MEF MEF KEF KEF 図 32: MEF/KEF 38 KEMR r MEKR KEMR r MEKR f r KEMR MEKR 図 33: KEMR/MEKR 39 r f r shell make handle KFMRH MFKRH 図 34: KFMRH/MFKRH 40 shell shell kill shell f KFSMR r MFSKR 図 35: KFSMR/MFSKR 41 例題(図 36) オイラー操作の性質 { オイラー式 v 0 e + f 0 r = 2s 0 2h を次の形に書き直してみる. v 0 e + f + 2h 0 r 0 2 s = 0 0 1 0 2)t (v (1 0 1 1 2 e f h r )=0 s { 最後のものを除く 5 つの操作での要素の増減をベクトルで表し てみる. operator MEV MEF MVFS KEMR KFMRH KEV KEF KVFS MEKR MFKRH v e f h r s 1 0 1 0 0 1 1 0 -1 0 0 1 1 0 -1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 -1 0 -1 0 0 -1 -1 0 1 0 0 -1 -1 0 1 0 0 0 0 -1 0 0 0 -1 -1 0 0 -1 0 0 これらのベクトルはオイラー式を満たす.また,上の五つはお互い に独立なベクトルであり、また同様に下の五つもお互いに独立なベ クトルである.つまり、一つのオイラー操作は、他の操作の合成に よっては実現できない。 (v e f h r s) をベクトルとする 6 次元の空間を考える。座標値は 整数値しかとらないので、整数格子空間となる。オイラー式: v 0 e + f + 2 h 0 r 0 2s = 0 は、この空間の超平面となり、すべての立体をこの平面上の点に対 応させることができる。 上記の五つのベクトルは,この超平面の空間の基底となる.よって, 超平面上の任意の点は,このベクトルの線形結合で表現できる.つ まり,これはオイラー操作で任意の立体が作れることを意味する. 42 さらに、ある立体を作るのにどのオイラー操作が何回必要かを計算で きる.MEV,MEF,MVFS,KEMR,KFMRH をそれぞれ n1 ; n2 ; n3; n4 ; n5 回適用して生成される立体の要素の数を (v e f h r s) とすると, (v e f ) = (n1 h r s n2 n3 2 6 6 6 6 n5 ) 6 6 6 4 n4 1 1 0 0 1 1 1 0 1 0 01 0 0 0 01 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 3 7 7 7 7 7 7 7 5 これを解くために, (1 0 1 1 2 0 0 1 0 2)t (v e f h r s )=0 の係数ベクトルを行列の一番下の行として次のように追加する. (v e f h r ) = (n 1 s n2 n3 n4 n5 2 6 6 6 6 6 0) 6 6 6 6 6 4 1 1 0 0 1 1 1 0 1 0 01 0 0 0 01 1 01 1 3 7 7 7 7 7 7 7 7 7 7 5 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 2 01 02 (n1 n2 n3 n4 n5 0) にも、最後の要素として 0 が追加されている ので、方程式としては等価である。 追加した一番下の行ベクトルは,その上のすべての行ベクトルに独 立なので,この行列は正則.逆行列を求めると, (n1 n2 n3 n4 n5 0) = (v e f h r 2 9 05 2 3 02 1 6 6 3 5 02 03 2 01 6 6 1 6 03 7 2 3 02 1 6 s) 6 12 6 06 2 4 06 8 2 6 6 4 3 5 02 9 2 01 06 02 8 06 4 02 例えば,図 34 の立体では,(16 24 10 1 2 1) であるから,上式に 代入すると, (n1 n2 n3 n4 n5 0) = (15 10 1 1 1 0) 43 3 7 7 7 7 7 7 7 7 7 7 5 4 オイラー操作による立体操作 4.1 基本立体生成 基本立体を生成する手続き procedure block; begin { create bottom face } MVSF(f1, v1); MEV(v1,v2,e1); MEV(v2,v3,e2); MEV(v3,v4,e3); { create top face } MEF(v1,v4,f1,f6,e4); { create sides } MEV(v1, v5, e5); MEV(v2, v6, e6); MEV(v3, v7, e7); MEV(v4, v8, e8); MEF(v5, v6, f6, f2, e9); MEF(v6, v7, f6, f3, e10); MEF(v7, v8, f6, f4, e11); MEF(v8, v5, f6, f5, e12); end 掃引操作 面を持ち上げて立体にする. sweep(F: face) begin for (all loops L of F) do begin firstv := first vertex of L; MEV(firstv, firstup, newe); 44 (1) v7 e10 e11 v6 v8 e12 e7 e9 v5 e8 e3 e6 e2 v3 e5 v4 v2 e1 e4 v1 図 36: block prevup := firstup; nextv := next vertex of L; (2) while(nextv <> firstv) do begin MEV(nextv, up, newe); (3) MEF(prevup, up, F, newf, newe); (4) prevup := up; nextv := next vertex of L end; MEF(prevup, firstup, F, newf, newe); end; end 4.2 切断操作 切断操作とは,ある平面 P と立体 A が与えられた時に,A を平面で切 断して,平面の上方にある立体と下方にある立体に分割すること.ここで は,多面体の分割を考え,簡単のために頂点は平面上にないものとする. 1. 図 38 の (2) のように,稜線と平面との交点を計算して,交点がある 45 up fisrtup -> prevup L newe F nextv up newe prevup nextv nextv 図 37: sweep 46 newe nextv firstv firstv prevup newf prevup newe prevup newf firstup A P null edge (1) (2) null face (3) (4) 図 38: split 47 場合は,交点において頂点を二つ作る (MEV を 2 回).この頂点の 間の長さが 0 の稜線を空稜線 (ヌルエッジ) という. 2. (3) のように,対となる空稜線を探し,それらの間に MEF によって 空面分 (ヌルフェース) を作る.(凹多角形でもこのような対は必ず 作ることができる.) 3. (4) のように,全ての空稜線を KEF と KEMR によって削除する. KEMR は最後の稜線の削除に使う. 4. MFSKR によってシェルを二つに分ける(図 39). 48 MEV*8 ME F*8 KEF*3 KEM R MFSKR 図 39: cut 49 5 集合演算 50 6 インバージョンアルゴリズム M. Mantyla : An Inversion Algorithm for Geometric Models, ACM Computer Graphics, Vol. 16, No. 3, (Proc. SIGGRAPH '82) pp.5159 (1982). 図 40 のように、立体に対してオイラー操作を適用し,立体を消去 する (空の立体にする).この操作の列を記録する。 オイラー操作は可逆なので,記録されたオイラー操作の列を後ろか ら辿り、それぞれの操作の逆操作を適用すれば,元の立体が復元で きる. つまり,オイラー操作の列を立体の表現とすることができる. インバージョンアルゴリズム ある立体を空の立体に変換するオイラー操作の列を求めるアルゴリ ズム スケルトン ハンドルのある場合が難しい.ハンドルは MFKRH で消去する.そ のためにアルゴリズムは,次のスケルトンと呼ばれるモデルをまず 生成する. スケルトンとは,そのすべての稜線において,両側の面分が等しく, かつ,ループが異なるようなモデル (図 41). スケルトンの中の稜線は,ハンドル部分の境界になっているので, ハンドルを容易に検出できる.このような稜線において,図 42 の ように,MFKRH を行ないハンドルを消去する. インバージョンは次の三つの手続きで行なわれる. 1. make skeleton 2. remove handle 3. remove rings and objects make skeleton スケルトンを生成する手続きは,スケルトンの稜線の条件に反する ような稜線を消去することを基本とする.稜線を分類し,適当なオ イラー操作により消去する (図 43). 51 f1 KEF KEF KEF KEV KEV KEF KEF KEV KEV f1 KEV f1 KEV NULL KEV KVFS 図 40: インバージョンの例 f loop f 図 41: スケルトン 52 f2 h f’ e r e r MFKRH f f h r f f e f’ MFKRH r f h f r MFKRH f f’ e f h f MFKRH 53 図 42: ハンドルの消去 f’ 注意 ここでは,半稜線とともに稜線をデータ構造としてもつこと にする.一つの稜線に対して,右と左に一つずつ半稜線がある. make_skeleton(S: solid) begin for all edges E of S do if E.right_face = E.left_face then if E.right_loop = E.left_loop then if E.vertex1 is adjacent to only to E then KEV(E, E.vertex1) else if E.vertex2 is adjacent to only to E then KEV(E, E.vertex2) else KEMR(E) else ignore E else KEF(E) end; ---(1) ---(2) ---(3) ---(4) remove handle make skeleton によって,立体はスケルトンとなるので,そのすべ ての稜線において,MFKRH によってスケルトンのハンドル (とリ ング) を消去し,面分を作る. 面分を作ると、スケルトンを構成していた稜線の両側の面分は、相 異なるものになるので、再度 make skeleton(S) を適用して稜線を 消去する。このようにして全ての稜線を消去できる。 remove_handle(S: skeleton) begin while edges left in S do begin E := any edge of S; F := E.left_face; MFKRH(F, F', E); make_skeleton(S); end end; 54 (1) (2) KEV E (3) KEMR E (4) KEF E 図 43: make skeleton の場合分けの様子 55 remove rings and objects remove handle の結果,すべての稜線はなくなり,立体は一つの面 とその中の (孤立する) 頂点,リングだけになる.この頂点を MEKR と MEV によって消してゆく.最後の頂点は,KVFS で消去し,こ れで立体は空になる (図 44)。 f r1 f e v v1 r2 MEKR v2 f v v1 r2 v KEV v2 r2 v2 MEKR f f v v KEV NULL KVFS v2 図 44: remove rings and object の様子 remove_rings_and_object(S: skeleton) begin V := any vertex of S; for all other vertices V' in S do begin MEKR(V, V', E); KEV(E, V') end; KVFS() end; 56 7 非多様体 (Non-Manifold Model) 7.1 背景 境界表現は 2 多様体を表現 2 多様体では表現できない" 立体" { r 集合ではあるが,その境界が 2 多様体ではないもの (図 45). 境界表現の立体モデルは集合演算について閉じない. 図 45: 境界が 2 多様体でない r 集合 { 異なる次元の要素が混在する形状 (図 46).有限要素法のモデ ルなど. 図 46: 異なる次元の要素が混在する形状 57 { 複数の隣接する閉領域をもつ形状 (空間分割,セル分割表現) 二つの空間の境界の表現.複合材料の表現. f1 f3 f2 図 47: 空間分割 位相要素 { 0 次元位相要素: 頂点 { 1 次元位相要素: 辺 { 2 次元位相要素: 面分 { 3 次元位相要素: 領域 8 各種の立体表現の関係 一意性 完全性 58
© Copyright 2024 Paperzz