Half-plane Intersection
程度★ 難度★
Half-plane
一條直線把二維平面劃分為兩半,其中一半就是「半平面」。半平面可以包含直線,也可以不包含直線。
半平面的一些圖示方式:
實作時,通常以兩個點來紀錄半平面的直線、以兩個點的順序來紀錄半平面的方向。
Half-plane Intersection
「半平面交」就是許多個半平面的交集區域。半平面交的結果可能是:一個開放區域、一個凸多邊形、一條線、一條線段、一個點、空集合。
Half-plane Intersection: Incremental Method
程度★ 難度★★
演算法
一、預先使用四個半平面,設定一個極大的正方形邊界,讓半平面交擁有邊界。 二、逐一加入每個半平面,並求出當下的半平面交。
online演算法,隨時維護一個半平面交(凸多邊形)。每次更新需時O(N),總時間複雜度為O(N^2),N是半平面數目。
UVa 10084 10117 11265 10974
演算法
時間複雜度得改進至O(NlogN),過程神似「Convex Hull: Incremental Method」,求切點改為求交點即可。
UVa 11989
Half-plane Intersection: Divide and Conquer
程度★ 難度★★
演算法
時間複雜度為O(NlogN),N是半平面數目。
divide:把半平面分成兩堆。 conquer:分別遞迴求解。 merge:求兩個凸多邊形的交集。O(N)
兩個凸多邊形的交集,可以用旋轉卡尺求解,也可以用掃瞄線求解。
UVa 137
Half-plane Intersection: 另一種演算法
程度★ 難度★★★
演算法
時間複雜度為O(NlogN),主要取決於排序的時間。N是半平面數目。
可以輕鬆求出組成半平面交的直線是哪些。
一、所有半平面按照極座標角度(斜率)排序。O(NlogN) 角度相同的半平面只需留下最內側的一個。 二、建立一個deque,加入前面兩個半平面。 三、從第三個半平面開始,依序將半平面加入deque: 甲、deque右端持續彈出,直到deque右端的兩個半平面的交點,位於此半平面內。 乙、deque左端持續彈出,直到deque左端的兩個半平面的交點,位於此半平面內。 丙、deque右端加入此半平面。 四、刪除deque兩端多餘的半平面: 甲、deque右端持續彈出,直到deque右端的兩個半平面的交點,位於deque左端的半平面內。 乙、deque左端持續彈出,直到deque左端的兩個半平面的交點,位於deque右端的半平面內。 丙、重覆甲乙,直到無法彈出。
Envelope
程度★★ 難度★
Envelope
使用斜率與截距進行點與線的轉換,可以發現:以半平面交求Envelope,等價於對偶之後求凸包。
也就是說,求半平面交的困難度等同於求凸包的困難度。
【待補文字】
UVa 11756