[英]How do I show the bounding box of a mapboxgl object with 4 corner coordinates?
[英]How do I partition an oriented bounding box?
我正在編寫代碼,為2維的(不一定是凸的)多邊形構建一個定向邊界框(obb)樹。
到目前為止,我能夠通過找到它的凸包並在船體上使用旋轉卡尺來找到多邊形的面積最小的obb。
下圖就是一個例子。 帶有紅線和紅點的黃色填充多邊形描繪了原始多邊形。 凸殼顯示為藍色,黑色線條,obb顯示為紫色線條。
現在我想擴展我的代碼來構建一個OBB樹,而不僅僅是一個OBB。 這意味着我必須剪切多邊形,並為多邊形的每一半計算新的OBB。
推薦的方法似乎是通過將OBB切成兩半來切割多邊形。 但是如果我通過其中任一軸的中間切割obb,看起來我必須在多邊形上創建新的頂點(否則如何找到該分區的凸包?)。
這是我們想要為以下項創建OBB樹的凹多邊形的示例:
為了將其拆分為一組新的凹面多邊形,我們可以通過在中間切割邊界框並根據需要添加新的“交叉點”頂點來簡單地剪切當前多邊形:
:
這可以在O(頂點)時間內完成,因為我們可以簡單地遍歷所有邊,並且如果邊穿過紅色分割線,則添加交叉點頂點。
然后可以根據這些交點頂點划分多邊形,以獲得一組新的較小(但仍可能是凹面)的多邊形。 將至少有兩個這樣的多邊形(紅線每邊一個),但可能還有更多。 在下一張圖片中,新的多邊形已經着色以強調:
遞歸地計算這些較小多邊形的定向邊界框給出了期望的結果。 例如,以下是遞歸深度2的框:
希望這很明顯足以幫助那些與我一樣掙扎的人!
如果沒有進一步的背景,我不確定這是你需要的,但是這里......
在上面的評論中,我建議遞歸細分凹多邊形,以便獲得一組凸多邊形。 一種(常見)方法如下:
注意: 這正是BSP樹的構建方式。 除了上面的算法,我們不構建樹節點並在其中存儲多邊形。 也許只有BSP的解決方案也可以解決您的問題(而不是使用OBB)。
對於每條邊,將每個頂點分類為在邊緣的前面或后面。 所有頂點都應位於邊緣之前或之前。 如果不是(邊緣后面至少有一個頂點),則多邊形是凹的。 有關“分類”部分的詳細信息,請參閱我對其他問題的回答,該問題也是如此。
獲得凸子多邊形列表后,就可以像在原始帖子中那樣為它們生成OBB。 你不會有OBB 樹 ......
通過細分,您將添加頂點(問題中的一個問題)。 根據您的應用程序,您可能不需要使用細分的多邊形:如果您要使用BSP樹並且只需要簡單的碰撞,您只需遍歷樹並執行一些點/邊分類而不處理任何多邊形頂點。
無論如何,不確定要進一步推薦什么,因為我不知道您希望您的應用程序做什么,但希望這有一些幫助。
編輯:我剛剛意識到這可能是你想要做的:構建一個BSP樹並為每個節點生成OBB,從根節點到葉節點。 因此根節點OBB將包含整個凹多邊形,而葉節點僅包含凸子多邊形。 我記得原來的Doom引擎做了類似的事情(除了軸對齊的BB)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.