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

Slides:



Advertisements
Similar presentations
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
Advertisements

3次元nクイーン問題の 解に関する研究 論理工学研究室 伊藤精一
エクセル(1)の目次 起動法、ブック、シート、セル ブックの開き方 エクセル画面 マウスポインターの種類 シート数の調節 データの入力法
ヒープソートの演習 第13回.
第12回 ソート(3): シェルソート、クイックソート
アルゴリズムとデータ構造1 2008年7月22日
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
2分探索.
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
On the Enumeration of Colored Trees
Princess, a Strategiest
エクセル(1)の目次 起動法、ブック、シート、セル ブックの開き方 エクセル画面 マウスポインターの種類 シート数の調節 データの入力法
An Algorithm for Enumerating Maximal Matchings of a Graph
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
2009/11/20 探索アルゴリズム(2) 第8講: 平成21年11月20日 (金) 4限 E252教室 コンピュータアルゴリズム.
探索アルゴリズム (1) 第7講: 平成21年11月13日 (金) 4限 E252教室.
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
アルゴリズムとデータ構造 --- 理論編 --- 山本 真基
エージェントを管理するボスの苦悩 問題 n人のエージェントを部下に持つボスがいる. エージェントは出張・帰還を頻繁に繰り返す.
ヒープソートの復習.
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
第11回 整列 ~ シェルソート,クイックソート ~
二分探索木によるサーチ.
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
算法数理工学 第3回 定兼 邦彦.
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造1 2005年7月15日
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
A Simple Algorithm for Generating Unordered Rooted Trees
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
データ構造とアルゴリズム論 第5章 整列(ソート)のアルゴリズム
プログラミング 4 整列アルゴリズム.
2009/10/23 整列アルゴリズム (1) 第4講: 平成21年10月23日 (金) 4限 E252教室 コンピュータアルゴリズム.
ぷよゲーの作り方入門 うでぃおふ 11th サカモトトマト Push key F5 Enter で 次のページへ.
プログラミング 4 木構造とヒープ.
15.cons と種々のデータ構造.
情報知能学科「アルゴリズムとデータ構造」
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
第9回 優先度つき待ち行列,ヒープ,二分探索木
ハフマン符号長の効率的な求め方.
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2011年6月16日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの復習 第12回.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
ソートのプログラムの流れ 配列の中身を小さい順に並び替える a[1],a[2],…a[n]の値を順に出力する
ヒープソート.
ヒープソート.
アルゴリズムとデータ構造 2013年6月20日
参考:大きい要素の処理.
新人研修発表 平成13年5月14日(月) 探索アルゴリズム ハッシュ法について 株式会社 エーアイネット・テクノロジ          須田 哲生.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

平面走査法を使った 一般線分の 交点列挙アルゴリズム プログラミング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