文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
1.需求討論
某項目中要求對網格圖層進行配色,並且所有相鄰網格使用不同顏色。因為該網格圖層有上千個要素,如果人工配色必定是一個耗時的過程,而且網格要素的范圍等均有可能發生變化。為解決該問題,我們有必要開發一款滿足配色要求的配圖工具。那么,完成該需求需要多少種顏色來進行配圖呢?理論上,四個顏色即可。下面我們簡單介紹一下數學中一個著名的問題“四色定理”。
2.四色定理
四色問題又稱四色猜想、四色定理,是世界近代三大數學難題之一。地圖四色定理(Four color theorem)最先是由一位叫古德里(Francis Guthrie)的英國大學生提出來的。
四色問題的內容是“任何一張地圖只用四種顏色就能使具有共同邊界的國家着上不同的顏色。”也就是說在不引起混淆的情況下一張地圖只需四種顏色來標記就行。
用數學語言表示即“將平面任意地細分為不相重疊的區域,每一個區域總可以用1234這四個數字之一來標記而不會使相鄰的兩個區域得到相同的數字。”這里所指的相鄰區域是指有一整段邊界是公共的。如果兩個區域只相遇於一點或有限多點就不叫相鄰的。因為用相同的顏色給它們着色不會引起混淆。
3.算法賦色
我們並不是要證明四個顏色就可以滿足需求(我們肯定沒這個能力,否則還寫啥代碼),我們假定這個定理是成立的,進而設計賦色算法。
a.定義賦色值為0、1、2、3,colornums總數為4。
b.獲得圖層要素個數為m,創建大小為m*m的二維數組,遍歷該要素的同時判斷某一要素與哪些要素相鄰,對相鄰要素在數組中做記錄。比如i和j相鄰,則[i][j]和[j][i]均為1,否則為0。
c.假定此時要判斷編號為i的要素賦色。從color=0遍歷到colornums,通過判斷相鄰要素是否已經被賦予顏色,如果沒有則給該color,否則color+1直到合適為止。
以下為代碼為zch同學完成:
4.當存在飛地呢?
以上的四色定理,針對是無飛地的網格,但是現實中,網格是往往存在飛地的。幾塊地,他們雖然不相鄰,但是都屬於一個地區,那么這幾塊地都應該給相同的顏色。
針對這個問題,我們並不能將colornums固定為4個,可以動態對其進行個數延伸以解決該實際問題。
以下是擴展賦色數目后的示例數據截圖:
5.需求進一步擴展
如果需求中,我們還需加上一種動態狀態來定義顏色:目前區域內無關鍵人的則為紅色,其他有關鍵人的顏色按照之前配色進行,而有無關鍵人是一個動態變化的狀態。
我們設計如下:
a.給網格表擴展一個字段以存儲原始配色:color
b.給網格表擴展另一個字段,實時存儲是否有關鍵人存在:has_person,值為0或1
c.代碼獲取color+hasperson的聯合值,如01或11此類組合。並且代碼將其number化,那么01依然為1,11則為11。
d.配圖中,將color值分別定義好顏色,其他非color中的值默認均為紅色。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^