赞
踩
目录
现有一个面,里边包含若干空洞,也即内环,需要生成一条连接线,将所有的内环连接,而且保证连接线不存在自相交现象。处理思路:
来自知乎的一个回答:
最后输出的时候注意把下链颠倒一下(连的时候是从A连到B的,输出的时候从B到A输出)就行。正确性显而易见:上链内部是边不交的(因为边的端点的x坐标从小到大排列),下链同理,上下链之间也不交(因为分处直线AB两侧,没法交)。然后就完了!时间复杂度O(NlgN),而且非常好写!示意图如下:
下面是一段C#代码,吸收了上面算法的思想,主要思路为:
注意,代码中的lineSpacing可以根据需要任意指定
- YSortedPointList = SrcPointList.OrderBy(o => o.Y).ToList(); //坐标点按Y值升序排序(Y值从小到大的排序)
-
- //二维平面坐标点排序
- for (int i = 0; i < YSortedPointList.Count - 1; i++)
- {
- //通过Y值之间的差值大小来判断坐标点是否属于同一行
- if (Math.Abs(YSortedPointList[i].Y - YSortedPointList[i + 1].Y) < LineSpacing)
- {
- RowPointList.Add(YSortedPointList[i]);
-
- //如果最后一个点不是单独一行的情况
- if (YSortedPointList.Count - 2 == i)
- {
- RowPointList.Add(YSortedPointList[i + 1]); //将最后一个坐标元素添加进来
- RowPointList = RowPointList.OrderBy(o => o.X).ToList();
- SortedPointList = SortedPointList.Concat(RowPointList).ToList();
- RowPointList.Clear();
- }
- }
- else
- {
- //如果第一个点是单独一行的情况
- if (0 == i)
- {
- SortedPointList.Add(YSortedPointList[i]);
- continue;
- }
-
- RowPointList.Add(YSortedPointList[i]);
- RowPointList = RowPointList.OrderBy(o => o.X).ToList(); //坐标点按X值升序排序
- SortedPointList = SortedPointList.Concat(RowPointList).ToList();
- RowPointList.Clear();
-
- //如果最后一个点是单独一行的情况
- if (YSortedPointList.Count - 2 == i)
- {
- SortedPointList.Add(YSortedPointList[i + 1]);
- }
- }
- }
可以通过已下属性和方法,获取四至范围信息:
属性或方法 | 描述 |
UpperLeft | 左上点坐标 |
UpperRight | 右上角坐标 |
LowerLeft | 左下角坐标 |
LowerRight | 右下角坐标 |
XMin/XMax | X的最小最大值 |
YMin/YMax | Y的最小最大值 |
ZMin/ZMax | Z的最小最大值 |
Project | 投影到指定的坐标系中 |
GeometryType | |
常见GeometryType类型图示:
面心点,即为一个面的中心点,示意图如下:
代码:
- IPoint pt = new PointClass();
- (myGeo as IArea).QueryCentroid(pt);
- IPointCollection ptColl = new PolylineClass();
- //加点
- ptColl.AddPoint(pt);
- //连线
- Polyline line = ptColl as Polyline;
环分内环和外环,对于普通的几个要素,只有一个图形;但是对于multipart要素,可能包含多个图形,图形个数等于外环个数;每个外环内部有多个内环。
IGeometry --> ExteriorRingBag --> InteriorRingBag |
下面是官方帮助提供的用法示例:
- publicstaticvoid PolygonToString(IPolygon4 polygon)
- {
- IGeometryBag exteriorRingGeometryBag = polygon.ExteriorRingBag;
- IGeometryCollection exteriorRingGeometryCollection = exteriorRingGeometryBag as IGeometryCollection ;
- Trace .WriteLine("polygon.ExteriorRingCount = " + exteriorRingGeometryCollection.GeometryCount);
- for (int i = 0; i < exteriorRingGeometryCollection.GeometryCount; i++)
- {
- Trace .WriteLine("polygon.ExteriorRing[" + i +"]" );
- IGeometry exteriorRingGeometry = exteriorRingGeometryCollection.get_Geometry(i);
- IPointCollection exteriorRingPointCollection = exteriorRingGeometryasIPointCollection ;
- for (int j = 0; j < exteriorRingPointCollection.PointCount; j++)
- {
- Trace .WriteLine("Point[" + j +"] = " + PointToString(exteriorRingPointCollection.get_Point(j)));
- }
- IGeometryBag interiorRingGeometryBag = polygon.get_InteriorRingBag(exteriorRingGeometryasIRing );
- IGeometryCollection interiorRingGeometryCollection = interiorRingGeometryBagasIGeometryCollection ;
- Trace .WriteLine("polygon.InteriorRingCount[exteriorRing" + i +"] = " + interiorRingGeometryCollection.GeometryCount);
- for (int k = 0; k < interiorRingGeometryCollection.GeometryCount; k++)
- {
- Trace .WriteLine("polygon.InteriorRing[" + k +"]" );
- IGeometry interiorRingGeometry = interiorRingGeometryCollection.get_Geometry(k);
- IPointCollection interiorRingPointCollection = interiorRingGeometryasIPointCollection ;
- for (int m = 0; m < interiorRingPointCollection.PointCount; m++)
- {
- Trace .WriteLine("Point[" + m +"] = " + PointToString(interiorRingPointCollection.get_Point(m)));
- }
- }
- }
- }
-
- privates tatic string PointToString(IPoint point)
- {
- return (point.X +", " + point.Y +", " + point.Z);
- }
-
欢迎关注个人公众账号,一起学习,聪明的努力!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。