51
計算幾何入門 Androidアプリでの応用 東海大学 大西建輔

Comp geom20131107open

Embed Size (px)

Citation preview

Page 1: Comp geom20131107open

計算幾何入門Androidアプリでの応用

東海大学 大西建輔

Page 2: Comp geom20131107open

自己紹介

大西建輔(おおにし けんすけ)

興味のある分野

データ構造とアルゴリズム(特に計算幾何)

データベース(索引構造, データ工学)

iPhoneアプリやAndroidアプリの作成(学生と)

パズル・ゲーム関係問題自動生成やクライアント作成(学生と)

Page 3: Comp geom20131107open

目次

1. 右か左か?⇒線分のどちら側に点があるかを判定

2. どこで交わっている?⇒多数の線分があるとき,

交差している組を発見

3. 中か外か?⇒多角形の内部に点が含まれるかを判定

4. 近くのトイレは?⇒平面上に多数の点がある.

問合せ点がどの点に近いかを判定

Page 4: Comp geom20131107open

右か左か?(1)

学生作成アプリ

出発地点と到着地点を指定

Google乗換案内から経路データを取得

曲がる場所とそれを結ぶ線分を描画

曲がる場所に近づくとどちらに曲がるかを提示

曲がる場所⇒点,

経路 ⇒線分(辺)計算幾何の対象!

Page 5: Comp geom20131107open

右か左か?(2)

[問題] 点は線分に対しどこにあるか

入力: (向きあり)線分と点

出力: 右側か、左側か、線分を含む直線上か

a (a.x,a.y)

b (b.x, b.y)

c (c.x, c.y)c'

c’’

Page 6: Comp geom20131107open

符号付面積(三角形の面積)

3点 a, b, cが

反時計周りに並ぶ⇒正

時計回りに並ぶ ⇒負

同一直線上にある⇒ 0

という値をとる.

a (a.x,a.y)

b(b.x,b.y)

c(c.x,c.y)

c'

+

-

)..)(..()..)(..(2

1

1..

1..

1..

2

1yaycxcxbycybxcxa

ycxc

ybxb

yaxa

----

Page 7: Comp geom20131107open

どこで交わっている?(1)

画像管理アプリ(作成中)

斜めから取ったスクリーンを長方形に

画像から線分を抽出

線分から四角形になるものを探す

線分のふるい落とし

真ん中にある線分 ×

中心付近で交差している線分 ×

線分の交差は?計算幾何の対象!

Page 8: Comp geom20131107open

どこで交わっている?(2)

交差とは

2線分が交差

⇔一方の線分の点が他方に含まれる.

(線分に端点は含まれる)

例えば,

1. 線分を含む2直線から交点を計算

2. 交点が線分に含まれるか判定

a

c

d

b

a

b

c

d

Page 9: Comp geom20131107open

どこで交わっている?(3)

符号付き面積による交差判定a

c

d

b

a

b

c

d

2線分が交差

⇔線分abに対し, 点c,dが線分abの異なる側かつ

線分cdに対し, 点a,bが線分cdの異なる側

[同一直線上の場合]

x座標かy座標が2点間に入っているか?

符号付き面積で計算可能△cda, △cdbの積が負

Page 10: Comp geom20131107open

どこで交わっている?(4)

Javaでの実装public double signedArea(Point2G second, Point2G third){

double x2=second.x; double y2 = second.y;

double x3 = third.x; double y3 = third.y;

return (x-x3)*(y2-y3)+(x2-x3)*(y3-y);

}

public boolean onSegment(Point2G point){

return point.between(top, bot);}

public double isRight(Point2G point){

return top.signedArea(bot, point);}

public boolean intersect(Segment seg){

if (onSegment(seg.top) || onSegment(seg.bot)

|| seg.onSegment(top) || seg.onSegment(bot)) return true;

else if ((isRight(seg.top)*isRight(seg.bot)<0)

&& (seg.isRight(top)*seg.isRight(bot)<0)) return true;

else return false;

}

Point2G.Class

Segment.Class

Page 11: Comp geom20131107open

どこで交わっている?(5)

n本の線分の交差判定(問題)

[問題]

n本の線分が与えられている場合に, 交差する線分の組を全て計算する.

入力: n本の線分

出力: 交差する線分の組

全ての線分の組をチェックO(n2)時間

Page 12: Comp geom20131107open

どこで交わってる?(6)

n本の線分の交差判定(アイデア)

平面走査法

水平線(走査線)を上から下に移動し, 変化が起こる場所を探す⇒ 連続である必要はない. ⇒ 変化は, 交点でのみ発生.

走査線計画

走査線と線分の交差状況を表すデータ構造⇒ 線分の状態を保持. この中で, 隣り合う

線分の交差判定のみをおこなう.

イベント計画

Page 13: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 ヒープ作成

S1 S5

S3

S2

S4

ヒープ H

1

1 2

23

1

1

2

2

4

5

5

4 3

3

Page 14: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 ヒープ作成

S1 S5

S3

S2

S4

ヒープ H

1

1

2

23

1

1

2

2

4

5

5

4 3

3

3 4

4 5

Page 15: Comp geom20131107open

どこで交わっている?(8)

アルゴリズムの動作 ヒープ作成

S1 S5

S3

S2

S4

ヒープ H

1

1

2

33

1

1

2

2

4

5

5

4 3

5

3 4

4 2 5

イベント計画

Page 16: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (上端点の場合)

S1 S5

S3

S2

S4

ヒープ H

3

1

1

2

2

4

5

5

4 3

1

1

2

3

5

3 4

4 2 5

二分探索木 T

Page 17: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (上端点の場合)

S1 S5

S3

S2

S4

ヒープ H

3

1

1

2

2

4

5

5

4 3

5

1

2

2

3

3 4

4 5

二分探索木 T

5

出力 (S1,S5)

交差判定

Page 18: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (交点の追加)

S1 S5

S3

S2

S4

ヒープ H

3

1

1

2

2

4

5

5

4 3

3

5

2

2

1

3 4

4

二分探索木 T

5

出力 (S1,S5)

15

15

Page 19: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (交点の追加)

S1 S5

S2

S4

S3

ヒープ H

3

1

1

2

2

4

5

5

4 3

15

5

2

1

3

3 4

4

二分探索木 T

5

出力 (S1,S5)

2

15

5

Page 20: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (交点の追加)

S1 S5

S2

S4

S3

ヒープ H

3

1

1

2

2

4

5

5

4 3

3

5

2

2

1

3 4

4

二分探索木 T

出力 (S1,S5)

15

5 3

交差判定

Page 21: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (下端点の場合)

S1 S5

S2

S4

S3

ヒープ H

3

1

1

2

2

4

5

5

4 3

1

4

2

2

5

3 4

二分探索木 T

出力 (S1,S5)

15

5

3

交差判定

Page 22: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (上端点の場合)

S1 S5

S2

S4

S3

ヒープ H

3

1

1

2

2

4

5

5

4 3

2

4

4

2

5

3

二分探索木 T

出力 (S1,S5) (S2,S5)

15

5

32

交差判定25

25

Page 23: Comp geom20131107open

どこで交わっている?(7)

アルゴリズムの動作 (終了)

S1 S5

S2

S4

S3

ヒープ H

3

1

1

2

2

4

5

5

4 3

4

3

二分探索木 T

出力 (S1,S5) (S2,S5) (S2,S3)

(S3,S4)

15

4

3

2523

34

3

3

Page 24: Comp geom20131107open

どこで交わってる?(8)

n本の線分の交差判定(アルゴリズム)

1. 線分の端点を y座標をキーとしてヒープHに挿入;

2. 二分探索木 T を空にする;

3. While (Hが空でない) do

1. H から最大要素 pを取り出す;

2. p が線分 l の上端点⇒ l を T に挿入;

T で lと隣接する2本の線分と l に交点があれば出力;

交点を新しい線分の上端点として, H に入力;

3. p が線分 l の下端点⇒ l を T から削除;

l の削除で隣接する線分の間に交点があれば出力;

交点を新しい線分の下端点として, H に入力;

Page 25: Comp geom20131107open

[定理] (Bently-Ottmann, 1979)

n本の線分に対して, 全ての交差を

O((n+k)log n)時間で計算可能. ただし, k は交点数.

どこで交わっている?(9)

アルゴリズムの性能

[証明]

“隣り合った線分だけが交差”かつ“全ての隣接関係を調査“⇒全ての交点を出力

イベント点の数は, O(n+k) 個

各イベント点で

二分探索木への挿入, からの削除, ヒープからの取り出し,

挿入が行われる. どの操作も O(log n) 時間必要.

Page 26: Comp geom20131107open

交点数が k Wn2) となる例

n/2本

n/2本

Page 27: Comp geom20131107open

どこで交わっている?(10)

さらに速いアルゴリズム

[定理] (Chazelle-Edelsbrunner, 1992)

n本の線分の集合に対して, 全ての交差を

O(nlog n + k) 時間で計算可能.

ただし, k は交点数.

Page 28: Comp geom20131107open

中か外か?(1)

学生作成アプリ

タブレットに自由に描画(軌跡を赤く表示)

傾けながら, 黒いボールをスタートからゴールへただし, 赤の外側にボールを出すと終了.

軌跡は多角形と見なせる⇒ボールの重心が多角形内部に入っているか?

Page 29: Comp geom20131107open

中か外か?(2)

問題設定

[入力] Q: 多角形, n頂点p: 点

[出力] Q の内部にpが含まれているかどうか?

多角形Qは, 点の配列(p0,p1, …, pn-1)

と表現

p

p’

Page 30: Comp geom20131107open

中か外か?(3)

ジョルダンの閉曲線定理

[定理]

(ジョルダンの閉曲線定理)

c: 平面上の単純閉曲線

cにより, 平面は閉曲線の内部と外部に分割される

自己交差のない始点と終点が同じ曲線,

Page 31: Comp geom20131107open

中か外か?(4)

アイデア

点 pをある方向に移動⇒内部から外部も

外部から内部も必ず辺を通る

⇒中ならば, 奇数回外ならば, 偶数回交差あり.

p

p’

Page 32: Comp geom20131107open

中か外か?(5)

アルゴリズム

[入力] p:点,

Q : 単純多角形, (p0,p1, …, pn-1)

[出力] p が Qに含まれるかどうか?

l : pからでる半直線(どの方向でもよい)

1. Qの全ての辺 pi pi+1 とl の交差の回数を計算

2. もし, 回数が奇数ならば, 内部の点そうでなければ, 外部の点

…… 時間計算量 O(n)時間

Page 33: Comp geom20131107open

中か外か?(6)

凸多角形の場合

[入力] p: 点,

Q: 凸多角形, (p0,p1,…, pn-1)

1. △gp0p1の符号付き面積を計算. 符号をsign;

2. △gpi pi+1に対し, 符号付き面積を計算.

もし, signと符号が違う⇒内点でない.

3. 全ての三角形が同符号⇒内点

計算時間 ……O(n)時間

3

4

5

6

7

p

1

2

p’

0

多角形の内部が凸集合

Page 34: Comp geom20131107open

中か外か?(5)

凸多角形の場合, 前準備あり凸多角形を錐に分割

重心gを計算

gから各頂点への偏角を計算

偏角をキーとし,

二分探索木で管理

構成時間…O(n log n)時間

3

4

5

6

7

g

1

2

p’

0

p

6

4 0

3 5 7 1

2

Page 35: Comp geom20131107open

中か外か?(6)

凸多角形の場合、検索検索時

点pのgからの偏角を計算

偏角をキーにpが含まれる錐を探索

gと同じ側なら内点,

そうでないなら外点

計算時間……O(log n)時間

3

4

5

6

7

g

1

2

p’

0

p

6

4 0

3 5 7 1

2p

Page 36: Comp geom20131107open

近くのトイレは?(1)

多目的トイレマップ

http://wc.m47.jp/

みんなで作るトイレマップ(Androidアプリ)

〇〇トイレマップ

……

東海大のトイレマップを作成中

Page 37: Comp geom20131107open

近くのトイレは?(2)

ボロノイ図

それぞれの点に最も近い領域で分割

自然界に多く存在

人間の皮膚,蜂の巣,

砂浜の模様

様々な分野で応用

社会学, 数学, 生物学,

物理学, 考古学など

Page 38: Comp geom20131107open

近くのトイレは?(3)

最近点の検索

1. 点を適当に選ぶ. この点と問合せ点 qとの距離を計算;

2. 隣り合った領域の点とq

との距離を計算;

3. If (最初の距離が最も小さい)

then 最近点を発見else もっとも距離の小さな点に移動. Step 2へ

q

Page 39: Comp geom20131107open

近くのトイレは?(4)

ボロノイ図の定義

P={p0,p1, ..., pn-1} : 点集合

d(p,q): ユークリッド距離

V(pi) : 点piに関するボロノイ領域

V(pi) (i=1,.., n)をボロノイ図と定義. V(P)と表現

ij

jii pxdpxdxpV

),(),( | )(

母点

ボロノイ頂点

ボロノイ辺

ボロノイ領域

Page 40: Comp geom20131107open

近くのトイレは?(5)

ボロノイ図の性質

ボロノイ領域は凸

ボロノイ頂点は3つのボロノイ辺の交点

ボロノイ頂点を中心とする円は,

対応する3頂点以外を含まない

piがpjに最も近い母点

⇒ V(pi)とV(pj)は隣接

n点に対するボロノイ図

高々2n-5個のボロノイ頂点

高々3n-6本のボロノイ辺

Page 41: Comp geom20131107open

近くのトイレは?(6)

ボロノイ図の構成法(分割統治法)

1. n点集合 Sを x座標の中央値でSl, Srに分割;

2. V(Sl)とV(Sr)を再帰的に構成;

3. Sl と Srを分離する折れ線列sを構成;

4. sの左にあるV(Sr)の辺, sの右にあるV(Sl)の辺を全て除去⇒残った構造が V(S)

T(n) : このアルゴリズムの計算時間もし, Step3, 4が O(n)時間で終了するならば,

T(n) = 2T(n/2)+O(n)が成立. よって,

T(n)=O(n log n)

Page 42: Comp geom20131107open

[定理]

pl pr : sの左右側の平面

V(S)は, V(Sl)∩pl と V(Sr)∩pr の和集合

Sl Sr Sl Sr

Page 43: Comp geom20131107open

近くのトイレは?(7)

ボロノイ図の構成法(折れ線列)

s(Sl,Sr) : V(S)の辺で, V(pi),

V(pj)に共有される辺.

ただし, pi Sl, pj Sr

補題 s(Sl,Sr) は線分の列となる. それをsと書く

補題 sは単調な折れ線列

y座標が必ず減少している) Sl Sr

Page 44: Comp geom20131107open

t1

t2

pl prerel

e

近くのトイレは?(7)

ボロノイ図の構成法(折れ線列)

Page 45: Comp geom20131107open

近くのトイレは?(7)

ボロノイ図の構成法(折れ線列)

t1

t2

pl prerel

e

Page 46: Comp geom20131107open

近くのトイレは?(7)

ボロノイ図の構成法(折れ線列)

t1

t2

pl prerel

e

Page 47: Comp geom20131107open

近くのトイレは?(7)

ボロノイ図の構成法(折れ線列)

t1

t2

pl prerel

e

Page 48: Comp geom20131107open

近くのトイレは?(7)

ボロノイ図の構成法(折れ線列)

t1

t2

pl prerel

e

Page 49: Comp geom20131107open

折れ線列sの構成

1. 上部外接線 t1と下部外接線 t2を計算

pl (pr) : Sl (Sr)の上部外接線に含まれる点

el , er : t1と交わるV(pl), V(pr)の辺

e に pl と prの垂直二等分線を代入

2. do

1. while (eとelが交わらない) elに時計回りで次の辺を代入

2. while (eとerが交わらない) erに反時計回りで次の辺を代入

3. if ( y(e, el) > y(e, er) ) plにelのもう一つの母点を代入else prにerのもう一つの母点を代入

4. eに plと prの垂直二等分線を代入

while (plprの垂直二等分線 ≠ t2)

y(e,e') : 直線e,e'の交点のy座標

Page 50: Comp geom20131107open

(証明)

sのサイズ: O(n)

Step 1. 縮小法で傾きの中央値を計算…O(n)時間で計算可能

Step2. 二重のwhile文

⇒全体で, どの辺も高々2回しか交差判定されない.

⇒ O(n)時間で計算可能 Sl Sr

[補題]折れ線列sはO(n)時間で構成できる.

Page 51: Comp geom20131107open

最後に

計算幾何(特に2次元)の対象は, 様々なところで利用可能

線分, 交差, ボロノイ図(今日の話)

凸包, デローネ三角形分割, アレンジメント,

区分木, パラメトリック探索など

ライブラリとして, CGAL, LEDA, Boost

Geometry, OpenCVなどもあり.

Androidアプリを作るのは結構面白い.

(アルゴリズム+Androidアプリの本でも)