posts - 40,  comments - 18,  trackbacks - 0

任意多边形凸剖分对于编程人员来说是经常遇到的问题,当然算法也很多,但是大多很复杂,如果从底层来编写,非常繁琐
下面介绍一种基于AE的方法,理解起来,编写起来都比较简单,供大家参考

算法思想:
1、首先找到该多边形的包罗矩形(IGeometry.Envelope)
2、然后将该多边形的顶点集合(IPointCollection)按照X坐标(或Y坐标)进行从小到大(或从大到小)排序
3、然后过排序后的多边形顶点从小到大(或从大到小)绘制竖直(或水平)的直线
4、绘制的直线与多边形边界就将该多边形分割成为若干个凸多边形。 

附VB.Net源码
''' <summary>
  ''' 得到任意多边形的剖分凸多边形集合
  ''' </summary>
  ''' <param name="pGeo">任意多边形</param>
  ''' <returns>剖分凸多边形集合</returns>
  ''' <remarks></remarks>
  Private Shared Function GetSolidHatchs(ByVal pGeo As IGeometry) As IGeometryCollection
    Dim pPoints As IPointCollection = pGeo
    Dim pXs As New List(Of Double)
    For i As Integer = 0 To pPoints.PointCount - 1
      pXs.Add(pPoints.Point(i).X)
    Next
    '’对该多边形边界的所有点集合以X或Y为标准进行排序,用于画切割线
    pXs.Sort()
    Dim pGeos As IGeometryCollection = New Polygon
    Dim pTopo As ITopologicalOperator = pGeo
    Dim listCount As Integer = pXs.Count

    Dim leftGeo As IGeometryCollection = New Polygon
    Dim rightGeo As IGeometryCollection = New Polygon
    For i As Integer = 0 To listCount - 1
      If pTopo.Boundary.IsEmpty Then Continue For
      If pXs(i) <= pTopo.Boundary.Envelope.XMin Or pXs(i) >= pTopo.Boundary.Envelope.XMax Then Continue For
      Dim cutLine As IPolyline = New Polyline
      Dim fromPoint As IPoint = New Point
      fromPoint.PutCoords(pXs(i), pTopo.Boundary.Envelope.YMax)
      Dim toPoint As IPoint = New Point
      toPoint.PutCoords(pXs(i), pTopo.Boundary.Envelope.YMin)
      ''生成切割线
      cutLine.FromPoint = fromPoint
      cutLine.ToPoint = toPoint
      ''用切割线切割多边形
      Try
        pTopo.Cut(cutLine, leftGeo, rightGeo)
      Catch ex As Exception
        Continue For
      End Try
      ''一条切割线切割出两个多边形,rightGeo是凸的,leftGeo继续用于切割
      pTopo = leftGeo
      For j As Integer = 0 To rightGeo.GeometryCount - 1
        pGeos.AddGeometry(rightGeo.Geometry(j))
      Next
    Next
    If Not rightGeo Is Nothing Then
      For j As Integer = 0 To leftGeo.GeometryCount - 1
        pGeos.AddGeometry(leftGeo.Geometry(j))
      Next
    End If
    If pGeos.GeometryCount = 0 Then
      For j As Integer = 0 To CType(pGeo, IGeometryCollection).GeometryCount - 1
        pGeos.AddGeometry(CType(pGeo, IGeometryCollection).Geometry(j))
      Next
    End If
    Return pGeos
  End Function

Tag标签: GIS
posted on 2008-04-10 18:04 王者之魂 阅读(116) 评论(1)  编辑 收藏

FeedBack:
2008-04-11 11:40 | 3echo      
支持一下.
建议文本不要加底色:)
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-28 14:48 编辑过
 
另存  打印
 

众 万
志 众
成 一
城 心

诚 心
祝 愿
中 震
国 区
人 百
民 姓
幸 安
福 康

QQ:13945133
MSN:yangguanjunmeteor@hotmail.com


<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

与我联系

常用链接

留言簿(1)

我参与的团队

我的标签

随笔档案(40)

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

60天内阅读排行