comp geom20131107open
TRANSCRIPT
計算幾何入門Androidアプリでの応用
東海大学 大西建輔
自己紹介
大西建輔(おおにし けんすけ)
興味のある分野
データ構造とアルゴリズム(特に計算幾何)
データベース(索引構造, データ工学)
iPhoneアプリやAndroidアプリの作成(学生と)
パズル・ゲーム関係問題自動生成やクライアント作成(学生と)
目次
1. 右か左か?⇒線分のどちら側に点があるかを判定
2. どこで交わっている?⇒多数の線分があるとき,
交差している組を発見
3. 中か外か?⇒多角形の内部に点が含まれるかを判定
4. 近くのトイレは?⇒平面上に多数の点がある.
問合せ点がどの点に近いかを判定
右か左か?(1)
学生作成アプリ
出発地点と到着地点を指定
Google乗換案内から経路データを取得
曲がる場所とそれを結ぶ線分を描画
曲がる場所に近づくとどちらに曲がるかを提示
曲がる場所⇒点,
経路 ⇒線分(辺)計算幾何の対象!
右か左か?(2)
[問題] 点は線分に対しどこにあるか
入力: (向きあり)線分と点
出力: 右側か、左側か、線分を含む直線上か
a (a.x,a.y)
b (b.x, b.y)
c (c.x, c.y)c'
c’’
符号付面積(三角形の面積)
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
----
どこで交わっている?(1)
画像管理アプリ(作成中)
斜めから取ったスクリーンを長方形に
画像から線分を抽出
線分から四角形になるものを探す
線分のふるい落とし
真ん中にある線分 ×
中心付近で交差している線分 ×
線分の交差は?計算幾何の対象!
どこで交わっている?(2)
交差とは
2線分が交差
⇔一方の線分の点が他方に含まれる.
(線分に端点は含まれる)
例えば,
1. 線分を含む2直線から交点を計算
2. 交点が線分に含まれるか判定
a
c
d
b
a
b
c
d
どこで交わっている?(3)
符号付き面積による交差判定a
c
d
b
a
b
c
d
2線分が交差
⇔線分abに対し, 点c,dが線分abの異なる側かつ
線分cdに対し, 点a,bが線分cdの異なる側
[同一直線上の場合]
x座標かy座標が2点間に入っているか?
符号付き面積で計算可能△cda, △cdbの積が負
どこで交わっている?(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
どこで交わっている?(5)
n本の線分の交差判定(問題)
[問題]
n本の線分が与えられている場合に, 交差する線分の組を全て計算する.
入力: n本の線分
出力: 交差する線分の組
全ての線分の組をチェックO(n2)時間
どこで交わってる?(6)
n本の線分の交差判定(アイデア)
平面走査法
水平線(走査線)を上から下に移動し, 変化が起こる場所を探す⇒ 連続である必要はない. ⇒ 変化は, 交点でのみ発生.
走査線計画
走査線と線分の交差状況を表すデータ構造⇒ 線分の状態を保持. この中で, 隣り合う
線分の交差判定のみをおこなう.
イベント計画
どこで交わっている?(7)
アルゴリズムの動作 ヒープ作成
S1 S5
S3
S2
S4
ヒープ H
1
1 2
23
1
1
2
2
4
5
5
4 3
3
どこで交わっている?(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
どこで交わっている?(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
イベント計画
どこで交わっている?(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
1
どこで交わっている?(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
1
5
出力 (S1,S5)
交差判定
どこで交わっている?(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
1
5
出力 (S1,S5)
15
15
どこで交わっている?(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
1
5
出力 (S1,S5)
2
15
1
5
どこで交わっている?(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
1
5 3
交差判定
どこで交わっている?(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
交差判定
どこで交わっている?(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
どこで交わっている?(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
どこで交わってる?(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 に入力;
[定理] (Bently-Ottmann, 1979)
n本の線分に対して, 全ての交差を
O((n+k)log n)時間で計算可能. ただし, k は交点数.
どこで交わっている?(9)
アルゴリズムの性能
[証明]
“隣り合った線分だけが交差”かつ“全ての隣接関係を調査“⇒全ての交点を出力
イベント点の数は, O(n+k) 個
各イベント点で
二分探索木への挿入, からの削除, ヒープからの取り出し,
挿入が行われる. どの操作も O(log n) 時間必要.
交点数が k Wn2) となる例
n/2本
n/2本
どこで交わっている?(10)
さらに速いアルゴリズム
[定理] (Chazelle-Edelsbrunner, 1992)
n本の線分の集合に対して, 全ての交差を
O(nlog n + k) 時間で計算可能.
ただし, k は交点数.
中か外か?(1)
学生作成アプリ
タブレットに自由に描画(軌跡を赤く表示)
傾けながら, 黒いボールをスタートからゴールへただし, 赤の外側にボールを出すと終了.
軌跡は多角形と見なせる⇒ボールの重心が多角形内部に入っているか?
中か外か?(2)
問題設定
[入力] Q: 多角形, n頂点p: 点
[出力] Q の内部にpが含まれているかどうか?
多角形Qは, 点の配列(p0,p1, …, pn-1)
と表現
p
p’
中か外か?(3)
ジョルダンの閉曲線定理
[定理]
(ジョルダンの閉曲線定理)
c: 平面上の単純閉曲線
cにより, 平面は閉曲線の内部と外部に分割される
自己交差のない始点と終点が同じ曲線,
中か外か?(4)
アイデア
点 pをある方向に移動⇒内部から外部も
外部から内部も必ず辺を通る
⇒中ならば, 奇数回外ならば, 偶数回交差あり.
p
p’
中か外か?(5)
アルゴリズム
[入力] p:点,
Q : 単純多角形, (p0,p1, …, pn-1)
[出力] p が Qに含まれるかどうか?
l : pからでる半直線(どの方向でもよい)
1. Qの全ての辺 pi pi+1 とl の交差の回数を計算
2. もし, 回数が奇数ならば, 内部の点そうでなければ, 外部の点
…… 時間計算量 O(n)時間
中か外か?(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
多角形の内部が凸集合
中か外か?(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
中か外か?(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
近くのトイレは?(1)
多目的トイレマップ
http://wc.m47.jp/
みんなで作るトイレマップ(Androidアプリ)
〇〇トイレマップ
……
東海大のトイレマップを作成中
近くのトイレは?(2)
ボロノイ図
それぞれの点に最も近い領域で分割
自然界に多く存在
人間の皮膚,蜂の巣,
砂浜の模様
様々な分野で応用
社会学, 数学, 生物学,
物理学, 考古学など
近くのトイレは?(3)
最近点の検索
1. 点を適当に選ぶ. この点と問合せ点 qとの距離を計算;
2. 隣り合った領域の点とq
との距離を計算;
3. If (最初の距離が最も小さい)
then 最近点を発見else もっとも距離の小さな点に移動. Step 2へ
q
近くのトイレは?(4)
ボロノイ図の定義
P={p0,p1, ..., pn-1} : 点集合
d(p,q): ユークリッド距離
V(pi) : 点piに関するボロノイ領域
V(pi) (i=1,.., n)をボロノイ図と定義. V(P)と表現
ij
jii pxdpxdxpV
),(),( | )(
母点
ボロノイ頂点
ボロノイ辺
ボロノイ領域
近くのトイレは?(5)
ボロノイ図の性質
ボロノイ領域は凸
ボロノイ頂点は3つのボロノイ辺の交点
ボロノイ頂点を中心とする円は,
対応する3頂点以外を含まない
piがpjに最も近い母点
⇒ V(pi)とV(pj)は隣接
n点に対するボロノイ図
高々2n-5個のボロノイ頂点
高々3n-6本のボロノイ辺
近くのトイレは?(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)
[定理]
pl pr : sの左右側の平面
V(S)は, V(Sl)∩pl と V(Sr)∩pr の和集合
Sl Sr Sl Sr
近くのトイレは?(7)
ボロノイ図の構成法(折れ線列)
s(Sl,Sr) : V(S)の辺で, V(pi),
V(pj)に共有される辺.
ただし, pi Sl, pj Sr
補題 s(Sl,Sr) は線分の列となる. それをsと書く
補題 sは単調な折れ線列
y座標が必ず減少している) Sl Sr
t1
t2
pl prerel
e
近くのトイレは?(7)
ボロノイ図の構成法(折れ線列)
近くのトイレは?(7)
ボロノイ図の構成法(折れ線列)
t1
t2
pl prerel
e
近くのトイレは?(7)
ボロノイ図の構成法(折れ線列)
t1
t2
pl prerel
e
近くのトイレは?(7)
ボロノイ図の構成法(折れ線列)
t1
t2
pl prerel
e
近くのトイレは?(7)
ボロノイ図の構成法(折れ線列)
t1
t2
pl prerel
e
折れ線列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座標
(証明)
sのサイズ: O(n)
Step 1. 縮小法で傾きの中央値を計算…O(n)時間で計算可能
Step2. 二重のwhile文
⇒全体で, どの辺も高々2回しか交差判定されない.
⇒ O(n)時間で計算可能 Sl Sr
[補題]折れ線列sはO(n)時間で構成できる.
最後に
計算幾何(特に2次元)の対象は, 様々なところで利用可能
線分, 交差, ボロノイ図(今日の話)
凸包, デローネ三角形分割, アレンジメント,
区分木, パラメトリック探索など
ライブラリとして, CGAL, LEDA, Boost
Geometry, OpenCVなどもあり.
Androidアプリを作るのは結構面白い.
(アルゴリズム+Androidアプリの本でも)