NavMesh生成研究(四) 凸多邊形生成

2021-09-13 09:07:14 字數 2706 閱讀 4081

源資料類:contourset

構造器類:polymeshfieldbuilder

資料類:polymeshfield

如果你需要回憶這一步的大致過程,請回到總體概述。

這一階段的主要工作如下:

座標轉換和頂點資料合併是相對簡單的過程。因此我們不再贅述。如果你對這些演算法感興趣,可以去查閱有完整文件的源**。我們將重點放在凸多邊形的分割上。對每個輪廓執行如下步驟:

三角化每個輪廓。

將三角形合併成最大可能的凸多邊形。

在生成鄰接連通資訊之後,我們結束這一階段。

三角化的實現過程是:遍歷輪廓的所有邊,對於每組三個頂點,判斷是否能形成乙個有效的內部三角形。對於所有潛在的候選者,選取形成最短新邊的那乙個。新的邊被稱作是「分割邊」,或者簡稱「分割」(partition)。對剩餘頂點繼續這個過程,直至三角化完成。

為了提公升效能,三角化在輪廓的xz平面投影下進行。

分步驟闡述:找到可能的分割方案。

選取最短的分割並形成三角形。除去無效的分割,生成新的可能的分割。

繼續分割:

……直到三角化完成。

兩個演算法被用來判斷一組三個頂點是否可形成有效的內部三角形。第乙個執行速度快,而且能很快剔除那些完全位於多邊形以外的分割。如果分割位於多邊形內部,那麼另乙個更昂貴的演算法被用來確保它不與任何現存的多邊形邊界相交。

內部角演算法

這個演算法有一點難描述。因此這裡舉了一些例子。首先是乙個有效的分割。對於頂點a、b、c而言,ab是一種可能的劃分:

從頂點a出發順著相鄰邊界發出兩條射線。如果分割的終點(頂點b)位於內部角中,那麼這就是乙個可能的有效分割。

第二個例子是同樣的場景、不同的頂點。因為分割的終點(頂點b)位於內部角之外,所以它不可能是有效的分割。

邊相交演算法

這個演算法容易理解多了。它僅僅是遍歷多邊形中所有的邊,並檢查可能的分割是否與它們中的任何乙個相交。如果有,那麼就不是乙個有效分割。

只有兩個演算法都通過,才能認為分割是有效的。

合併只能發生在由同一輪廓生成的多個多邊形之間。不要嘗試去合併兩個相鄰輪廓裡的多邊形。

請注意我已經切換到通用的形式「多邊形」,而非三角形。最初的合併針對的都是三角形,但隨著合併過程的深入,非三角形的多邊形也可能被合併。

這個過程如下:

找到所有能夠被合併的多邊形。

從這個列表中,選取兩個有最長公共邊的多邊形合併。

重複直至再沒有可合併的多邊形。

兩個多邊形想要合併,需要滿足以下所有條件:

檢查共享邊和計算合併邊數量都很容易。判斷合併後的多邊形是否為凸多邊形則更複雜一點。這個判斷過程的關鍵是共享的頂點。在合併後,兩者都需要檢查一下形狀。如果都能形成內部銳角1,那麼合併後的多邊形仍然會是凸多邊形。我們對每個共享的頂點做如下操作:

由共享頂點相鄰前後的兩個頂點構造一條有向的參考線(directed reference line)。

如果共享的頂點位於它的參考線左側,那麼就形成了乙個銳角。

最好看圖說話。第乙個例子展示了乙個有效的合併。

如果共享的頂點被標記為a,那麼參考線則定為從頂點a-1到頂點a+1。頂點a處在參考線的左側嗎?

現在來看第二個共享的頂點。它是在參考線左側嗎?

在這下乙個例子中,合併是無效的,因為合併後其中乙個共享頂點形成的內部角是鈍角2。

如果你對於用來檢查點相對於有向線位置的演算法不熟悉,那麼可參見soft surfer演算法。核心演算法由polymeshfieldbuilder類中的getsignedareax2()函式來實現。

這個階段的最後一步是遍歷整個網格中的所有多邊形,並生成連線資訊。

當演算法被優化後,從巨集觀上來講,只需簡單遍歷所有的多邊形邊,並尋找與其有公共頂點的其他多邊形。

我們最終回到了向量空間,並得到了乙個由凸多邊形構成的網格。

實際是指小於180度的角。 ↩

實際是指大於180度的角。 ↩

劃分凸多邊形

時間限制 800ms 記憶體限制 65535k 提交次數 0 通過次數 0 題型 程式設計題 語言 g gcc vc 問題描述 乙個正凸n邊形,可以用n 3條互不相交的對角線將正n邊形分成n 2個三角形。現在要求讀入n邊形的n n 20 輸出不同劃分方法的總數 要求解的是劃分方法數,而不需要輸出各種...

469 凸多邊形

題目描述 給定乙個按順序連線的多邊形的頂點,判斷該多邊形是否為凸多邊形。凸多邊形的定義 注 頂點個數至少為 3 個且不超過 10,000。座標範圍為 10,000 到 10,000。你可以假定給定的點形成的多邊形均為簡單多邊形 簡單多邊形的定義 換句話說,保證每個頂點處恰好是兩條邊的匯合點,並且這些...

驗證多邊形是否為凸多邊形

驗證多邊形是否為凸多邊形 2108 shape of hdu include define debug 0 int crossmulti int x0,int y0,int x1,int y1,int x2,int y2 int main int n,i int f x,f y 第1個點 int s...