Presentation is loading. Please wait.

Presentation is loading. Please wait.

平面走査法を使った 一般線分の 交点列挙アルゴリズム

Similar presentations


Presentation on theme: "平面走査法を使った 一般線分の 交点列挙アルゴリズム"— Presentation transcript:

1 平面走査法を使った 一般線分の 交点列挙アルゴリズム
プログラミングIII 磯 直行

2 平面走査法による 一般線分集合の 交点列挙 計算機にとっては大変時間のかかる処理 単純法なら O(n2) ↓ 効率の良い アルゴリズムだと
x y 平面走査法による 一般線分集合の 交点列挙 計算機にとっては大変時間のかかる処理 単純法なら O(n2) 効率の良い アルゴリズムだと O(n log n) 高速!

3 高速に実行するための基礎知識 データ構造「ヒープ」 2分木の親子方向(y軸方向)に大小関係を 保持したデータ構造 データ構造「2分探索木」
2分木の横方向(x軸方向)に大小関係を 形状に関する条件: 高さー1までは完全2分木 葉は左寄せ 形状に関する条件:なし

4 Point1 走査線 (スイープライン) ↓ 「ヒープ」を利用 走査線を移動させ y座標の小さい順に 図面を走査 走査線の 次の停止位置は
候補の中でもっとも y座標の小さいもの たくさんの候補の中から 走査線が次に停止する y座標をすぐに答えることの できる データ構造 「ヒープ」を利用 高速! x y 交差発見! 交差発見! 交差発見!

5 Point2 交差の探索 ↓ 「2分探索木」を利用 走査線が停止するごとに 走査線と交差する多くの 線分から交差するものを
y Point2 交差の探索 走査線が停止するごとに 走査線と交差する多くの 線分から交差するものを 高速に調査する必要あり x軸方向に高速探索ができる データ構造 「2分探索木」を利用 高速! 走査線と交差する 線分の位置関係を保持 x

6 効率の良い 一般線分の交差列挙アルゴリズム
線分の端点をy座標をキーとしてヒープHに挿入 2分探索木Tを空にする While Hが空でない do Hから最小要素pを取り出す pが線分l の下端点ならば,l をTに挿入する.Tにおいてl と隣接する2本の 線分との間に交点があれば,それらを報告する.交点を新しい線分の下端点としてHに挿入する c. pが線分l の上端点ならば,l をTから削除する.l の削除によってはじめて 隣接する(それまでl の両隣に位置していた)線分の間に交点があれば, それを報告する.交点を新しい線分の下端点としてHに挿入する. 用意するデータ構造 ヒープ H (必要な操作:「データの挿入」と「最小データの探索・削除」) 2分探索木 T (必要な操作:「データの挿入」と「削除」,および「隣接データの探索」)

7 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) 「空」でスタート l1 (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」でスタート x

8 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l1の下端点(1,2)を追加 l1 2 (l1下) 完了! (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

9 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l1の上端点(6,7)を追加 l1 2 (l1下) 完了! 7 (l1上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

10 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の下端点(4,1)を追加 l1 2 (l1下) 7 (l1上) 1 (l2下) 大小(上下)関係不整合 →親子で要素を交換 (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

11 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の下端点(4,1)を追加 l1 1 (l2下) 完了! 7 (l1上) 2 (l1下) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

12 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の上端点(1,4)を追加 l1 1 (l2下) 7 (l1上) 2 (l1下) 4 (l2上) (5,3) l2 大小(上下)関係不整合 →親子で要素を交換 (場合によっては,さらに上方向へ交換することもある) l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

13 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の上端点(1,4)を追加 l1 1 (l2下) 完了! 4 (l2上) 2 (l1下) 7 (l1上) (5,3) (場合によっては,さらに上方向へ交換することもある) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

14 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l3の下端点(3,1)を追加 l1 1 (l2下) 7 (l1上) 2 (l1下) 4 (l2上) 1 (l3下) (5,3) l2 大小(上下)関係不整合 →親子で要素を交換 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

15 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l3の下端点(3,1)を追加 l1 1 (l2下) 完了! 1 (l3下) 2 (l1下) 4 (l2上) 7 (l1上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

16 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l3の上端点(5,3)を追加 l1 1 (l2下) 完了! 1 (l3下) 2 (l1下) 4 (l2上) 7 (l1上) 3 (l3上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

17 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l4の下端点(7,2)を追加 l1 1 (l2下) 完了! 1 (l3下) 2 (l1下) 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

18 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する.
2.2分探索木 T を空にする. (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l4の上端点(3,6)を追加 l1 根(root)は最小値→ 1 (l2下) 完了! 1 (l3下) 2 (l1下) 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) ヒープ完成! l2 6 (l4上) l3 データの最小値は根(root)に保存される (次に走査線を停止させる座標値がわかる) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) 「空」のまま x

19 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 1 (l2下) l1 最後の要素を 強制的に根へ 1 (l3下) 2 (l1下) 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 6 (l4上) l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) 「空」のまま x

20 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 l1 6 (l4上) (場合によっては, さらに下方向へ交換することもある) 1 (l3下) 2 (l1下) 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) 「空」のまま x

21 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 l1 1 (l3下) (場合によっては, さらに下方向へ交換することもある) 6 (l4上) 2 (l1下) 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) 「空」のまま x

22 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 1 (l3下) 4 (l2上) 2 (l1下) 6 (l4上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) 「空」のまま x

23 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 1 (l3下) 4 (l2上) 2 (l1下) 6 (l4上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l2を追加 l2 完了! x 両隣の線分と交差の可能性あり →チェック→交点をヒープに追加

24 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 1 (l3下) l1 4 (l2上) 2 (l1下) 6 (l4上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) 最後の要素を 強制的に根へ l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l2を追加 l2 x

25 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 2 (l4下) 4 (l2上) 2 (l1下) 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l2を追加 l2 x

26 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 交点が発見された場合はヒープに追加 l4 (1,4) 交点のy座標を追加 l1 2 (l4下) 1.5 (l2とl3) 4 (l2上) 2 (l1下) 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l3を追加 l2 完了! l3 x 両隣の線分と交差の可能性あり →チェック→交点をヒープに追加

27 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 交点が発見された場合はヒープに追加 l4 (1,4) 大小(上下)関係不整合 →親と交換 l1 2 (l4下) 4 (l2上) 2 (l1下) 6 (l4上) 7 (l1上) 3 (l3上) 1.5 (l2とl3) (5,3) (場合によっては, さらに上方向へ交換することもある) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l2 完了! l3 x

28 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 交点が発見された場合はヒープに追加 l4 (1,4) さらに大小(上下)関係不整合 →さらに親と交換 l1 2 (l4下) 4 (l2上) 1.5 (l2とl3) 6 (l4上) 7 (l1上) 3 (l3上) 2 (l1下) (5,3) (場合によっては,さらに上方向へ交換することもある) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l2 完了! l3 x

29 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 交点が発見された場合はヒープに追加 l4 (1,4) l1 1.5 (l2とl3) 4 (l2上) 2 (l4下) 6 (l4上) 7 (l1上) 3 (l3上) 2 (l1下) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 (3,1) (4,1) l2 完了! l3 x

30 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1.5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 1.5 (l2とl3) l1 4 (l2上) 2 (l4下) 6 (l4上) 7 (l1上) 3 (l3上) 2 (l1下) (5,3) 最後の要素を 強制的に根へ l2 l3 走査線 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 完了! l3 x

31 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1.5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 2 (l1下) 4 (l2上) 2 (l4下) 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) 走査線 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 完了! l3 x 交点で線分の左右関係を入替 →隣接線分との交差チェック

32 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=1.5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 2 (l1下) 4 (l2上) 2 (l4下) 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) 走査線 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 完了! l3 x 交点で線分の左右関係を入替 →隣接線分との交差チェック

33 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 2 (l1下) 最後の要素を 強制的に根へ l1 4 (l2上) 2 (l4下) 6 (l4上) 7 (l1上) 3 (l3上) (5,3) 走査線 l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l3 x

34 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 l1 3 (l3下) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 2 (l4下) 6 (l4上) 7 (l1上) (5,3) 走査線 l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l3 x

35 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 2 (l4下) 4 (l2上) 3 (l3下) 6 (l4上) 7 (l1上) (5,3) 走査線 l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l3 x

36 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 交点のy座標を追加 l1 2 (l4下) 3 (l1とl2) 4 (l2上) 3 (l3下) 6 (l4上) 7 (l1上) (5,3) 走査線 l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1を追加 l2 l1 l3 x 両隣の線分と交差の可能性あり →チェック→交点をヒープに追加

37 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 交点のy座標を追加 l1 2 (l4下) 4 (l2上) 3 (l3下) 6 (l4上) 7 (l1上) 3 (l1とl2) (5,3) 走査線 l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x

38 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 2 (l4下) 交点のy座標を追加 最後の要素を 強制的に根へ l1 4 (l2上) 3 (l3下) 6 (l4上) 7 (l1上) 3 (l1とl2) (5,3) 走査線 l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x

39 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 交点のy座標を追加 l1 3 (l1とl2) 4 (l2上) 3 (l3下) 6 (l4上) 7 (l1上) (5,3) 走査線 l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x

40 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 交点のy座標を追加 l1 3 (l1とl2) 4 (l2上) 3 (l3下) 6 (l4上) 7 (l1上) (5,3) 走査線 l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l4を追加 l2 l1 l3 x l4 交点で線分の左右関係を入替 →隣接線分との交差チェック

41 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 交点のy座標を追加 3 (l1とl2) l1 4 (l2上) 3 (l3下) 走査線 最後の要素を 強制的に根へ 6 (l4上) 7 (l1上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x l4

42 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 l1 7 (l1上) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 3 (l3下) 走査線 6 (l4上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x l4

43 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 3 (l3上) 4 (l2上) 7 (l1下) 走査線 6 (l4上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x l4

44 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 3 (l3上) 4 (l2上) 7 (l1下) 走査線 6 (l4上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2 l1 l3 x l4 交点で線分の左右関係を入替 →隣接線分との交差チェック

45 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 3 (l3上) 4 (l2上) 7 (l1下) 走査線 6 (l4上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 完了! l2 l3 x l4

46 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 3 (l3下) l1 4 (l2上) 7 (l1下) 走査線 最後の要素を 強制的に根へ 6 (l4上) (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l2 l3 x l4

47 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 l1 6 (l4上) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 7 (l1下) 走査線 (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l2 l3 x l4

48 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 l1 6 (l4上) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 7 (l1下) 走査線 (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l2 l3 x l4 l4

49 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 4 (l2上) 6 (l4上) 7 (l1下) 走査線 (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l2 l3 x l4

50 隣接線分の交差チェック→l1とl4の交点をヒープへ追加
交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 交点のy座標を追加 l1 4 (l2上) 5 (l1とl4) 6 (l4上) 7 (l1下) 走査線 (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l3を削除 l1 × l2 l3 x l4 上端点なのでl3を削除 隣接線分の交差チェック→l1とl4の交点をヒープへ追加

51 隣接線分の交差チェック→l1とl4の交点をヒープへ追加
交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 4 (l2上) 6 (l4上) 7 (l1下) 走査線 5 (l1とl4) 大小(上下)関係不整合 →親と交換 (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l3を削除 l1 × l2 l3 x l4 上端点なのでl3を削除 隣接線分の交差チェック→l1とl4の交点をヒープへ追加

52 隣接線分の交差チェック→l1とl4の交点をヒープへ追加
交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 4 (l2上) 5 (l1とl4) 7 (l1下) 走査線 6 (l4上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l3を削除 l1 × l2 l3 x l4 上端点なのでl3を削除 隣接線分の交差チェック→l1とl4の交点をヒープへ追加

53 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 4 (l2上) 5 (l1とl4) 7 (l1下) 走査線 6 (l4上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 完了! l2 l4 x

54 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=4とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 走査線 4 (l2下) l1 5 (l1とl4) 7 (l1下) 6 (l4上) 最後の要素を 強制的に根へ (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l2 l4 x

55 × l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do
下端点,上端点,交点に 場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=4とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 走査線 l1 6 (l4上) 5 (l1とl4) 7 (l1下) 大小(上下)関係不整合 →子の小さい方と交換 (5,3) l2 (場合によっては, さらに下方向へ交換することもある) l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2を削除 l1 × l2 l4 x 上端点なのでl2を削除 隣接線分の交差があればヒープへ追加

56 × l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do
下端点,上端点,交点に 場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=4とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 走査線 l1 5 (l1とl4) 6 (l4上) 7 (l1下) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l2を削除 l1 × l2 l4 x 上端点なのでl2を削除 隣接線分の交差があればヒープへ追加

57 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 5 (l1とl4) l1 6 (l4上) 7 (l1下) 最後の要素を 強制的に根へ (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l4 x

58 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 7 (l1下) 6 (l4上) 大小(上下)関係不整合 →子の小さい方と交換 (5,3) (場合によっては, さらに下方向へ交換することもある) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l4 x

59 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 6 (l4下) 7 (l1上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 l4 x 交点で線分の左右関係を入替 →隣接線分との交差チェック

60 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 6 (l4下) 7 (l1上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l4 完了! l1 x

61 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 (6,7) (3,6) 走査線 ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=6とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 6 (l4下) l1 7 (l1上) 最後の要素を 強制的に根へ (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l4 完了! l1 x

62 × l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do
下端点,上端点,交点に 場合わけして交点探索処理 (6,7) (3,6) 走査線 ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=6とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 7 (l1上) (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) × (3,1) (4,1) l4を削除 l4 l1 x 上端点なのでl4を削除 隣接線分の交差があればヒープへ追加

63 l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に
場合わけして交点探索処理 走査線 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=6とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 7 (l1下) l1 (5,3) l2 ヒープ再構成完了! l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) (3,1) (4,1) l1 完了! x

64 × l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do
下端点,上端点,交点に 場合わけして交点探索処理 走査線 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=7とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 ヒープ Hが空になった! (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) × (3,1) (4,1) l1を削除 l1 x 上端点なのでl1を削除 隣接線分の交差があればヒープへ追加

65 l4 l1 l2 l3 交点列挙アルゴリズム実行例 アルゴリズム 終了! y 走査線を移動させ,探索実行 While Hが空でない do
下端点,上端点,交点に 場合わけして交点探索処理 走査線 (6,7) (3,6) ヒープ H (次に走査線が停止するy座標を保持) 走査線の停止位置は y=7とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) l1 ヒープ Hが空になった! (5,3) l2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) アルゴリズム 終了! (3,1) (4,1) 2分探索木も空になった! x


Download ppt "平面走査法を使った 一般線分の 交点列挙アルゴリズム"

Similar presentations


Ads by Google