平面走査法を使った 一般線分の 交点列挙アルゴリズム プログラミングIII 磯 直行
平面走査法による 一般線分集合の 交点列挙 計算機にとっては大変時間のかかる処理 単純法なら O(n2) ↓ 効率の良い アルゴリズムだと 1 2 3 5 7 6 4 0 x y 平面走査法による 一般線分集合の 交点列挙 計算機にとっては大変時間のかかる処理 単純法なら O(n2) ↓ 効率の良い アルゴリズムだと O(n log n) 高速!
高速に実行するための基礎知識 データ構造「ヒープ」 2分木の親子方向(y軸方向)に大小関係を 保持したデータ構造 データ構造「2分探索木」 2分木の横方向(x軸方向)に大小関係を 小 形状に関する条件: 高さー1までは完全2分木 葉は左寄せ 大 形状に関する条件:なし 小 大
Point1 走査線 (スイープライン) ↓ 「ヒープ」を利用 走査線を移動させ y座標の小さい順に 図面を走査 走査線の 次の停止位置は 候補の中でもっとも y座標の小さいもの ↓ たくさんの候補の中から 走査線が次に停止する y座標をすぐに答えることの できる データ構造 「ヒープ」を利用 高速! 1 2 3 5 7 6 4 0 x y 交差発見! 交差発見! 交差発見!
Point2 交差の探索 ↓ 「2分探索木」を利用 走査線が停止するごとに 走査線と交差する多くの 線分から交差するものを y Point2 交差の探索 走査線が停止するごとに 走査線と交差する多くの 線分から交差するものを 高速に調査する必要あり ↓ x軸方向に高速探索ができる データ構造 「2分探索木」を利用 高速! 7 6 5 走査線と交差する 線分の位置関係を保持 4 3 2 1 x 0 1 2 3 4 5 6 7
効率の良い 一般線分の交差列挙アルゴリズム 線分の端点を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 (必要な操作:「データの挿入」と「削除」,および「隣接データの探索」)
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) 4 「空」でスタート l1 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」でスタート x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l1の下端点(1,2)を追加 4 l1 2 (l1下) 完了! 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l1の上端点(6,7)を追加 4 l1 2 (l1下) 完了! 7 (l1上) 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の下端点(4,1)を追加 4 l1 2 (l1下) 7 (l1上) 1 (l2下) 3 大小(上下)関係不整合 →親子で要素を交換 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の下端点(4,1)を追加 4 l1 1 (l2下) 完了! 7 (l1上) 2 (l1下) 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の上端点(1,4)を追加 4 l1 1 (l2下) 7 (l1上) 2 (l1下) 3 4 (l2上) (5,3) l2 大小(上下)関係不整合 →親子で要素を交換 (場合によっては,さらに上方向へ交換することもある) 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l2の上端点(1,4)を追加 4 l1 1 (l2下) 完了! 4 (l2上) 2 (l1下) 3 7 (l1上) (5,3) (場合によっては,さらに上方向へ交換することもある) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l3の下端点(3,1)を追加 4 l1 1 (l2下) 7 (l1上) 2 (l1下) 3 4 (l2上) 1 (l3下) (5,3) l2 大小(上下)関係不整合 →親子で要素を交換 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l3の下端点(3,1)を追加 4 l1 1 (l2下) 完了! 1 (l3下) 2 (l1下) 3 4 (l2上) 7 (l1上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l3の上端点(5,3)を追加 4 l1 1 (l2下) 完了! 1 (l3下) 2 (l1下) 3 4 (l2上) 7 (l1上) 3 (l3上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l4の下端点(7,2)を追加 4 l1 1 (l2下) 完了! 1 (l3下) 2 (l1下) 3 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 探索のための準備 1.線分の端点をy座標をキーとして ヒープ H に挿入する. 2.2分探索木 T を空にする. (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 どの順でも良いので,Hへ挿入 例えば,各線分の下端点,上端点の順で挿入 l4 (1,4) l4の上端点(3,6)を追加 4 l1 根(root)は最小値→ 1 (l2下) 完了! 1 (l3下) 2 (l1下) 3 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) ヒープ完成! l2 6 (l4上) 2 l3 データの最小値は根(root)に保存される (次に走査線を停止させる座標値がわかる) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 1 (l2下) 4 l1 最後の要素を 強制的に根へ 1 (l3下) 2 (l1下) 3 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 6 (l4上) 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 4 l1 6 (l4上) (場合によっては, さらに下方向へ交換することもある) 1 (l3下) 2 (l1下) 3 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 4 l1 1 (l3下) (場合によっては, さらに下方向へ交換することもある) 6 (l4上) 2 (l1下) 3 4 (l2上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 1 (l3下) 4 (l2上) 2 (l1下) 3 6 (l4上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) 「空」のまま x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 1 (l3下) 4 (l2上) 2 (l1下) 3 6 (l4上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l2を追加 l2 完了! x 0 1 2 3 4 5 6 7 両隣の線分と交差の可能性あり →チェック→交点をヒープに追加
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 1 (l3下) 4 l1 4 (l2上) 2 (l1下) 3 6 (l4上) 7 (l1上) 3 (l3上) 2 (l4下) (5,3) 最後の要素を 強制的に根へ l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l2を追加 l2 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 2 (l4下) 4 (l2上) 2 (l1下) 3 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l2を追加 l2 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 交点が発見された場合はヒープに追加 l4 (1,4) 4 交点のy座標を追加 l1 2 (l4下) 1.5 (l2とl3) 4 (l2上) 2 (l1下) 3 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l3を追加 l2 完了! l3 x 0 1 2 3 4 5 6 7 両隣の線分と交差の可能性あり →チェック→交点をヒープに追加
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 交点が発見された場合はヒープに追加 l4 (1,4) 大小(上下)関係不整合 →親と交換 4 l1 2 (l4下) 4 (l2上) 2 (l1下) 3 6 (l4上) 7 (l1上) 3 (l3上) 1.5 (l2とl3) (5,3) (場合によっては, さらに上方向へ交換することもある) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l2 完了! l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 交点が発見された場合はヒープに追加 l4 (1,4) さらに大小(上下)関係不整合 →さらに親と交換 4 l1 2 (l4下) 4 (l2上) 1.5 (l2とl3) 3 6 (l4上) 7 (l1上) 3 (l3上) 2 (l1下) (5,3) (場合によっては,さらに上方向へ交換することもある) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l2 完了! l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 交点が発見された場合はヒープに追加 l4 (1,4) 4 l1 1.5 (l2とl3) 4 (l2上) 2 (l4下) 3 6 (l4上) 7 (l1上) 3 (l3上) 2 (l1下) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,さらに下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 走査線 1 (3,1) (4,1) l2 完了! l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1.5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 1.5 (l2とl3) 4 l1 4 (l2上) 2 (l4下) 3 6 (l4上) 7 (l1上) 3 (l3上) 2 (l1下) (5,3) 最後の要素を 強制的に根へ l2 2 l3 走査線 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 完了! l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1.5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 2 (l1下) 4 (l2上) 2 (l4下) 3 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) 走査線 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 完了! l3 x 交点で線分の左右関係を入替 →隣接線分との交差チェック 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=1.5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 2 (l1下) 4 (l2上) 2 (l4下) 3 6 (l4上) 7 (l1上) 3 (l3上) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) 走査線 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 完了! l3 x 交点で線分の左右関係を入替 →隣接線分との交差チェック 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 2 (l1下) 4 最後の要素を 強制的に根へ l1 4 (l2上) 2 (l4下) 3 6 (l4上) 7 (l1上) 3 (l3上) (5,3) 走査線 l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 4 l1 3 (l3下) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 2 (l4下) 3 6 (l4上) 7 (l1上) (5,3) 走査線 l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 2 (l4下) 4 (l2上) 3 (l3下) 3 6 (l4上) 7 (l1上) (5,3) 走査線 l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 交点のy座標を追加 l1 2 (l4下) 3 (l1とl2) 4 (l2上) 3 (l3下) 3 6 (l4上) 7 (l1上) (5,3) 走査線 l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1を追加 l2 l1 l3 x 0 1 2 3 4 5 6 7 両隣の線分と交差の可能性あり →チェック→交点をヒープに追加
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 交点のy座標を追加 l1 2 (l4下) 4 (l2上) 3 (l3下) 3 6 (l4上) 7 (l1上) 3 (l1とl2) (5,3) 走査線 l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 2 (l4下) 4 交点のy座標を追加 最後の要素を 強制的に根へ l1 4 (l2上) 3 (l3下) 3 6 (l4上) 7 (l1上) 3 (l1とl2) (5,3) 走査線 l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 交点のy座標を追加 l1 3 (l1とl2) 4 (l2上) 3 (l3下) 3 6 (l4上) 7 (l1上) (5,3) 走査線 l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=2とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 交点のy座標を追加 l1 3 (l1とl2) 4 (l2上) 3 (l3下) 3 6 (l4上) 7 (l1上) (5,3) 走査線 l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l4を追加 l2 l1 l3 x l4 0 1 2 3 4 5 6 7 交点で線分の左右関係を入替 →隣接線分との交差チェック
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 交点のy座標を追加 3 (l1とl2) l1 4 (l2上) 3 (l3下) 走査線 3 最後の要素を 強制的に根へ 6 (l4上) 7 (l1上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 4 l1 7 (l1上) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 3 (l3下) 走査線 3 6 (l4上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 3 (l3上) 4 (l2上) 7 (l1下) 走査線 3 6 (l4上) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 3 (l3上) 4 (l2上) 7 (l1下) 走査線 3 6 (l4上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2 l1 l3 x l4 0 1 2 3 4 5 6 7 交点で線分の左右関係を入替 →隣接線分との交差チェック
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 3 (l3上) 4 (l2上) 7 (l1下) 走査線 3 6 (l4上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 完了! l2 l3 x l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 3 (l3下) 4 l1 4 (l2上) 7 (l1下) 走査線 3 最後の要素を 強制的に根へ 6 (l4上) (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l2 l3 x l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 4 l1 6 (l4上) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 7 (l1下) 走査線 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l2 l3 x l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 大小(上下)関係不整合 →子の小さい方と交換 4 l1 6 (l4上) (場合によっては, さらに下方向へ交換することもある) 4 (l2上) 7 (l1下) 走査線 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l2 l3 x l4 l4 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 4 (l2上) 6 (l4上) 7 (l1下) 走査線 3 (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l2 l3 x l4 0 1 2 3 4 5 6 7
隣接線分の交差チェック→l1とl4の交点をヒープへ追加 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 交点のy座標を追加 l1 4 (l2上) 5 (l1とl4) 6 (l4上) 7 (l1下) 走査線 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l3を削除 l1 × l2 l3 x l4 0 1 2 3 4 5 上端点なのでl3を削除 隣接線分の交差チェック→l1とl4の交点をヒープへ追加 6 7
隣接線分の交差チェック→l1とl4の交点をヒープへ追加 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 4 (l2上) 6 (l4上) 7 (l1下) 走査線 3 5 (l1とl4) 大小(上下)関係不整合 →親と交換 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l3を削除 l1 × l2 l3 x l4 0 1 2 3 4 5 上端点なのでl3を削除 隣接線分の交差チェック→l1とl4の交点をヒープへ追加 6 7
隣接線分の交差チェック→l1とl4の交点をヒープへ追加 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 4 (l2上) 5 (l1とl4) 7 (l1下) 走査線 3 6 (l4上) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l3を削除 l1 × l2 l3 x l4 0 1 2 3 4 5 上端点なのでl3を削除 隣接線分の交差チェック→l1とl4の交点をヒープへ追加 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=3とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 4 (l2上) 5 (l1とl4) 7 (l1下) 走査線 3 6 (l4上) (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 完了! l2 l4 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=4とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 走査線 4 (l2下) 4 l1 5 (l1とl4) 7 (l1下) 3 6 (l4上) 最後の要素を 強制的に根へ (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l2 l4 x 0 1 2 3 4 5 6 7
× l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=4とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 走査線 4 l1 6 (l4上) 5 (l1とl4) 7 (l1下) 3 大小(上下)関係不整合 →子の小さい方と交換 (5,3) l2 (場合によっては, さらに下方向へ交換することもある) 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2を削除 l1 × l2 l4 x 0 1 2 3 4 5 6 上端点なのでl2を削除 隣接線分の交差があればヒープへ追加 7
× l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=4とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 走査線 4 l1 5 (l1とl4) 6 (l4上) 7 (l1下) 3 (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l2を削除 l1 × l2 l4 x 0 1 2 3 4 5 6 上端点なのでl2を削除 隣接線分の交差があればヒープへ追加 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 走査線 5 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 5 (l1とl4) l1 6 (l4上) 7 (l1下) 3 最後の要素を 強制的に根へ (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l4 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 走査線 5 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 7 (l1下) 6 (l4上) 3 大小(上下)関係不整合 →子の小さい方と交換 (5,3) (場合によっては, さらに下方向へ交換することもある) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l4 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 走査線 5 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 6 (l4下) 7 (l1上) 3 (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 l4 x 交点で線分の左右関係を入替 →隣接線分との交差チェック 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 走査線 5 走査線の停止位置は y=5とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 6 (l4下) 7 (l1上) 3 (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l4 完了! l1 x 0 1 2 3 4 5 6 7
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 走査線 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=6とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 6 (l4下) 4 l1 7 (l1上) 最後の要素を 強制的に根へ 3 (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l4 完了! l1 x 0 1 2 3 4 5 6 7
× l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 (6,7) 7 (3,6) 走査線 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=6とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 7 (l1上) 3 (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 × (3,1) (4,1) l4を削除 l4 l1 x 0 1 2 3 4 5 6 7 上端点なのでl4を削除 隣接線分の交差があればヒープへ追加
l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 走査線 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=6とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 7 (l1下) 4 l1 3 (5,3) l2 ヒープ再構成完了! 2 l3 (場合によっては,下方向へ交換することもある) (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 (3,1) (4,1) l1 完了! x 0 1 2 3 4 5 6 7
× l4 l1 l2 l3 交点列挙アルゴリズム実行例 y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 走査線 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=7とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 3 ヒープ Hが空になった! (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 × (3,1) (4,1) l1を削除 l1 x 0 1 2 3 4 5 6 7 上端点なのでl1を削除 隣接線分の交差があればヒープへ追加
l4 l1 l2 l3 交点列挙アルゴリズム実行例 アルゴリズム 終了! y 走査線を移動させ,探索実行 While Hが空でない do 下端点,上端点,交点に 場合わけして交点探索処理 走査線 (6,7) 7 (3,6) 6 ヒープ H (次に走査線が停止するy座標を保持) 5 走査線の停止位置は y=7とわかったので ヒープの根を削除してヒープを再構成 l4 (1,4) 4 l1 3 ヒープ Hが空になった! (5,3) l2 2 l3 (7,2) (1,2) 2分探索木 T (走査線上の線分のx座標を保持) 1 アルゴリズム 終了! (3,1) (4,1) 2分探索木も空になった! x 0 1 2 3 4 5 6 7