2016-01-19 115 views
1

我想生成多個六邊形存在的扁平島。到目前爲止,我已經能夠用代碼創建六邊形網格,但無法弄清楚如何將它們放置在一組中,從而創建一個隨機形狀的島。 (任何形狀都不是完美的圓形,正方形等)我想我需要一種算法,將六邊形貼磚放置在現有貼磚的多邊旁邊。如果你能幫助我一個算法的想法,那就太好了。生成六角形島

+0

你已經提出了一個非常廣泛的問題(有很多生成六邊形圖案的方法!),沒有一個明確的目標(什麼樣的島形狀是可以接受的?)。你還給出了兩個例外情況(半六邊形和「下降邊緣」),但沒有解釋你認爲他們會如何工作。這意味着這是一個非常廣泛的問題 - 所以答案不可能涵蓋所有內容 - 目前還不清楚您是否在尋求算法,代碼或其他方面的幫助。我建議你自己解決問題,然後問一個更具體的問題。 –

+0

@DanPuzey對不起丹,我沒有意識到這是一個問題的不好。這聽起來並不複雜,儘管如此。我正在尋找的形狀是任何看起來不真實的東西。所以沒有完美的圓形,方形,線形或三角形。爲了保持簡單,我會放下平滑的瓷磚。 (這只是不同的形狀,使島嶼看起來不像一個網格)和脫落的邊緣,這是島嶼邊緣向下的牆壁。任何幫助表示讚賞,它只是一個算法或實際代碼的想法。我會編輯我的問題。謝謝 – user2255273

+0

到目前爲止,您有沒有嘗試解決您的問題?你怎麼生成你的六角網格?到目前爲止,您的問題似乎是要求人們編寫代碼的下一部分,而不能看到第一部分是什麼;這不太可能導致對您有用的答案(或對未來的讀者!)。 –

回答

1

你在找這樣的嗎?

Place 1 hexagon. 
for i in (islandSize-1): 
    Scan all hexagons for open sides. Place open sides in a list named hexBorders 

    Choose a random index in hexBorders, attach a new hexagon there 

該算法應該給你一個相當圓的島嶼,大致集中在原始的十六進制,因爲舊的hexes有更多的機會被選中。

您可以通過選擇較新或較舊的六邊形(例如,您可以在hexBorders中包括六邊形時間,並調整隨機選擇以便更喜歡年輕的六邊形)來調整此形狀。

+0

謝謝盧克,我沒有想過每次放置時都檢查所有開放邊的六邊形。我只考慮檢查新放置的六邊形的開放邊,這將導致太多的線。我要試試這個。再次感謝! – user2255273

0

最近我還在做基於瓦片的地圖的隨機地圖生成器,並且在嘗試添加更多高級特徵(在瓦片空間中)時輸出牆的真實性並不好。我決定創建一個基於圖像的地圖2D/3D,然後將其轉換爲平鋪地圖。還沒與添加所有我想要的功能完成,但結果已經是一個更好的幅度則前:

  1. 地圖生成

    看到我simple random map generator in C++。它基於Diamond & Square算法,通過一些調整來獲得島狀地圖。

  2. 轉化爲瓷磚地圖

    笛卡爾像素簡單地映射到你的六邊形網格佈局。您還可以計算某個區域的平均值,而不是每個單元格/瓦片使用單個像素。

    對於3D瓦片地圖,所以你需要添加額外的濾波看到

0

既然是一個相當開放式的問題,this article by Red Blob Games about hexagonal data structures將是一個很好的開端。作者描述瞭如何使用二維數組來存儲六邊形,以及如何遍歷它們。

一旦你理解了六邊形之間的關係,你可以開始以有趣的方式遍歷它們。

可能產生一個「島」的最簡單的方法是用SIR型模型,也被稱爲流行病模型。這是研究人員通常用來模擬傳染病傳播的模型,但我發現你也可以用它來生成僞自然形狀(像一個島!)。 SIR代表易感染 - 感染 - 恢復。這些是「細胞」的三種狀態,在這種情況下是六邊形。在該算法的任何給定步驟中,受感染的細胞可感染相鄰細胞。想想這樣:在算法開始時,一個六邊形是「感染」(陸地),其餘的不是(水)。在算法的每次迭代中,與感染細胞相鄰的細胞有機會(例如,10分之一)被感染(變成土地)。經過多次迭代後,您會發現受感染的六邊形組的形狀非常隨意,但它們都很感人。 For a grid-bsed example, here's some images I've uploaded to imgur。下面是該算法的僞代碼。

cellsToDo = [originCell] 
for 100 iterations: 
    for each cell in cellsToDo: 
    for each neighbor to the current cell: 
     if randomValueBetween(0, 10) == 1: 
     set the current cell as infected 
     add the current cell to the cellsToDo list 

確實有其他的算法,但我會開始學習六邊形如何相互關聯並可以存儲。