GIS算法基础(一) 计算几何基础(上)
最近在学习GIS算法,在学习过程中,想把一些经典的算法或者思想记录下来,分享给大家
计算几何基础本来是计算机图形学的内容,但是GIS在图像处理中是离不开计算机处理的,所以GIS算法基础第一个应该是计算几何基础。
如何把空间实体的点线面以及他们之间的关系(例如,相交,包含,邻接,叠置等等)用计算机语言表达出来,应该是这里解决的第一个问题。前人已经有过这样这样的解决模型---DE-9IM模型(Dimensionally Extended nine-Intersection Model)
DE9IM模型是一种拓扑模型,他用于描述多边形之间的关系。现有两个多边形,如果他们相交,那他们的边界,内部,外部的交集情况是怎么样的?如果相离呢?情况又是怎样的?DE9IM实际上就是一个3X3的矩阵,他存储着两个多边形,边界,内部,外部,的交集情况。
假如交集的结果用维数dim ={-1,0,1,2} 表示,-1代表无交集,0代表交集为一个点,1代表线,2代表面。
上面这个图能很好的说明这个问题。 a,b代表两个面,他们边界,内部,外部,相交的结果就是 红色的部分
例如a的内部和b的内部 交集应该是一个面,所以是2;a的边界和b的边界,交集应该是两个点,所以是0;
总结一下:dim = -1 无交集;
dim = 0 交集中不包含线和面,但至少包含一个点
dim = 1 交集中不包含面,但至少包含一个面
dim = 2 交集至少包含一个面
现在多边形之间的问题的模型解决了,那么如何用计算机语言表达呢?
上面也说了,这个交集的结果可以用一个3x3的矩阵表达。例如上边的a,b交集结果 表达为:
2 1 2
1 0 1
2 1 2
于是,空间关系的描述可以归纳为:两个几何体,以表示两个几何体的DE-9IM结果的矩阵输入,然后把这个矩阵转为字符串,例如上面这个就变为"212101212"了
如果我们说两个多边形相交,那就是他们的结果要有 0,1,2 也就是交集中游点或线或面
在计算机中就是 (0,1,2) ->true
(-1) ->false
(-1,0,1,2)->*
那么上面那个字符串就可以表示成"TTTTTTTTT"
经过前人的整理,空间关系的判断可以通过特定的一些模式进行判断
谓词 | 返回值 | 描述 |
相等(Equals) | T*F**FFF* |
边界上的点和内部的点全部重合。属于相交的一种 |
相离(Disjoint) | FF*FF**** |
不相交,与相交相反 |
相接(Touches) | FT*******\ |
只有边界上有共同点,内部没有。属于相交的一种 |
覆盖(Covers) | T*****FF*\ |
b上的每个点都在a上(边界和内部),且所有点都不在a外部。属于相交的一种 |
叠置(Overlaps) |
|
a和b相交,且具有一部分共同点,但不是全部内部点。属于相交的一种 |
所以,只要我们得到了两个多边形的DE9IM矩阵结果,我们就可以判断他们之间的关系了。
那怎样获得两个多边形的交集结果呢?这关系到点,线,面-点,线,面 之间的判断,这也是GIS算法计算几何中的一大部分的内容,这些我之后在写把