文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^