計算幾何学 computational geometry

51
計計計計計 Computational Geometry 計計計 計計計計計 Voronoi Diagram

Upload: betrys

Post on 11-Jan-2016

140 views

Category:

Documents


0 download

DESCRIPTION

計算幾何学 Computational Geometry. 第四章 ボロノイ図 Voronoi Diagram. ある会社の営業所分布. 経営戦略. 仮定 価格の地域差はない 単位距離あたりの運搬コストは同じ 目標 トータルコストを最小化にして、全国範囲内において、顧客にサービスを提供するための最適な分担地域を決定する 解答 計算幾何学の最近点問題. 様々な最近点問題. 公衆電話 郵便ポスト レストラン 電車駅 高速 IC バス停 コンビニ. 解答→ボロノイ図. 第一印象?. p i. 問題の一般化. q. 平面上の n 個の点集 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 計算幾何学 Computational Geometry

計算幾何学Computational Geometry

第四章 ボロノイ図Voronoi Diagram

Page 2: 計算幾何学 Computational Geometry

ある会社の営業所分布

Page 3: 計算幾何学 Computational Geometry

経営戦略 仮定

1. 価格の地域差はない2. 単位距離あたりの運搬コストは同じ

目標 トータルコストを最小化にして、全国範囲

内において、顧客にサービスを提供するための最適な分担地域を決定する

解答 計算幾何学の最近点問題

Page 4: 計算幾何学 Computational Geometry

様々な最近点問題 公衆電話 郵便ポスト レストラン 電車駅 高速 IC

バス停 コンビニ

Page 5: 計算幾何学 Computational Geometry

解答→ボロノイ図 第一印象?

Page 6: 計算幾何学 Computational Geometry

問題の一般化 平面上の n 個の点集 P= { pi(xi,yi) | i=1, 2, …, n }とする。 任意の点 q(x,y) に対して、どの pi が最も近

い?

2 点間のユークリッド距離 (Euclidean distance) 22, yyxxqpdist iii

q(x,y)

pi(xi,yi)

piq

Page 7: 計算幾何学 Computational Geometry

定義

平面上に n 個の異なる点の集合 P

     P = { pi(xi,yi) | i=1, 2, …, n }

点 pi⇔ 領域 i⇒n 個の平面領域分割 領域 i に含まれる任意点 q について

下記に関係が成立

上記性質を持つ平面の領域分割⇒ Pのボロノイ図

ijpqdistpqdist ji ,,,重要な関係式!

q

i 領域

Page 8: 計算幾何学 Computational Geometry

一つの領域の構造 2 点間の線分の垂直 2 等分

線 平面を 2 つの半平面に分割

h(pi, pj)→pi を含む開半平面

h(pj, pi)→pj を含む開半平面

開半平面( Open half plane ) 分割線を含まない

r h(pi, pj) ji prdistprdist ,,

r

Page 9: 計算幾何学 Computational Geometry

関連術語1. ボロノイ図 (Voronoi diagram)2. 母点、サイト (Voronoi site)3. ボロノイ領域   (Voronoi region)4. ボロノイ頂点   (Voronoi vertex)5. ボロノイ辺   (Voronoi edge)

12

453

Page 10: 計算幾何学 Computational Geometry

性質1. ボロノイ領域→凸領域2. 有界でないボロノイ領域⇔母点から構成さ

れる凸包上の点の領域(必要十分条件)3. ボロノイ頂点→三つのボロノイ辺の共通点4. ボロノイ領域 V(p1),V(p2),V(p3) の頂点を円

心として、3母点 p1, p2, p3 を通る円は他の母点を含まない(ボロノイ頂点は最も近い三つの母点から等距離)

Page 11: 計算幾何学 Computational Geometry

性質続き

5. 母点 pi が母点 pj の最近隣点であれば、ボロノ

イ領域V( pi )とV( pj )は隣接している、

言い換えれば、ボロノイ辺を共有している

6. n 点のボロノイ図は高々 2n-5 個のボロノイ頂点と高々 3n-6 本のボロノイ辺を持つ( ? )

7. ドローネ三角形分割(第 5 章)と密接な関係がある

Page 12: 計算幾何学 Computational Geometry

構成方法1. 直接法→ O(n3)

垂直2等分線の定義による方法

2. 逐次添加法→ O(n2)

3 点から始めて、 1 点ずつ添加していく

3. Fortune 走査法→ O(nlogn)

巧妙で高速な平面走査法

Page 13: 計算幾何学 Computational Geometry

直接法 母点 pi と pj の垂直 2 等分線は平面を 2 つの

半平面 h(pi, pj) と h(pj, pi) に分割する pi を含む開半平面 h(pi, pj) における任意の点

からは母点 pj より pi の方が近いので、定義により、ボロノイ領域は h(pi, pj) にある

n-1 個の半平面の共通部分(交わり)を求めれば、ボロノイ領域(灰色の部分灰色の部分)が得られる

ijnjjii pphpV

,1

,

Page 14: 計算幾何学 Computational Geometry

2等分線の求め方ー幾何的方法

Page 15: 計算幾何学 Computational Geometry

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 + β

Page 16: 計算幾何学 Computational Geometry

アルゴリズム 入力: n 点の集合 Sn

出力:任意点 pk のボロノイ領域 V(pk)

1. 初期化2. for i=1 to n3. if ik then

4. 線分   の垂直 2 等分線を引く5. pk 側の開半平面 h(pk, pi) を求める

6.

ik pp

ikkk pphpVpV ,

plane fullkpV

Page 17: 計算幾何学 Computational Geometry

計算量 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)

Page 18: 計算幾何学 Computational Geometry

逐次添加法 まずは 3 つの母点 p1, p2, p3 からスター

トして、ボロノイ図を構成する 残りの母点を一つずつ添加していきな

がら、新たなボロノイ領域を求める この新たに作られたボロノイ領域の内

部にある元のボロノイ辺の一部を消せば、新たなボロノイ図になる

全ての母点について処理する

Page 19: 計算幾何学 Computational Geometry

2 つの例

Page 20: 計算幾何学 Computational Geometry

アルゴリズム

1. 任意 3 点のボロノイ図を構成2. for (m=3 to n-1) {3. 既存母点 p1, p2,…, pm から新たな添加母

点 pm+1 と一番近い母点 p(1) を求める

4.  線分     の垂直 2 等分線とボロノイ領域  

Vm ( p(1) )の辺との交点 q1 を求める

5.  交点 q1 のある辺と隣接している Vm ( p(1) )以

外のボロノイ領域を Vm ( p(2) )とする

6.   k=2

11 mpp

Page 21: 計算幾何学 Computational Geometry

アルゴリズム続き

7.   while (p(k) p(1) ) do {

8.   線分     の垂直 2 等分線とボロノイ領域 Vm ( p(k) )の辺との新たな交点 qk を求める

9.   交点 qk のある辺と隣接している Vm ( p(k) )以  

外のボロノイ領域を Vm ( p(k+1) )とする

10.    k = k + 111.   交点の集合 qi ( i = 1, 2,…, k - 1 )から構

成される多角形 q1q2…qk-1 が母点 pm+1 のボ

ロノイ領域 Vm+1 ( pm+1 )になる

12. } // end of while13. } // end of for

1mk pp

Page 22: 計算幾何学 Computational Geometry

計算量 2 点間の 2 等分線を求める

→1 つの計算単位 4 点目→ 3 つの計算単位 5 点目→ 4 つの計算単位 … n 点目→ n-1 の計算単位

n 点全部の計算量 3 + 4 +・・・+( n - 1 )= (n+2)(n -

3)/2=O(n2)

Page 23: 計算幾何学 Computational Geometry

平面走査法 ?

既知:イベント点←母点 求め:構造情報→ボロノイ辺 線分交差と同様な平面走査法が使用可能 ?

水平な走査線 l を平面上で上から下まで動かしていきながら、ボロノイ辺の情報を求める ?

結論:大変←ボロノイ辺は走査線 l の上・下母点に依存するから!

Page 24: 計算幾何学 Computational Geometry

Fortune 走査法→発想の転換

  走査線 l とボロノイ辺の交差状況を管理するのではなく、走査線 l の下側に位置する母点によって変えられない(ボロノイ領域の性質→母点との距離)ように走査線 l の上側にある母点に関する部分的なボロノイ図の構造情報を管理する

Page 25: 計算幾何学 Computational Geometry

基本的な考え方 l +← l の上側の閉半平面 l -← l の下側の開半平面 変わらない l +上のボロノイ図の部分?⇔ l +

上の他の母点より、ある母点 pi に最も近い点q の最大範囲が分かれば→ボロノイ領域 V(pi)

l +の点 q→ dist(pjl - ,ql + ) > dist(l,ql + )

l +の点 q→ dist(pil + ,ql + ) < = > dist(l,ql + )

1. “=“ の場合→放物線の弧によって定められる境界2. “<“ の場合→放物線の弧の上側3. “>“ の場合→放物線の弧の下側

l +

pi

pj

q

l -

Page 26: 計算幾何学 Computational Geometry

ビーチライン (beach line) 走査線 l までの距離と l +上の各母点との

距離が等しい点は、それぞれの放物線を描いた

これらの放物線の弧の系列→ beach line 母点 pi (pix, piy) の放物線方程式

   ly→ 走査線の y 座標

   2222 22

1yiyixix

yiy

lppxpxlp

y

l +

Page 27: 計算幾何学 Computational Geometry

ブレークポイント(breakpoint)

ビーチラインを構成している各母点の放物線の弧の交点→ breakpoint

走査線が上から下まで動く間に、ブレークポイントはボロノイ辺をたどっている!

Page 28: 計算幾何学 Computational Geometry

考察 走査線を動かしながら、ビーチラインを管理

すれば、ボロノイ辺が分る ビーチラインの構造変化: Where? How?

  ①新たな放物線の弧が現れる  ②放物線の弧が 1 点に縮小し消えていく 走査線の連続移動の代わり、イベント点の時だけを考える

ビーチラインの構造変化とイベント点の関係?

Page 29: 計算幾何学 Computational Geometry

サイトイベント (site event) 新たな放物線の弧がビーチラインに現れる1. 走査線が新たな母点に到達した時(左図中央)2. 新たなブレークポイントが 2 つ現れる(左図右)3. 最初、 2 つのブレークポイントは同一点に統合され

るが、走査線の移動と伴って段々異なる方向に向かって新たなボロノイ辺をたどっていく(右図)

Page 30: 計算幾何学 Computational Geometry

円イベント (circle event) 放物線の弧が 1 点に縮小し消えていく1. 点 q から 3 母点 pi, pj, pk及び走査線 l まで

等距離2. 点 q はボロノイ頂点← (px-qx)2+(py-qy)2=R2

Page 31: 計算幾何学 Computational Geometry

まとめ ビーチラインの構造変化: Where? How?

1. サイトイベント  ① 新たな弧が現れる  ② 新たなボロノイ辺が成長する2. 円イベント  ① 本来存在した弧が消える  ② 2 つの成長している辺が交差してボロ

ノイ    頂点を形成する

Page 32: 計算幾何学 Computational Geometry

データ構造 Fortune 走査法の基本原理を解明したら、実装するには?

走査線を上から下まで動かしている間に必要な情報を管理するための適切なデータ構造が必要!→

1. イベントのデータ構造2. 走査線状態のデータ構造3. ボロノイ図のデータ構造

Page 33: 計算幾何学 Computational Geometry

イベントのデータ構造 サイトイベント→事前分っている→ y 座標順で リストに保存 円イベント →事前分らない→検出方法?

Page 34: 計算幾何学 Computational Geometry

円イベントの検出方法 ビーチラインから弧が消

えることによって生じた 三つの母点 pi, pj, pk によ

って定められる円はその最下点が走査線上にある時→ pj に対応する弧’が一点に集中し消えていく→ボロノイ頂点

(px-qx)2+(py-qy)2=R2

q(qx, qy)R

Page 35: 計算幾何学 Computational Geometry

円心と半径の計算方法

0

1

1

1

1

3323

23

2222

22

1121

21

22

yxyx

yxyx

yxyx

yxyx

円の方程式  (x - x0)2+(y - y0)2=R2

3 つの未知数→既知 3 点があれば解ける

a

dx

20

a

ey

20

a

f

a

edR

2

22

4

1

1

1

33

22

11

yx

yx

yx

a 1

1

1

323

23

222

22

121

21

yyx

yyx

yyx

d

1

1

1

323

23

222

22

121

21

xyx

xyx

xyx

e

3323

23

2222

22

1121

21

yxyx

yxyx

yxyx

f

(x0,y0)

R

(x3,y3)

(x2,y2)

(x1,y1)

Page 36: 計算幾何学 Computational Geometry

走査線状態のデータ構造 ビーチライン→放物線の弧→明示に保存しない→母点とブレークポイント→ 2 分探索木 T

T の外点→各弧と対応する母点( x座標順)

T の内点→各弧のブレークポイント(母点の順序対<pi, pj> )

pi =ブレークポイントの左にある放物線を定義する母点

pj =ブレークポイントの右にある放物線を定義する母点

Page 37: 計算幾何学 Computational Geometry

走査線状態木へ新弧の挿入 サイトイベント→新弧→部

分木で葉を置き換える 右図はビーチラインと走査

線状態木の対応関係1. サイトイベント a のみの場合

2. サイトイベント b が現れる時

3. サイトイベント c が現れる時

1 2

3

Page 38: 計算幾何学 Computational Geometry

走査線状態木から既存弧の削除1. 円イベント→既存弧が消える→木

から葉 b を削除する2. この弧に対応する内点 b も削除、その左弧 a と右弧 c が融合して、弧 a と弧 c による新たなブレークポイントを形成する

12a-c

Page 39: 計算幾何学 Computational Geometry

イベントのデータ構造と走査線状態のデータ構造の関連付け

母点 ( サイト )

外点に蓄える

ブレークポイント

ボロノイ辺

内点に蓄える

円心 (頂点 )

円イベント

Page 40: 計算幾何学 Computational Geometry

ボロノイ図のデータ構造 全てのボロノイ頂点を含む十分に大きな長方形

平面領域分割 3つのデータ構造(辺、頂点、面)

Page 41: 計算幾何学 Computational Geometry

二重連結辺リスト( DCEL )       (Doubly-Connected Edge List)

平面領域分割の問題→指定点から面情報を得る 3種類の構造体

1. 頂点 v={ ① 座標、          ② v を始点とする片辺へのポインタ }

2. 面 f ={ ① 内側境界上の片辺へのポインタ、          ② 外側境界上の片辺へのポインタ }

3. 辺 e ={ ① 始点へのポインタ、          ② 逆方向へのポインタ、          ③ 接続面へのポインタ、          ④ 次の辺へのポインタ、          ⑤ 前の辺へのポインタ }

Page 42: 計算幾何学 Computational Geometry

DCEL の3種類の構造体

Page 43: 計算幾何学 Computational Geometry

頂点、辺、面の各構造体の連携

Vertexes

Page 44: 計算幾何学 Computational Geometry

アルゴリズム 入力:平面上の母点集合 P={p1,p2,…,pn} 出力:ボロノイ図 Vor(P)→DCEL で表現した有界長方形の

平面領域分割 D

1. イベントキュー Q 初期化=すべての を入れるサイトイベント2. 走査線状態木 T と DCEL の平面領域分割 D を空にする3. while Q nil

4.    do Q から ymax 座標を持つイベントを削除

5. if このイベントはサイト pi で生じるサイトイベント

6. then HandleSiteEvent(pi)

7. else HandleCircleEvent(γ),                  [γ=消えようとする弧と対応す

る T の葉 ]

Page 45: 計算幾何学 Computational Geometry

アルゴリズム 続き

8. T 内にあるすべての内部節点は、ボロノイ図の片無限辺に対応している

9. 既存すべての頂点を囲む有界長方形を求める10.片無限辺を有界長方形に接続するように、

DCEL を更新する11.DCEL の片辺をたどって、面の構造体、および

関係する双方向のポインタを追加する

Page 46: 計算幾何学 Computational Geometry

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 を平衡化する

Page 47: 計算幾何学 Computational Geometry

HandleSiteEvent (pi) 続き

4. 新しい片辺構造体を生成し、 pi と pj のボロノイ領

域を分割する。

5. 新たな弧を含んだ連続的となる三つの弧を調べ、2 つの処理を行う

1. 新たな弧を左端とし、右側の 2 つ弧を含んで、3連続弧を形成する場合→もし 2 つのブレークポイントが最終的に一点に集中する→円イベントを Q の中に挿入する、 T の節点と Q の節点の間の を追加する。ポインタ

2. 新たな弧を右端とし、左側の 2 つ弧を含んで、3連続弧を形成する場合→ステップ 5-1 と同じ処理を行う

Page 48: 計算幾何学 Computational Geometry

HandleCircleEvent (γ)1. 消えようとする弧 α と対応する葉 γ を T から削除する。対応する内点(ブレークポイント)も更新する。必要なら、 T を平衡化する。 α と関連するすべての円イベントを Q から削除する

2. この円イベントの円心を新しい頂点構造体として D

に追加する。ビーチラインの新しいブレークポインタと対応する 2 つの片辺構造体を生成する。その間のポインタも追加する。この新しい頂点を終点とする片辺構造体に 3 つの新しい構造体(頂点構造体+2つの片辺構造体)をポインタで連結する

Page 49: 計算幾何学 Computational Geometry

HandleCircleEvent (γ) 続き

3. α が消えることによって、ビーチラインは変化する。新たに形成された2つの 3 連続弧を調べる

1. α の左弧を中央の弧とする 3 連続弧→もし 2 つのブレークポイントが最終的に一点に集中する→対応する円イベントを Q に挿入し、この新しい円イベントと T の対応する葉の間をポインタで連結する

2. α の右弧を中央の弧とする 3 連続弧について→ステップ 3-1 と同様な処理を行う

Page 50: 計算幾何学 Computational Geometry

計算量

1 つイベントを処理するのに必要な基本操作

走査線状態木+イベントキュー 木要素の挿入・削除操作= O(logn)

サイトイベント数= n 円イベント数 ( 頂点数 )≦2n - 5( 性質6 )

3n - 5 →O(n) 全部の計算量→ O(nlogn)

Page 51: 計算幾何学 Computational Geometry

Visual Demonstration