2015-02-05 96 views
0

我試圖生成從預處理的世界地圖, 是我迄今所做的多邊形是:生成多邊形從圖像中(填充的形狀)

1:生成每個國家的等高線圖,它看起來是這樣的: Countour of each of the world countries

  • 在這裏,我充滿每個國家與隨機顏色這樣的: Filled World map
  • 到目前爲止我試圖只在圖像中選擇一個隨機像素,然後沿着這條線,直到我到達起始點。這確實給了我一個相對較好的結果,多邊形的準確度沒有大約90%,但是有些國家完全消失了。

    Drawing generated polygons

    所以我希望做的是爲每個在這個地圖的國家座標的陣列中的排序方式,因此它可以被表示爲一個多邊形。有誰知道如何做到這一點?

    我還沒有找到適合我的問題的任何算法。

    謝謝!

    +0

    你有沒有考慮過創建一個SVG圖像?您將指定輪廓線,表明它們應該形成一個閉合曲線並填充您選擇的顏色。 – collapsar 2015-02-05 18:00:22

    +0

    我可以悲傷地不在我的應用程序中使用SVG,但SVG能否自動給我所需的結果,還是我必須手動定義這些? – 2015-02-05 18:02:58

    +0

    將自動生成顏色填充(只需將「填充」屬性添加到輪廓折線)。 – collapsar 2015-02-05 18:07:28

    回答

    1

    有矢量化工具在那裏,但如果你想代碼時(這是一項艱鉅的任務)做到這一點:

    1. 黑點

      存儲的所有點在一些掃描圖像的(x,y)list座標

    2. 添加連接信息到所有點

      這將需要大量的內存如果沒有正確編碼,所以添加分組信息點是每個點連接(記住只是索引)。

    3. 添加使用標誌指向

    4. 發現關節之間的折線

      關節是點與更然後2連接點,以便

      1. 找到這樣的點i
      2. 通過它的連接點,直到另一個連接點j被擊中而沒有通過任何點兩次。這就是爲什麼你需要使用標誌。存儲這個路徑polyline
    5. 發現閉環

      它類似於#4,但你需要逐步完成polylines回到起點。記住polylinespolygons

    所以,你需要類似這樣的結構:

    struct pnt 
    { 
    int x,y; // coordinate fo point 
    int used; // usage flag for later use 
    List<int> ix; // list of indexes of all points connected to this point 
    }; 
    
    struct polylin 
    { 
    List<int> ix; // list of point indexes 
    }; 
    
    struct polygon 
    { 
    List<int> lin; // list of polyline indexes 
    List<int> dir; // direction of polyline (forward/backward) 
    }; 
    
    List<pnt> pnts; 
    List<polylin> plins; 
    List<polygon> faces; 
    

    如果你的形象加分有內遂洞,你將需要額外的圖像處理或通過連接點發現來處理它們與一些閾值距離。