2012-02-28 21 views
19

我有以下列格式映射一個高度圖以基於網格的輪廓格式

06 36 39 42 43 55 ... 
37 40 43 43 45 46 ... 
40 43 44 45 46 48 ... 
44 44 46 47 48 50 ... 
41 44 45 47 48 48 ... 
... 

二維高度圖,我需要它重新映射到基於微笑輪廓格式(因此它可以進一步被映射到子畫面)

. . . . | . . 
. . . . \ . . 
. . .// . . 
. . . | . . . 
. . . | . . . 
./-/. . . 

.這裏意思平坦區域,|-直懸崖,/\懸崖角(每一個代表2種不同的可能性)。

我試過了一個標準的遊行廣場方法,但​​發現只取樣3個鄰居會導致相當多的問題,這是由於過載相鄰的情況。 (注意額外如下地方直懸崖)

. . . . | . \ 
. . . . \ \ . 
. . .// - . 
. . . | - . . 
. . . | . . . 
./-/. . . 

我想什麼,就是一些算法引用/接近於幫助處理這樣的事情。我知道,輪廓以某種深度進行搜索是一種選擇,但尚未嘗試過,並且寧願將其作爲最後的手段。還有一些特徵的表示問題,例如是否包括1個單元厚的懸崖脊或者忽略它們。另一種選擇是穿過生成的輪廓並更改它們以使它們平滑地配合在一起,但是這看起來很真實...

+0

Can你跟3個鄰居解釋一下你的步行廣場方法嗎?我認爲步行廣場非常適合渲染'(height_map - threshold)'的過零點。 – YXD 2012-02-28 12:36:39

+0

行軍方案件相互覆蓋,我已經確定優先事項,以確保單位不覆蓋懸崖,但仍然會給出錯誤。使用閾值是完全正確的,它挑選出正確的案例是問題所在。一半的時間算法可能試圖做正確的事情,而我只是缺乏表示符號來表達它的意義。 – Sash 2012-02-28 12:56:37

+0

什麼是你的2D高度地圖與你的基於微笑的地圖相關的功能? 您是否根據存儲在地圖中的編號分配了一個符號,每個符號也取決於其鄰居? – 2012-02-28 20:21:31

回答

1

創建一個插值/最佳擬合函數。你的模型應該是一個二維多項式(在xy),其程度是「恰到好處」:不是太高,你會過度適應一切,但不能太低,以至於你失去了細節。

您現在可以通過設置f(x,y) = height來設定數學函數。這個方程的解決方案是一個輪廓。你現在有兩個選擇,取決於你是否可以分析解決。

  • 假設你不能分析解決,你仍然可以輕鬆地描繪出曲線的近似:
    • 由着色網格白色,如果f(x,y)>height,黑如果f(x,y)<height開始。請注意所有「過渡」區域,其中有一個大致爲< 1格的黑白過渡區域:這些是輪廓將位於的正方形。
    • 隨機選取一個過渡平方,然後在大致< 1的網格半徑內搜索爲f(x,y)==height,找到輪廓上的一個點。在這一點上(不一定在網格上),我們計算梯度∇f(x,y) = (∂f/∂x, ∂f/∂y)(「上坡向量」)。我們沿任一方向旋轉90度:(∂f/∂y, -∂f/∂x):這種方式指向輪廓。我們非常緩慢地(步長比網格小很多)跟蹤輪廓。這將帶我們一路繞過輪廓。
    • 每次我們在這個跟蹤過程中通過一個網格框時,我們將它標記爲{|, - ,/,},這取決於某個方向,例如漸變的平均方向指向哪個方向。 (如果它們還沒有被標記,我們還必須將鄰居標記爲.;請參見[*]。)
    • 請注意,在此之後可能仍然存在轉換網格框!例如,如果您有兩個山丘,您將填充一個圓,但輪廓是兩個圓。在另一個隨機(無標籤)「過渡」網格框上重複上述過程(這就是爲什麼我們需要[*],否則我們可能會注意到我們已經考慮到的斑點的鄰居)。重複,直到沒有更多未標記的「過渡」網格。
    • 對於每個想要繪製輪廓的height級別,請執行此操作,然後就完成了。
  • 您或許可以像分析圓錐截面一樣解析解決問題,但這可能不太可能,並且超出了此問題的範圍。如果你可以解決曲線問題,你可以使用各種技術對它進行「網格化」(例如參數化,然後沿着輪廓使用步長,也許是半個網格,注意最近的鄰居)

(如果其中一個輪廓與另一個輪廓重疊,輪廓高度之間的間距太小,如果對給定輪廓不滿意,則{ - ,|,/,}組的可能性集合太小。)

+0

我認爲這是一個最佳擬合函數會對他的觀點順序非常敏感。如果它們全都在一條線上(唯一的X座標),那很好,但如果它是關閉輪廓形狀,那將無法工作。 – 2012-05-04 07:08:27

+0

@WouterLievens:我從來沒有建議過最適合的功能;那會很糟糕。在第一段中,我特別建議他/她應該選擇「一個二維多項式,其度數」恰到好處「:不要太高,以至於你會過度使用所有東西,但不能太低,以至於失去細節。 – ninjagecko 2012-05-04 19:58:51

+0

我明白這一點。我只是不明白你如何排序。如果他可以對它們進行分類,那麼他可能會將點連接起來並使其更加平滑。 – 2012-05-04 20:08:24