Publicité
Publicité

Comp geom20131107open

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