文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/算法
某项目中要求对网格图层进行配色,而且全部相邻网格使用不一样颜色。由于该网格图层有上千个要素,若是人工配色一定是一个耗时的过程,并且网格要素的范围等均有可能发生变化。为解决该问题,咱们有必要开发一款知足配色要求的配图工具。那么,完成该需求须要多少种颜色来进行配图呢?理论上,四个颜色便可。下面咱们简单介绍一下数学中一个著名的问题“四色定理”。数组
四色问题又称四色猜测、四色定理,是世界近代三大数学难题之一。地图四色定理(Four color theorem)最早是由一位叫古德里(Francis Guthrie)的英国大学生提出来的。微信
四色问题的内容是“任何一张地图只用四种颜色就能使具备共同边界的国家着上不一样的颜色。”也就是说在不引发混淆的状况下一张地图只需四种颜色来标记就行。工具
用数学语言表示即“将平面任意地细分为不相重叠的区域,每个区域总能够用1234这四个数字之一来标记而不会使相邻的两个区域获得相同的数字。”这里所指的相邻区域是指有一整段边界是公共的。若是两个区域只相遇于一点或有限多点就不叫相邻的。由于用相同的颜色给它们着色不会引发混淆。spa
咱们并非要证实四个颜色就能够知足需求(咱们确定没这个能力,不然还写啥代码),咱们假定这个定理是成立的,进而设计赋色算法。设计
a.定义赋色值为0、一、二、3,colornums总数为4。blog
b.得到图层要素个数为m,建立大小为m*m的二维数组,遍历该要素的同时判断某一要素与哪些要素相邻,对相邻要素在数组中作记录。好比i和j相邻,则[i][j]和[j][i]均为1,不然为0。ci
c.假定此时要判断编号为i的要素赋色。从color=0遍历到colornums,经过判断相邻要素是否已经被赋予颜色,若是没有则给该color,不然color+1直到合适为止。开发
如下为代码为zch同窗完成:rem
以上的四色定理,针对是无飞地的网格,可是现实中,网格是每每存在飞地的。几块地,他们虽然不相邻,可是都属于一个地区,那么这几块地都应该给相同的颜色。
针对这个问题,咱们并不能将colornums固定为4个,能够动态对其进行个数延伸以解决该实际问题。
如下是扩展赋色数目后的示例数据截图:
若是需求中,咱们还需加上一种动态状态来定义颜色:目前区域内无关键人的则为红色,其余有关键人的颜色按照以前配色进行,而有无关键人是一个动态变化的状态。
咱们设计以下:
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/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^