【ドロネー三角形分割】GISを作るデータ構造とアルゴリズム【計算幾何学】
概要
前回の記事では, GISの基本機能のひとつ, ボロノイ分割を説明した.
今回は, ドロネー三角形分割について説明する. 地理空間情報では等高線の3Dモデルの作成, コンピューターグラフィックスでは有限点のメッシュ生成, などが利用例である.
ドロネー三角分割は, 有限個の点をもとに三角形の面を作成する, 三角形の領域に分割する処理である. (通常の)三角分割に加え, 綺麗な三角分割をつくる, そんな目的の分割方法である.
今回も「コンピュータ・ジオメトリ 第3版 計算幾何学:アルゴリズムと応用」や, レンセラー工科大学の講義資料を参考に説明する.
ドロネー三角分割
点集合
角度最適
ここで
次に,
ここで, 分割方法に序列を導入したい. 具体的には,
辞書式順序とはつまり, 次式を満たすようなインデックス
そして,
このような状態の三角形分割を探索したい, というのがドロネー三角分割の狙いである.
正当な三角分割
つぎに,どのような条件を満たすときに三角形分割が角度最適になるのか見ていく. 情報として,ターレスの定理を導入する.
次に, 以下の例を考える. 四つの点

同じ頂点群に対し, 頂点の結び方を入れ替える方法を辺フリップ(Edge Flip) とよぶ.
つまり, 四つの点
角度最適の式を言い換えると, 次のような条件を満たすとき, その三角形分割は不当であると呼ぶ.
式を口語的に読むと, 辺フリップの結果, 三角形分割後の内角のうち最小のものの大きさが局所的に大きなる場合, その元の辺は不当である,ということだ.
この条件に従えば, いくつかの候補がある三角形分割について,良いものを抽出できる.
さらに良いこと, 不当な辺を検出するために, わざわざ内角の大きさを計算で求める必要はない.
便利な方法をとして,
- 三角形分割を構成する各三角形の3つの頂点を結ぶ外接円を求める.
- 1のとき, この外接円に3点以外の点が含まれている場合, その三角形には不当な辺を含んでいると判定する.

実際にこの方法で判定できるのかさきほどの図形でみてみる. (上図) すると, 不当な辺を含む
アルゴリズム
基本戦術
さて, 上述した辺フリップを駆使すれば, ある初期状態の三角形分割をスタートに, 徐々に角度最適な三角形分割
簡単な話, とりあえず何かしらの三角形分割を構成後, すべての辺に対し,正当か不当な辺であるかを判定し, 辺フリップを繰り返せばよい. 結果, これ以上辺フリップの余地がなくなればそのとき, 角度最適な三角形分割
この方法は実のところ適切に稼働する. そして, 必ず収束するのだ. 詳細な証明は書籍に任せるが, 辺フリップにより角度ベクトルは単調に増大していくが, 上界があるために, どこかで必ず停止せざるを得ないからだ(無限大には発散できない)
この方法はとてもシンプルに実装できる.
が, 問題としては計算効率が非常に悪いということだ.
乱択逐次構成法
実際のところ, ドロネー三角形分割を求める方法はいくつか考えられる. ここでは, 乱択逐次構成法(randomized incremental algorithm) を用いた実装方法を扱う.
この乱択逐次構成法は, 入力となる点集合
既存の三角形に新たな点

点

例えば先ほどの例だと, 少なくとも追加した点を内包する三角形および四角形の外周辺は不当なものである可能性がある. そのため, 外周円判定を行い, 必要に応じて辺フリップを行う必要がある.
さらに, 辺フリップを行うことで, これらの三角形および四角形の外にあった三角形にまで不当なものにしてしまう可能性がある. そこで今度は不当な辺を含んでいるかもしれない外側の三角形もチェックする... といった再起処理を, 全体で不当な辺がなくなるまで行うのだ.[1]
以下にこのアルゴリズムの疑似コードを載せておく.また, 処理のイメージを掴みたい読者は後の章を読むと理解の助けになると思う.
アルゴリズム:
入力: 平面上の
出力:
-
を辞書式順序で最も高い位置にあるp_0 の点とする. すなわち, 最大のP 座標をもつ点の中で最も右にある点である.y -
とp_{-1} を十分に遠くにあるp_{-2} の2点で,R^2 全体が三角形P に含まれるように作成する.p_0p_{-1}p_{-2} - ただ1つの三角形
からなる三角形分割としてp_0p_{-1}p_{-2} を初期化する.T -
のランダム順列P \ {p_0} を求める.p_1,p_2,...,p_n - for
tor \leftarrow n - ---- do (
をp_r に挿入する):T - --------
を含む三角形p_r を求める.p_ip_jp_k \in T - -------- if
を含む三角形p_r の内部にある.p_ip_jp_k - ------------- then
からp_r の三頂点への辺を加える. これによって,p_ip_jp_k は3つの三角形にさらに分割される.p_ip_jp_k - ------------
LegalizeEdge(p_r, \bar{p_ip_j}, T) - ------------
LegalizeEdge(p_r, \bar{p_jp_k}, T) - ------------
LegalizeEdge(p_r, \bar{p_kp_i}, T) - ------- else
がp_r の辺, たとえばp_ip_jp_k 上にある.\bar{p_ip_j} - ------------
からp_r への辺を加え, さらにp_k に接するもう1つの三角形の第3の頂点\bar{p_ip_j} とp_l を辺で結ぶことによって,p_r に接するこれら2つの三角形を4つの三角形に分割する.\bar{p_ip_j} - ------------
LegalizeEdge(p_r, \bar{p_ip_l}, T) - ------------
LegalizeEdge(p_r, \bar{p_lp_j}, T) - ------------
LegalizeEdge(p_r, \bar{p_jp_k}, T) - ------------
LegalizeEdge(p_r, \bar{p_kp_i}, T) - 2点
と,これらに接続する辺をすべてp_{-1},p_{-2} から取り除く.T - Return
T
関数:
- (挿入しようとしている点が
で,p_r はフリップする必要があるかもしれない\bar{p_ip_j} の辺である.)T - if
が正当ではない.\bar{p_ip_j} - ---- then
をp_ip_jp_k で\bar{p_ip_j} と隣接する三角形とする.p_rp_ip_j - ---- (
のフリップ)\bar{p_ip_j} を\bar{p_ip_j} で置き換える.\bar{p_rp_k} - ----
LegalizeEdge(p_r,\bar{p_ip_k},T) - ----
LegalizeEdge(p_r,\bar{p_kp_j},T)
補足点として,
-
内の2-4行目では,点DelaunayTriangulation(P) の外界となる巨大な三角形を先に作っている. その理由として, 新規の点を既存三角形に加えて分割する再帰的な処理を動かすための初期状態をつくるためである. もちろん, この巨大な三角形は点P のドロネー三角形分割では本来ないため, 19行目で排除している.P -
の2行目のLegalizeEdge(p_r, \bar{p_ip_j}, T) が正当性判定は, 上述した外接円判定を行う. 外接円判定についてはとても簡単な行列式があるので利用するとよいだろう.\bar{p_ip_j}
イメージ
乱択逐次構成法によるドロネー三角形分割の処理の流れを確認する. 以下の事例はFelkel先生の講義資料から引用している.

スタートとして,新規の点
いま,既存の三角形分割のうち,三角形
次に, 三角形
この辺フリップにより, さらに隣接する三角形の辺に影響がないかチェックする(④)

以降, 全体で不当な可能性のある辺(図では赤い辺)を全てチェックしていく. 最後に, 不当な可能性のある辺がなくなれば, 新規の点
まとめ
今回は, 「ドロネー三角形分割」 を説明した. 乱択逐次構成法と辺フリップによる三角形分割の修正処理を構成したアルゴリズムを紹介した.
実は, ドロネー三角形分割は以前と紹介したボロノイ分割と密接な関係があり, 言ってしまえばボロノイ分割が求まればドロネー三角形分割も同時に構成できる.
このように, ドロネー三角形分割はほかにも作り方がある. 例えば, Bowyer-Watson アルゴリズムと呼ばれる処理もある. (コード付き)
次回はいよいよ 「地理情報の検索」の仕組みに焦点を当てていく.
-
この再帰処理は必ず収束する.なぜなら辺フリップにより角度ベクトルは大きくなっていくが, それには上界があるためどこかで止まらざるを得ないからだ ↩︎
Discussion