GIS中的计算几何(二)

GIS中的计算几何(二)
2007-08-17 15:48

4    线和面的关系

线面关系的判断相对比较复杂,线在面内,线和面相交,相离,相接等关系。线段在面内,第一个必要条件是,线段的两个端点都要在内。但由于多边形可能为凹,所以这不能成为判断的充分条件,于是有第二个必要条件线段与多边形的边,没有内部交点。

        线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含于多边形内部,如果在面内,则线段在面内,否则不在面内。

所以,算法思路如下(本算法引用网络上一篇文章):

     if 线段PQ的端点不都在多边形内
        then return false;
    
点集pointSet初始化为空;
      for
多边形的每条边s
        do if
线段的某个端点在s
             then
将该端点加入pointSet;
           else if s
的某个端点在线段PQ
             then
将该端点加入pointSet;
           else if s
和线段PQ相交 // 这时候已经可以肯定是内交了
             then return false;
    
pointSet中的点按照X-Y坐标排序;
      for pointSet
中每两个相邻点 pointSet[i] , pointSet[ i+1]
        do if pointSet[i] , pointSet[ i+1]
的中点不在多边形中
             then return false;
      return true;


注:X-Y坐标排序,X坐标小的排在前面,对于X坐标相同的点,Y坐标小的排在前面,这种排序准则也是为了保证水平和垂直情况的判断正确。

1.       点在面内,线段相交情况的判断见上面的思路。

2.       这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是常数的复杂度,几乎可以忽略不计。因此算法的时间复杂度也是O(n)。

3.       有了线和面的关系,再判断折线与面的关系,也就可以for循环,同理进行判断了,但时间复杂度将是O(n^2)。后面将介绍一种时间复杂度为O(nlogn)的”平面扫描算法”。

5    面和面的关系

面面的空间关系,可能要更复杂一些,在拓扑判断,多边形叠置分析,面对象的编辑中,有着广泛的应用。这个将在以后的章节中介绍一种时间复杂度为Onlogn)的算法“平面扫描算法”。

6    点到线段的距离

        点到线段的距离,在各种测量,拓扑判断 ( 比如,线对象的选取中需要比较距离 ) 中都需要用到。大家对点到直线的距离,都很熟悉,那点到线段距离又该如何计算呢?
        问题的关键是判断 ar 的角度,向量的点积能判断一个角是钝角还是锐角,先复习一下向量的点积,也叫向量的数量积 , 结果是一个数,没有方向。设向量 a=(Xa,Ya,Za)  b=(Xb,Yb,Zb)  

a . b=|a|*|b|*cosα=Xa*Xb+Ya*Yb+Za*Zb 向量点积的几何意义是,高中物理中,求作用力在一个方向上所作的功。如果a . b>0,则α为锐角,a . b<0,α钝角。

熟悉了利用向量的点积来判断角度,AC·AB 判断夹角aBA·BC判断夹角r,即可确定三种情况中,具体是哪一种。至于第一种情况,求点到垂足的距离,可以饶开建立方程求垂足,再求两点距离的思路,因为建立方程运算是复杂的,多耗了CPU资源。利用向量叉积的几何意义来求,向量的叉积表示以两向量为邻边的平行四边形的面积,|AC X AB|为⊿ABC的面积的两倍,求平行四边形的高,只要用面积除以底边AB的长度。即,高CD的长度=|AC X AB|/distance(AB)。

 

这些复杂的几何判断,都将在空间索引的过滤下,在少量数据集(侯选集)上进行。计算几何算法,通常是比较复杂,比较耗CPU资源,而且还要考虑各种退化情况,在这里,并不试图向大家穷举各种情况,只想起一个抛砖引玉的作用, 或许还有人会有这样的疑虑:有没考虑“投影”的问题?关于投影将在相应的章节中给予解释,但有一点是可以肯定的,空间分析、计算几何算法,都是在平面直角坐标系下运算的,不会在球面上。

geochenyj@hotmail.com
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值