任意線分の 交点列挙アルゴリズム

Download Report

Transcript 任意線分の 交点列挙アルゴリズム

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