回答
如果你有凸包,那麼一個簡單的基本算法。您只需穿過凸包的每個邊緣並旋轉您的點,以便邊沿沿着主軸,比如說X軸。然後找到這些點的軸對齊邊界框。選擇邊界框最小的那個。
通過獲取每個維度的最小值和最大值,可以找到軸對齊的邊界框。
如果您按相反的數量旋轉邊界框,現在它將包圍原始點。
爲了使效率更高,請注意,只有可能影響邊界框的點位於凸包上。
爲了使其效果非常好,請注意,在任何一次觸摸邊界框的凸包周圍只有四個點(這不完全正確,但現在忽略)。如果旋轉點剛好足以使下一個邊與邊界框對齊,那麼其中三個點是相同的,其中一個點將用凸包圍的下一個點替換。這可以讓你創建一個算法,該算法在凸包上的點數是線性的。
現在有兩個邊平行或垂直的特殊情況。這會導致在任何時候都有四個以上的點觸摸邊界框,但實際上並不重要。如果您可以選擇下一個要使用的兩個平行邊線中的哪一個,則可以任意選擇一個邊線。
此方法的唯一問題是它是O(n^2),當凸包中有許多頂點時可能不適合。 – mbeckish
@mbeckish:true - 我已經通過一些優化擴展了我的答案。也許把它看作一個簡單的優化算法會讓它更容易理解。 –
這是不正確的,在任何時候只有四個凸點周圍的接觸邊界框。假設共凸點不出現在凸包中,邊界框最多可觸及8個點。考慮凸包'(2,0),(3,0),(4,1),(4,2),(3,3),(2,3),(1,2),(1, 1)'用一個軸對齊的邊界框(或一個傾斜45度)接觸所有點。 –
- 1. 有人可以向我解釋runQueryOnBackgroundThread嗎?
- 2. 有人可以解釋嗎?
- 3. 有人可以爲我解釋COMTIMEOUTS嗎?
- 4. 有人可以向我解釋反向傳播算法嗎?
- 5. 有人可以向我解釋我收到的錯誤嗎?
- 6. 有人可以向我解釋python-twisted像我五歲嗎?
- 7. 有人可以向我解釋這個彙編代碼嗎?
- 8. 有人可以向我解釋'sigaction'的工作原理嗎?
- 9. 有人可以向我解釋這個JDBC Exception嗎?
- 10. 有人可以向我解釋培訓Tesseract OCR嗎?
- 11. 有人可以向我解釋這行c#代碼嗎?
- 12. 有人可以向我解釋這個功能嗎?
- 13. 有人可以向我解釋此RegEx嗎?
- 14. 有人可以向我解釋這一行的Scala代碼嗎?
- 15. 有人可以向我解釋這一點嗎?
- 16. 有人可以向我解釋ARM按位操作嗎?
- 17. 有人可以向我解釋視框嗎?
- 18. 有人可以向我解釋這個C++數組嗎?
- 19. 有人可以向我解釋這是什麼嗎?
- 20. 有人可以向我解釋這個sed命令嗎?
- 21. 有人可以向我解釋這個autohotkey腳本嗎?
- 22. JAVA:有人可以向我解釋這個遞歸代碼嗎?
- 23. 有人可以向我解釋「for循環」嗎?
- 24. NSFileHandle fileHandleForReadingFromURL有人可以向我解釋這個嗎?
- 25. 有人可以向我解釋這個cmake腳本嗎?
- 26. Javascript - 有人可以向我解釋這到底是什麼嗎?
- 27. 有人可以向我解釋光能傳遞照明嗎?
- 28. 有人可以向我解釋隱含的「循環」嗎?
- 29. 有人可以向我解釋這個SQL查詢嗎?
- 30. 有人可以向我解釋這個javascript語句嗎?
看看[這個解釋](http://cgm.cs.mcgill.ca/~orm/maer.html)。 – mbeckish
你看過[杜桑的原創論文](http://cgm.cs.mcgill.ca/~godfried/publications/calipers.pdf)嗎?第1頁和第2頁非常清楚地解釋了算法(IMO)。請注意,頁碼是相反的... –