凸多邊形最小面積外接矩形
給定一個凸多邊形 P , 面積最小的能裝下 P (就外圍而言)的矩形是怎樣的呢? 從技術上說, 給定一個方向, 能計算出 P 的端點並且構由此造出外接矩形。 但是我們需要測試每個情形來獲得每個矩形來計算最小面積嗎? 謝天謝地, 我們不必那麼幹。
對於多邊形 P 的一個外接矩形存在一條邊與原多邊形的邊共線。
上述結論有力地限制了矩形的可能範圍。 我們不僅不必去檢測所有可能的方向, 而且只需要檢測與多邊形邊數相等數量的矩形。
圖示上述結論: 四條切線(紅色), 其中一條與多邊形一條邊重合, 確定了外接矩形(藍色)。
一個簡單的演算法是依次將每條邊作為與矩形重合的邊進行計算。 但是這種構造矩形的方法涉及到計算多邊形每條邊端點, 一個花費 O(n) 時間(因為有 n 條邊)的計算。 整個演算法將有二次時間複雜度。
一個更高效的演算法已經發現。 利用旋轉卡殼, 我們可以在常數時間內即時更新, 而不是重新計算端點。
實際上, 考慮一個凸多邊形, 擁有兩對和 x 和 y 方向上四個端點相切的切線。 四條線已經確定了一個多邊形的外接矩形。 但是除非多邊形有一條水平的或是垂直的邊, 這個矩形的面積就不能算入最小面積中。
然而, 可以通過旋轉線直到條件滿足。 這個過程是下屬演算法的核心。 假設按照順時針順序輸入一個凸多邊形的 n 個頂點。
- 計算全部四個多邊形的端點, 稱之為 xminP, xmaxP, yminP, ymaxP。
- 通過四個點構造 P 的四條切線。 他們確定了兩個“卡殼”集合。
- 如果一條(或兩條)線與一條邊重合, 那麼計算由四條線決定的矩形的面積, 並且儲存為當前最小值。 否則將當前最小值定義為無窮大。
- 順時針旋轉線直到其中一條和多邊形的一條邊重合。
- 計算新矩形的面積, 並且和當前最小值比較。 如果小於當前最小值則更新, 並儲存確定最小值的矩形資訊。
- 重複步驟4和步驟5, 直到線旋轉過的角度大於90度。
- 輸出外接矩形的最小面積。
因為兩對的“卡殼”確定了一個外接矩形, 這個演算法考慮到了所有可能算出最小面積的矩形。 進一步, 除了初始值外, 演算法的主迴圈只需要執行頂點總數多次。 因此演算法是線性時間複雜度的。
一個相似但是鮮為人知的問題是最小周長外接矩形問題。 有趣的是這兩個問題是完全不同的問題, 因為存在(儘管極少)最小面積外接矩形和最小周長外接矩形多邊形不重合的多邊形。
原文地址:http://cgm.cs.mcgill.ca/~orm/maer.html
轉載請註明出處,謝謝!