整体思路:射线法。
①:先判断点的X和Y坐标和多边形的Xmin,Xmax,Ymin,Ymax的关系。若超出了这四个值,则一定在多边形外;
②:若不符合上述条件,则继续。向左做线段,线段的左顶点的X坐标值一定要小于Xmin。然后判断线段和多边形的交点;
若交点为偶数个,则在多边形外;若交点为奇数个,则点在多边形内;
③:因为最后取的交点是按照Ipolyline和多边形Polygon作得拓扑关系的交集,交集是IGeometry对象,其向IgeometryCollection对象跳转,最后得到一个点击IpointCollection,根据PointCount属性可得到相交点的个数。
 
 
得到最小X坐标值的函数:

public double getXMinValue(IPolygon nPolygon)
        {
            IPolygon sPolygon;
            sPolygon = nPolygon;
            IPointCollection pPointCollection;
            pPointCollection = sPolygon as IPointCollection;

int n = pPointCollection.PointCount;
            double[] coordX = new double[n];
          
            for (int i = 0; i < n; i++)
            {
                IPoint point = pPointCollection.get_Point(i);
                coordX[i] = point.X;
            }
            //对数组进行从小到大排序
            System.Array.Sort(coordX);

Xmin = coordX[0];            
            return Xmin;
        }

向左画射线并得到交点个数的代码:

try
                        {
 
                            ILine newLine = new LineClass();

IPoint toPoint = new PointClass();
                            toPoint.PutCoords(getXMinValue(pPolygon) - 20.0000000000000, pPoint.Y);

newLine.PutCoords(pPoint, toPoint);//给新的直线赋予起始坐标

//苗师兄想法
                            IPolyline l = new PolylineClass();
                            l.FromPoint = pPoint;
                            l.ToPoint = toPoint;

IGeometryCollection pPolyline = new PolylineClass();
                            ISegmentCollection pPath;
                            pPath = new PathClass();
                            object missing1 = Type.Missing;
                            object missing2 = Type.Missing;

pPath.AddSegment(newLine as ISegment, ref missing1, ref missing2);
                            pPolyline.AddGeometry(pPath as IGeometry, ref missing1, ref missing2);

IElement element = DrawLineSymbol(pPolyline as IGeometry, pColor);
                            pGraph.AddElement(element, 0);
                            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

ITopologicalOperator pTopo = pPolygon as ITopologicalOperator;//pPolygon多边形
                            IGeometryCollection pGeoCol = pTopo.Intersect((IGeometry)l, esriGeometryDimension.esriGeometry0Dimension) as IGeometryCollection; //执行到这一句有问题;
                            IPointCollection pPointCol = pGeoCol as IPointCollection;
                            if ((pPointCol.PointCount) % 2 == 0)
                            {
                                MessageBox.Show("射线和多边形的交点个数为:"+pPointCol.PointCount.ToString()+",点在多边形外。");
                            }
                            else
                            {
                                MessageBox.Show("射线和多边形的交点个数为:"+pPointCol.PointCount.ToString()+",点在多边形内。");
                            }

}
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }

本文是按照Polygon对象考虑的面,所以并未考虑重叠面的问题。

最新文章

  1. 一篇博客理解Recyclerview的使用
  2. Tomcat web.xml中定义了文件扩展名到MIME类型的对应关系
  3. 工作中一个简单的shell程序
  4. Criterion &amp; DetachedCriteria
  5. DedeCMS V5.7 Dialog目录下配置文件XSS漏洞
  6. BZOJ2051 : A Problem For Fun
  7. WPF绑定方式
  8. mysql 获得当前月1号的日期 和 0点日期方法
  9. suibi 117
  10. Robot Motion
  11. FJ省队集训DAY4 T1
  12. Android中使用JNI获得APK签名的哈希值
  13. win7怎么更换锁屏壁纸
  14. zookeeper原理介绍
  15. Struts2实现文件下载
  16. 为git关联编辑器(比如notepad++) Associating text editors with Git
  17. 枚举进行位运算 枚举组合z
  18. Mondrian辅助组件----Schema WorkBench(架构平台简介)
  19. BZOJ3724 PA2014Final Krolestwo(欧拉回路+构造)
  20. quartz在application中的使用

热门文章

  1. android 通用 Intent
  2. [转]solver优化方法
  3. LeetCode(15):三数之和
  4. java 其它可选方法
  5. .NetCore下使用Polly结合IHttpClientFactory实现聚合服务
  6. maven windows 环境变量
  7. 【PAT】1052 Linked List Sorting (25)(25 分)
  8. 【LOJ】#2508. 「AHOI / HNOI2018」游戏
  9. ORACLE 表空间扩展方法
  10. 1044-Access denied for user &#39;root&#39;@&#39;%&#39; to database &#39;lc_db&#39;