整体思路:射线法。
①:先判断点的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对象考虑的面,所以并未考虑重叠面的问题。

C#+AE 判断点是否在面内的方法的更多相关文章

  1. EntityFramework 和 linq 判断是否在指定时间段内的方法

    EntityFramework: System.Data.Objects.EntityFunctions.DiffDays(DateTime.Now, inputTime)判断当前时间与指定时间相差多 ...

  2. shell判断参数值是否在数组内的方法

    比如定义数组: arr=("one" "tow" "thr" "three" "four") 1. ...

  3. 百度地图 判断marker是否在多边形内

    昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js      <script type="text/javascript&quo ...

  4. 【Unity3D自学记录】判断物体是否在镜头内

    判断物体是否在镜头内. 其实很简单的方法 代码如下: using UnityEngine; using System.Collections; public class DJH_IsRendering ...

  5. hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)

    凸多边形 Time Limit: 2000 MS    Memory Limit: 65536 K Total Submit: 130(24 users)   Total Accepted: 40(1 ...

  6. C# 判断点是否在多边形内

    /// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</par ...

  7. js jquery 判断元素是否在数组内

    js jquery 判断元素是否在数组内 一,js方法 var arr = ["a", "b", "c"]; // js arr.index ...

  8. js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内

    /** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...

  9. JS判断元素是否在数组内

    //判断元素是否在数组内 function contains(arr, obj) { var i = arr.length; while (i--) { if (arr[i] === obj) { r ...

随机推荐

  1. AC自动机算法学习

    KMP+TRIE int val[1000100][31],tot; int tr[1000100]; int fail[1000100]; struct AC_Trie{ void clean(){ ...

  2. JS文件上传神器bootstrap fileinput详解

    Bootstrap FileInput插件功能如此强大,完全没有理由不去使用,但是国内很少能找到本插件完整的使用方法,于是本人去其官网翻译了一下英文说明文档放在这里供英文不好的同学勉强查阅.另外附上一 ...

  3. CSS3中border-image属性详解

    border-images可以说也是CSS3中的重量级属性,如同圆角.边框颜色属性border-color.块阴影属性一样,也是属于边框属性中的一员. 从其字面意思上看,我们可以理解为“边框-图片”, ...

  4. Codeforces Round #440 (Div. 1, based on Technocup 2018 Elimination Round 2) C - Points, Lines and Ready-made Titles

    C - Points, Lines and Ready-made Titles 把行列看成是图上的点, 一个点(x, y)就相当于x行 向 y列建立一条边, 我们能得出如果一个联通块是一棵树方案数是2 ...

  5. MaximumClique HDU1530

    最大团问题入门题 最基础的方法是dfs 参考: 首先,我们先得到后几个点组成的最大团到底是多大,(最开始的时候肯定是最后一个点单独构成一个最大团,点数为1)然后我们再 DFS: 初始化: 从一个点 u ...

  6. P1203 [USACO1.1]坏掉的项链Broken Necklace

    P1203 [USACO1.1]坏掉的项链Broken Necklace不错的断环为链的模拟题,开成三倍,有很多细节要考虑,比如总长度要<=n,开头第一个是w等等. #include<bi ...

  7. 初探Runloop(一)

    iOS 的最大特点就是运行时. 保证运行时的就是RunLoop 1.什么是RunLoop呢? 从字面理解就是:运行循环 引用下官方文档的介绍: A run loop is an event proce ...

  8. C# Activex调用USB摄像头--附带源码

    前言 最近在整理一些自己写过的东西,也算是重新熟悉一下并且优化一下吧. 需求:获取本地USB摄像头视频显示,并且获取图片数据给底层做人脸识别. 记得当时直接采用H5已经做好了,调试好了....结果放上 ...

  9. leetcode 两数之和 python

      两数之和     给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...

  10. Bzoj5251 线段树+贪心

    Bzoj5251 线段树+贪心 记录本蒟蒻省选后的第一篇题解!国际惯例的题面:首先这个东西显然是一棵树.如果我们把数值排序,并建立这棵树的dfs序,显然dfs序上的一个区间对应数值的一个区间,且根为数 ...