旋轉卡殼——凸多邊形最小面積外接矩形

來源:互聯網
上載者:User
凸多邊形最小面積外接矩形

給定一個凸多邊形 P , 面積最小的能裝下 P (就外圍而言)的矩形是怎樣的呢? 從技術上說, 給定一個方向, 能計算出 P 的端點並且構由此造出外接矩形。 但是我們需要測試每個情形來獲得每個矩形來計算最小面積嗎? 謝天謝地, 我們不必那麼幹。

對於多邊形 P 的一個外接矩形存在一條邊與原多邊形的邊共線。

上述結論有力地限制了矩形的可能範圍。 我們不僅不必去檢測所有可能的方向, 而且只需要檢測與多邊形邊數相等數量的矩形。 

圖示上述結論: 四條切線(紅色), 其中一條與多邊形一條邊重合, 確定了外接矩形(藍色)。


一個簡單的演算法是依次將每條邊作為與矩形重合的邊進行計算。 但是這種構造矩形的方法涉及到計算多邊形每條邊端點, 一個花費 O(n) 時間(因為有 n 條邊)的計算。 整個演算法將有二次時間複雜度。

一個更高效的演算法已經發現。 利用旋轉卡殼, 我們可以在常數時間內即時更新, 而不是重新計算端點。
實際上, 考慮一個凸多邊形, 擁有兩對和 xy 方向上四個端點相切的切線。 四條線已經確定了一個多邊形的外接矩形。 但是除非多邊形有一條水平的或是垂直的邊, 這個矩形的面積就不能算入最小面積中。
然而, 可以通過旋轉線直到條件滿足。 這個過程是下屬演算法的核心。 假設按照順時針順序輸入一個凸多邊形的 n 個頂點。

  1. 計算全部四個多邊形的端點, 稱之為 xminPxmaxPyminPymaxP
  2. 通過四個點構造 P 的四條切線。 他們確定了兩個“卡殼”集合。
  3. 如果一條(或兩條)線與一條邊重合, 那麼計算由四條線決定的矩形的面積, 並且儲存為當前最小值。 否則將當前最小值定義為無窮大。
  4. 順時針旋轉線直到其中一條和多邊形的一條邊重合。
  5. 計算新矩形的面積, 並且和當前最小值比較。 如果小於當前最小值則更新, 並儲存確定最小值的矩形資訊。
  6. 重複步驟4和步驟5, 直到線旋轉過的角度大於90度。
  7. 輸出外接矩形的最小面積。

因為兩對的“卡殼”確定了一個外接矩形, 這個演算法考慮到了所有可能算出最小面積的矩形。 進一步, 除了初始值外, 演算法的主迴圈只需要執行頂點總數多次。 因此演算法是線性時間複雜度的。

一個相似但是鮮為人知的問題是最小周長外接矩形問題。 有趣的是這兩個問題是完全不同的問題, 因為存在(儘管極少)最小面積外接矩形和最小周長外接矩形多邊形不重合的多邊形。

 

 

原文地址:http://cgm.cs.mcgill.ca/~orm/maer.html

 

轉載請註明出處,謝謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.