計算幾何学
Computational Geometry
第四章 ボロノイ図
Voronoi Diagram
ある会社の営業所分布
経営戦略


仮定
1.
価格の地域差はない
2.
単位距離あたりの運搬コストは同じ
目標


トータルコストを最小化にして、全国範囲内に
おいて、顧客にサービスを提供するための最
適な分担地域を決定する
解答

計算幾何学の最近点問題
様々な最近点問題

公衆電話

郵便ポスト

レストラン

電車駅

高速IC

バス停

コンビニ
解答→ボロノイ図

第一印象?
q pi
問題の一般化

平面上のn個の点集
P={ pi(xi,yi)|i=1, 2, …, n }とする。
任意の点q(x,y)に対して、どのpiが最も近い?

2点間のユークリッド距離(Euclidean distance)

dist  pi , q  
xi  x    yi  y 
2
q(x,y)
pi(xi,yi)
2
定義



平面上にn個の異なる点の集合P
P ={ pi(xi,yi)|i=1, 2, …, n }
点pi⇔領域i⇒n個の平面領域分割
領域iに含まれる任意点qについて
下記に関係が成立
dist q, pi   dist q, p j , j  i

上記性質を持つ平面の領域分割
⇒Pのボロノイ図
i領域
q
重要な関係
式!
一つの領域の構造

2点間の線分の垂直2等分線

平面を2つの半平面に分割


h(pi, pj)→pi を含む開半平面

h(pj, pi)→pj を含む開半平面
開半平面(Open half plane)


分割線を含まない
r  h(pi, pj)
dist r , pi   dist r , p j 
r
関連術語
1.
2.
3.
4.
5.
ボロノイ図(Voronoi diagram)
母点、サイト(Voronoi site)
ボロノイ領域
5
4
(Voronoi region)
ボロノイ頂点
(Voronoi vertex)
ボロノイ辺
(Voronoi edge)
1
2
3
性質
1.
ボロノイ領域→凸領域
2.
有界でないボロノイ領域⇔母点から構成さ
れる凸包上の点の領域(必要十分条件)
3.
ボロノイ頂点→三つのボロノイ辺の共通点
4.
ボロノイ領域V(p1),V(p2),V(p3)の頂点を円心
として、3母点p1, p2, p3を通る円は他の母点
を含まない(ボロノイ頂点は最も近い三つの
母点から等距離)
性質続き
5.
母点piが母点pjの最近隣点であれば、ボ
ロノイ領域V(pi)とV(pj)は隣接している、
言い換えれば、ボロノイ辺を共有している
6.
n点のボロノイ図は高々2n-5個のボロノイ
頂点と高々3n-6本のボロノイ辺を持つ(?)
7.
ドローネ三角形分割(第5章)と密接な関
係がある
構成方法
1.
直接法→ O(n3)

2.
逐次添加法→ O(n2)

3.
垂直2等分線の定義による方法
3点から始めて、1点ずつ添加していく
Fortune走査法→ O(nlogn)

巧妙で高速な平面走査法
直接法

母点piとpjの垂直2等分線は平面を2つの半平面
h(pi, pj)とh(pj, pi)に分割する

pi を含む開半平面h(pi, pj)における任意の点か
らは母点pj よりpiの方が近いので、定義により、
ボロノイ領域はh(pi, pj)にある

n-1個の半平面の共通部分(交わり)を求めれば、
ボロノイ領域(灰色の部分)が得られる
V  pi  
 h p , p 
i
1 j  n , j i
j
2等分線の求め方ー幾何的方法
2等分線の求め方ー解析的方法


p1p2線分 y=αx+β

α=(y2-y1)/(x2-x1)

β=y1-αx1=(x2y1-x1y2)/(x2-x1)

θ=tg-1α
垂直2等分線 y=α’x+β’


α’= tg(θ+90°)=-ctgθ=-1/tgθ=-1/α
交差点で、 y’=y、x=(x1+x2)/2

α’x+β’=αx+β

β’=(α-α’)x+β=(α-α’)(x1+x2)/2+β
アルゴリズム


1.
2.
3.
4.
5.
6.
入力:n点の集合Sn
出力:任意点pkのボロノイ領域V(pk)
初期化 V  pk   full plane
for i=1 to n
if ik then
線分 pk pi の垂直2等分線を引く
pk側の開半平面h(pk, pi)を求める
V  pk   V  pk   h pk , pi 
計算量
 2本の2等分線の交差点を求める





→1つの計算単位
H(P1,P2)H(P1,P3)=1つの計算単位
H(P1,P2)H(P1,P3)H(P1,P4) =2つの計算単位
…
H(P1,P2)H(P1,P3)H(P1,P4)…H(P1,Pn)
=n-2の計算単位
 1個領域の全部計算量

1+2+・・・+(n-2)=(n-1)(n-2)/2=O(n2)
 n個領域の全部計算量=O(n3)
逐次添加法




まずは3つの母点p1, p2, p3 からスタートし
て、ボロノイ図を構成する
残りの母点を一つずつ添加していきながら、
新たなボロノイ領域を求める
この新たに作られたボロノイ領域の内部に
ある元のボロノイ辺の一部を消せば、新た
なボロノイ図になる
全ての母点について処理する
2つの例
アルゴリズム
1.
2.
3.
4.
5.
6.
任意3点のボロノイ図を構成
for (m=3 to n-1) {
既存母点p1, p2,…, pmから新たな添加母
点pm+1と一番近い母点p(1)を求める
線分 p1 pm1の垂直2等分線とボロノイ領域
Vm(p(1))の辺との交点q1を求める
交点q1のある辺と隣接しているVm(p(1))以
外のボロノイ領域をVm(p(2))とする
k=2
アルゴリズム続き
7.
8.
9.
10.
11.
12.
13.
while (p(k)  p(1) ) do {
線分 pk  pm1 の垂直2等分線とボロノイ領域
Vm(p(k))の辺との新たな交点qkを求める
交点qkのある辺と隣接しているVm(p(k))以
外のボロノイ領域をVm(p(k+1))とする
k = k +1
交点の集合qi ( i = 1, 2,…, k -1 )から構
成される多角形q1q2…qk-1が母点pm+1のボ
ロノイ領域Vm+1(pm+1)になる
} // end of while
} // end of for
計算量
 2点間の2等分線を求める

→1つの計算単位

4点目→3つの計算単位

5点目→4つの計算単位

…

n点目→n-1の計算単位
 n点全部の計算量

3+4+・・・+(n-1)=(n+2)(n-3)/2=O(n2)
平面走査法?

既知:イベント点←母点

求め:構造情報→ボロノイ辺

線分交差と同様な平面走査法が使用可能?

水平な走査線lを平面上で上から下まで動か
していきながら、ボロノイ辺の情報を求める?

結論:大変←ボロノイ辺は走査線lの上・下母
点に依存するから!
Fortune走査法→発想の転換
走査線lとボロノイ辺の交差
状況を管理するのではなく、
走査線lの下側に位置する母
点によって変えられない(ボロ
ノイ領域の性質→母点との距
離)ように走査線lの上側にあ
る母点に関する部分的なボロ
ノイ図の構造情報を管理する
l+
q
基本的な考え方





pi
l+←lの上側の閉半平面
pj
l-
l-←lの下側の開半平面
変わらないl+上のボロノイ図の部分?⇔ l+上
の他の母点より、ある母点piに最も近い点qの
最大範囲が分かれば→ボロノイ領域V(pi)
l+の点q→ dist(pjl-,ql+) > dist(l,ql+)
l+の点q→ dist(pil+,ql+) < = > dist(l,ql+)
1.
2.
3.
“=“の場合→放物線の弧によって定められる境界
“<“の場合→放物線の弧の上側
“>“の場合→放物線の弧の下側
ビーチライン(beach line)

走査線lまでの距離とl+上の各母点との距離
が等しい点は、それぞれの放物線を描いた

これらの放物線の弧の系列→beach line

母点pi (pix, piy)の放物線方程式
ly→走査線のy座標

1
y
x 2  2 pix x  pix2  piy2  l y2
2 piy  l y 
l+

ブレークポイント(breakpoint)


ビーチラインを構成している各母点の放物線
の弧の交点→ breakpoint
走査線が上から下まで動く間に、ブレークポ
イントはボロノイ辺をたどっている!
考察

走査線を動かしながら、ビーチラインを管理す
れば、ボロノイ辺が分る

ビーチラインの構造変化:Where? How?
①新たな放物線の弧が現れる
②放物線の弧が1点に縮小し消えていく

走査線の連続移動の代わり、イベント点の時だ
けを考える

ビーチラインの構造変化とイベント点の関係?
サイトイベント(site event)

新たな放物線の弧がビーチラインに現れる
1.
走査線が新たな母点に到達した時(左図中央)
2.
新たなブレークポイントが2つ現れる(左図右)
3.
最初、2つのブレークポイントは同一点に統合されるが、
走査線の移動と伴って段々異なる方向に向かって新
たなボロノイ辺をたどっていく(右図)
円イベント(circle event)

1.
2.
放物線の弧が1点に縮小し消えていく
点qから3母点pi, pj, pk及び走査線lまで等距離
点qはボロノイ頂点←(px-qx)2+(py-qy)2=R2
まとめ

ビーチラインの構造変化:Where? How?
1.
サイトイベント
① 新たな弧が現れる
② 新たなボロノイ辺が成長する
2.
円イベント
① 本来存在した弧が消える
② 2つの成長している辺が交差してボロノイ
頂点を形成する
データ構造

Fortune走査法の基本原理を解明したら、実装
するには?

走査線を上から下まで動かしている間に必要
な情報を管理するための適切なデータ構造が
必要!→
1.
イベントのデータ構造
2.
走査線状態のデータ構造
3.
ボロノイ図のデータ構造
イベントのデータ構造


サイトイベント→事前分っている→y座標順で
リストに保存
円イベント →事前分らない→検出方法?
円イベントの検出方法

ビーチラインから弧が消
えることによって生じた

三つの母点pi, pj, pkに
よって定められる円はそ
R
q(qx, qy)
の最下点が走査線上に
ある時→ pjに対応する
弧’が一点に集中し消
えていく→ボロノイ頂点
(px-qx)2+(py-qy)2=R2
円心と半径の計算方法
円の方程式 (x-x0)2+(y-y0)2=R2


3つの未知数→既知3点があれば解ける
(x1,y1)
x2  y2
x12  y12
x
x1
y 1
y1 1
x y
x y
x2
x3
y2 1
y3 1
2
2
2
3
x1
a  x2
x3
2
2
2
3
y1 1
x12  y12
y2 1 d   x22  y22
y3 1
x32  y32
R
0
(x2,y2)
d 2  e2 f
R

2
4a
a
d
x0 
2a
y1 1
e
y0 
2a
x12  y12
y2 1 e  x22  y22
x32  y32
y3 1
(x0,y0)
(x3,y3)
x12  y12
x1
y1
x2 1 f   x22  y22
x32  y32
x3 1
x2
y2
x3
y3
x1 1
走査線状態のデータ構造

ビーチライン→放物線の弧→明
示に保存しない→母点とブレーク
ポイント→2分探索木T

Tの外点→各弧と対応する母点
(x座標順)

Tの内点→各弧のブレークポイン
ト(母点の順序対<pi, pj>)

pi=ブレークポイントの左にある放
物線を定義する母点

pj=ブレークポイントの右にある放
物線を定義する母点
走査線状態木へ新弧の挿入

サイトイベント→新弧→部分
木で葉を置き換える

右図はビーチラインと走査線
状態木の対応関係
1.
サイトイベントaのみの場合
2.
サイトイベントbが現れる時
3.
サイトイベントcが現れる時
1
3
2
走査線状態木から既存弧の削除
1.
円イベント→既存弧が消える→木
から葉bを削除する
2.
この弧に対応する内点bも削除、そ
の左弧aと右弧cが融合して、弧aと
弧cによる新たなブレークポイントを
形成する
1
a-c
2
イベントのデータ構造と走査線状態
のデータ構造の関連付け
円心(頂点)
円イベント
外点に蓄える
ブレークポイント
内点に蓄える
母点(サイト)
ボロノイ辺
ボロノイ図のデータ構造

全てのボロノイ頂点を含む十分に大きな長方形

平面領域分割

3つのデータ構造(辺、頂点、面)
二重連結辺リスト(DCEL)
(Doubly-Connected Edge List)
 平面領域分割の問題→指定点から面情報を得る
 3種類の構造体
頂点v={ ① 座標、
② vを始点とする片辺へのポインタ }
2. 面f
={ ① 内側境界上の片辺へのポインタ、
② 外側境界上の片辺へのポインタ }
3. 辺e ={ ① 始点へのポインタ、
② 逆方向へのポインタ、
③ 接続面へのポインタ、
④ 次の辺へのポインタ、
⑤ 前の辺へのポインタ }
1.
DCELの3種類の構造体
頂点、辺、面の各構造体の連携
Vertexes
アルゴリズム


1.
2.
3.
4.
5.
6.
7.
入力:平面上の母点集合P={p1,p2,…,pn}
出力:ボロノイ図Vor(P)→DCELで表現した有界長方形
の平面領域分割D
イベントキューQ初期化=すべてのサイトイベントを入れる
走査線状態木TとDCELの平面領域分割Dを空にする
while Q  nil
do Qからymax座標を持つイベントを削除
if このイベントはサイトpiで生じるサイトイベント
then HandleSiteEvent(pi)
else HandleCircleEvent(γ),
[γ=消えようとする弧と対応するTの葉]
アルゴリズム
続き
8.
T内にあるすべての内部節点は、ボロノイ図の片無
限辺に対応している
9.
既存すべての頂点を囲む有界長方形を求める
10. 片無限辺を有界長方形に接続するように、
DCELを
更新する
11. DCELの片辺をたどって、面の構造体、および関係
する双方向のポインタを追加する
HandleSiteEvent (pi)
1.
If T= empty then {piをTに挿入、return} else Do 2~5
2.
Tからpiの垂直方向の上にある弧αを探索する。もし、
αと対応する葉はQ中の円イベントへのポインタを持ってい
れば、この円イベントは余計なもので、Qから削除
3.
弧αの対応するT の葉を、3個の葉を持つ部分木で置
き換える。真中の葉には新たな母点piを蓄え、両側2
つの葉には、pjを蓄える(元々のαと対応する)。また、
2つ新しい内点に2つの新たなブレークポイント<pj, pi>と
<pi, pj>を蓄える。必要なら、 T を平衡化する
HandleSiteEvent (pi)続き
4.
新しい片辺構造体を生成し、piとpjのボロノイ領域を分
割する。
5.
新たな弧を含んだ連続的となる三つの弧を調べ、2つ
の処理を行う
1.
新たな弧を左端とし、右側の2つ弧を含んで、3連続弧を形
成する場合→もし2つのブレークポイントが最終的に一点に
集中する→円イベントをQの中に挿入する、Tの節点とQの節
点の間のポインタを追加する。
2.
新たな弧を右端とし、左側の2つ弧を含んで、3連続弧を形
成する場合→ステップ5-1と同じ処理を行う
HandleCircleEvent (γ)
1.
消えようとする弧αと対応する葉γをT から削除する。
対応する内点(ブレークポイント)も更新する。必要なら、
T を平衡化する。αと関連するすべての円イベントを
Qから削除する
2.
この円イベントの円心を新しい頂点構造体としてDに追
加する。ビーチラインの新しいブレークポインタと対応する2
つの片辺構造体を生成する。その間のポインタも追加
する。この新しい頂点を終点とする片辺構造体に3つ
の新しい構造体(頂点構造体+2つの片辺構造体)を
ポインタで連結する
HandleCircleEvent (γ)続き
3.
αが消えることによって、ビーチラインは変化する。新
たに形成された2つの3連続弧を調べる
1.
αの左弧を中央の弧とする3連続弧→もし2つのブレーク
ポイントが最終的に一点に集中する→対応する円イベント
をQに挿入し、この新しい円イベントとTの対応する葉の
間をポインタで連結する
2.
αの右弧を中央の弧とする3連続弧について→ステップ
3-1と同様な処理を行う
計算量

1つイベントを処理するのに必要な基本操作

走査線状態木+イベントキュー




木要素の挿入・削除操作= O(logn)
サイトイベント数=n
円イベント数(頂点数)≦2n-5(性質6)
 3n-5 →O(n)
全部の計算量→O(nlogn)
Visual Demonstration
ダウンロード

Document