ドロネー三角形分割
shiatsumat
松下祐介
自己紹介
• Haskell共和国の住人
• 競技プログラミングエンジョイ勢
本の紹介
• 『コンピュータ・ジオメトリ』
• 計算機科学の一分野の計算幾何学の本
• 著者4人のうち3人がMark
今日の予定
• ドロネー三角形分割についてゆるふわに話します
三角形分割
• 平面上の点の集合Pについて、いくつかの点の対も辺で結ばれていて、どの辺も交差していなくて、どの辺で結ばれていない2点を辺で結んでも、辺が交差してしまうような、平面の分割(辺の取り方)を三角形分割という。
• これが三角形分割です→実演
三角形分割
• どの面も三角形である。 (∵多角形は三角形に分割できる)
• 外側はPの凸包である。
• Pがn点を含み、Pの凸包の境界上にk点があるとき、Pのどの三角形分割も、2n-2-k個の三角形を含み、3n-3-k個の辺を含む。
ドロネー三角形分割
• Pの三角形分割Tにm個の三角形が含まれているとし、Tのそれぞれの三角形の内角3m個を昇順にソートした列をTの角度ベクトルという。
• Pの三角形分割のうち、角度ベクトルが辞書順で最大であるものをPのドロネー三角形分割という。
• これがドロネー三角形分割です→実演
ドロネー三角形分割
• TをPの三角形分割とする。TがPのドロネー三角形分割であるための必要十分条件は、Tの任意の三角形の外接円がその内部にPの点を含まないことである。
不正な辺
アルゴリズムの概要
• 乱択逐次構成法
• 点をシャッフルし、1つずつ点を増やしていってそのたびにドロネー三角形分割をする
• 割と簡単
アルゴリズム
• Pをn点の集合とする
• 三角形分割をするために、最初にPの点を全て含む大きい三角形を考える (すごく左上にある点とすごく右上にある点を追加し、Pの一番下にある点と一緒に三角形を作る)
• 三角形分割Tを大きい三角形として初期化する。
アルゴリズム
• Pの一番下にある点以外の点をシャッフルし、列P’を求める。
• P’の点Xを順に追加していく。
• Xを含む三角形分割Tの三角形を△ABCとする。Tにおいて△ABCを△XBC・△XCA・△XABに分割する。
• ここで不正な辺が出来ていないか確かめる。
アルゴリズム
• 不正な辺になる可能性があるのはBC, CA, ABの3辺。
• ここではBCが不正であるかを確かめていく。他も同様にできる。
アルゴリズム
• △XBCと辺BCで接する三角形を△YCBとする。
• Yが△XBCの外接円の内部にあれば、BCは不正。
X
C
B
Y 不正な辺
アルゴリズム
• 不正な辺があった際は、図のように フリップする。
X
C
B
Y
X
C
B
Y
アルゴリズム
• フリップしたらまた不正な辺ができるかもしれない。
• YBとYCが不正であるかどうか確かめる。以下同様に続いていく。
X
C
B
Y
アルゴリズム
• 最終的に全部の点を追加したら、三角形分割Tから、最初に追加したすごく左上の点とすごく右上の点に接続している辺をすべて取り除く。
• これでドロネー三角形分割は完了。
• うれしい。
アルゴリズム
• 「Xを含む三角形分割Tの三角形を△ABCとする。」ここの計算量はどうだろうか?
• ナイーブに個々の三角形について点が含まれているか確かめることもできるが、O(n)となる
• 三角形分割と同時に木構造を作って再帰的に求めていくことができる
アルゴリズム
• この乱択逐次構成法の計算量の期待値はO(n log n)
• うれしい。
ドロネー三角形分割の実用例
• 各地点の高さが分かっているとき、地形の状況をドロネー三角形分割に基づき表す
ボロノイ図
• 点の集合Pがあり、平面上のすべての座標について、一番近いPの要素の点を表す図。
ボロノイ図
• 藤原さんが夏季セミナー中に実装しました
ボロノイ図⇔ドロネー三角形分割
• ボロノイ図で領域が接している⇔ ドロネー三角形分割で辺で結ばれている
ボロノイ図の実用例
• 主要都市を元に地域を分割する
ドロネー三角形分割→EMST
• ユークリッド最小木(EMST): 平面上の全ての点を連結する木の中で辺の長さの総和が最小なもの
• ドロネー三角形分割をグラフとして見る。点の数をnとするとドロネー三角形分割の辺の数は3n-3-kなので、O(n log n)で最小全域木が求まる。ドロネー三角形分割と合わせてもO(n log n)となる。
行商人問題 (TSP)
• 言わずと知れたNP困難問題
• n点の間にいくつか距離のある辺があって、n点全てを1回だけ通る経路のうち総移動距離が最小のものを求めよ、という問題
• ここではn点は平面上にあり、どの2点間にも辺があり幾何的な距離を持っているものとする
EMST→2近似TSP
• EMSTからTSPの2近似アルゴリズム(総移動距離が最小の場合の2倍以下)を作ることができる
• まずEMSTをなめる閉路をつくる
EMST→2近似TSP
• 閉路をショートカットしていく。
EMST→2近似TSP
• 2回通っている点についてO(1)でショートカットできるので、O(n)で巡回路になる。EMSTまでと合わせてO(n log n)となる。
EMST→2近似TSP
• 行商人問題の最適解での総移動距離をtsp、 最小全域木の辺の長さの合計をemst、 ここで求めた巡回路の総移動距離をdとする。
tsp≧tspから1本辺を取ったもの≧emst
d≦2emst
∴d≦2tsp
• 以上よりこれは2近似アルゴリズムである。
おまけ
• 暇だったので3Dの凸包を作ってみました →実演
• このアルゴリズムも乱択逐次構成法
• うれしい
まとめ
• ドロネー三角形分割はうれしい!