`
peizhiinfo
  • 浏览: 1425147 次
文章分类
社区版块
存档分类
最新评论

和大家分享一个判断点是否在多边形范围内的算法

 
阅读更多

判断点与多边形的关系(在平面上),不能用简单的向量叉乘来判断,特别是在有凹边形的情况下,下面和大家分享一个判断点是否在多边形范围内的简单算法。在进行判断前,建议先进行范围大致判断,在许多情况下,应该说大部分情况下,我们进行判断的对象在空间上相差可能很远,如果一开始就直接用算法去计算,这样会浪费大量的计算时间和空间,所以在使用具体算法前,先进行一个大致范围的判断。先判断它是否有可能在这个区域,如果不可能就直接out,如果有可能,再用算法去计算具体是否在范围内。和后面的算法相比,前面的比较过程所消耗的时间可以说是微不足道,但是用这个微不足道的时间却可以极大提高算法的运行效率。废话不多说了,直接上算法!用静态方法写的,可以直接调用,该算法也适合凹边形的情况。

/// <summary>
/// <para>判断点是否在多边形的范围内</para>
/// <para>返回值:值为1表示点在多边形范围内;</para>
/// <para>值为0表示点在多边形边上;</para>
/// <para>值为-1表示点不在多边形范围内。</para>
/// </summary>
/// <param name="point">点坐标,长度为2</param>
/// <param name="polyline">多边形节点坐标,长度为2*n,其中n应大于或等于3,即至少为三角形</param>
/// <returns>
/// <para>返回值:值为1表示点在多边形范围内;</para>
/// <para>值为0表示点在多边形边上;</para>
/// <para>值为-1表示点不在多边形范围内。</para>
/// </returns>
public static int PolygonIsContainPoint(double[] point,double[] polyline)
{
int result = -1, count = 0, pointcount = 0, tempI;
double maxx = 0, minx = 0, maxy = 0, miny = 0;
if (polyline != null)
{
int i;
pointcount = polyline.Length / 2;
maxx = minx = polyline[0];
maxy = miny = polyline[1];
for (i = 0; i < pointcount; i++)
{
tempI = i + i;
if (maxx < polyline[tempI])
maxx = polyline[tempI];
if (minx > polyline[tempI])
minx = polyline[tempI];
if (maxy < polyline[tempI + 1])
maxy = polyline[tempI + 1];
if (miny > polyline[tempI + 1])
miny = polyline[tempI + 1];
}
}
if (point != null)
{

//首先判断是否在面的外框范围内
if (point[0] < minx || point[0] > maxx
|| point[1] < miny || point[1] > maxy)
{
return result;
}
else
{
int i, j;
j = pointcount - 1;
double[] point1, point2;
double tempValue;
for (i = 0; i < pointcount; i++)
{
point1 = new double[2];
point2 = new double[2];
tempI = i + i;
point1[0] = polyline[tempI];
point1[1] = polyline[tempI + 1];
tempI = j + j;
point2[0] = polyline[tempI];
point2[1] = polyline[tempI + 1];
if ((point1[0] < point[0] && point2[0] >= point[0])
|| (point2[0] < point[0] && point1[0] >= point[0]))
{
tempValue=point1[1] + (point[0] - point1[0]) / (point2[0] - point1[0]) * (point2[1] - point1[1]);
if (tempValue < point[1])
{
count++;
}
else if (tempValue == point[1])
{
count = -1;
break;
}
}
j = i;
}
}
}
if (count == -1)
{
result = 0;//点在线段上
}
else
{
tempI = count % 2;
if (tempI == 0)//为偶数
{
result = -1;
}
else
{
result = 1;
}
}
return result;
}
}
分享到:
评论
2 楼 wangguxian 2013-06-16  
它的起点是没有算在里面的,所以第一个点的返回值是-1,其他的都是0
首先,感谢楼主和大家分享,我现在急着用,所以就测试下直接用你的了。
其次,以后有时间我要尝试自己写一下。
1 楼 yx3019 2012-03-20  
怎么用的啊,好像不太对。

int result =  PolygonIsContainPoint(new double[]{106.61502,35.84901}, new double[]{106.61502,35.84901,
                    106.61605,35.85133,
                    106.62112,35.85416,
                    106.62635,35.85305,
                    106.63725,35.85219,
                    106.64867,35.84953,
                    106.65021,35.84627,
                    106.65202,35.84052,
                    106.64472,35.84352,
                    106.63991,35.84781,
                    106.63399,35.84798,
                    106.62807,35.84549,
                    106.62258,35.84704,
                    106.61674,35.84841});
           System.out.println(result);

取的坐标点 和 后面的一样,结果 返回-1

相关推荐

    判断一个坐标点是否在多边形区域范围内

    判断一个坐标点是否在多边形区域范围内。可直接使用。 用来做地图经纬度 判断一个点是否在一个多边形范围内很合适 代码简洁 不到100行代码

    java判断百度地图的点是否在多边形区域内

    java判断百度地图的点是否在多边形区域内,这是完整的demo

    判断点是否在多边形内(C#实例)

    先输入多边形的顶点数,左击即可判断点击的点是否在多边形内

    判断指定的经纬度坐标点是否落在指定的多边形区域内

    在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...

    根据GPS坐标判断距离,射线法判断点在多边形,矩形内。

    点在多边形的边上 前面我们讲到,射线法的主要思路就是计算射线穿越多边形边界的次数。那么对于点在多边形的边上这种特殊情况,射线出发的这一次,是否应该算作穿越呢?

    点在多边形中判断程序(IDL版)

    点是否落在多边形中的判断,采用向上射线算法,在多边形中返回值为1,在边上为0,在多边形外返回-1

    基于opencv3.1库的JAVA源码

    范例10-6-1判断某点是否在凸边形的轮廓内 356 范例10-7-1计算轮廓的面积与周长 357 范例10-8-1使用匹配模板找出某物 359 范例10-8-2使用非匹配模板找出某物 363 范例10-8-3 修正使用匹配与非匹配模板找出某物 364 ...

    Android多边形区域递归种子填充算法的示例代码

    平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充)。...

    常用算法代码

    | 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | ...

    matlab离散点连成的两曲线的交点-intersections.m

    当然网上也有很多方法,只不过那些方法非常粗糙,无非就是meshgrid出离散网格,比较两曲面在某位置的坐标是否在某一精度范围内,然后标记显示之。这个方法仅仅当离散网格非常细的时候才比较精确。除此之外,还有个...

    如何学习ACM,看后受益匪浅

    3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算、内点外点的判断、凸包等等。计算几何的题目难度不会...

    matlab不运行一段代码-scanFill_matlab:scanFill_matlab

    (通过与顶点关联的两条边的另外两个顶点是不是在交点同一侧来判断一个顶点是否为极值点) 顶点为局部极值:交点被连续记录两次 顶点不是局部极值:交点只被记录一次 运行结果 注:本思路与介绍图片均来自CSDN上博主...

    baidumap:百度Map API的一些示例

    百度地图展示附近1公里范围内的目标需求从DB中检索附近一公里内的数据,并在百度地图展示;...(2) 判断点是否在圆中GeoUtils.js提供若干几何算法,用来帮助用户判断点与矩形、圆形、多边形线、多边形面的关系,

    delphi 开发经验技巧宝典源码

    0081 判断身份证是否合法的算法 54 0082 判断素数的算法 55 0083 将字符串转换成Unicode格式 56 3.4 排序及分组类算法 56 0084 利用回溯法将一组数平均分成两组 56 0085 利用冒泡法对数字进行排序 58 ...

    delphi 开发经验技巧宝典源码06

    0081 判断身份证是否合法的算法 54 0082 判断素数的算法 55 0083 将字符串转换成Unicode格式 56 3.4 排序及分组类算法 56 0084 利用回溯法将一组数平均分成两组 56 0085 利用冒泡法对数字进行排序 58 ...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例095 在数组中添加一个元素 112 实例096 在数组中添加一个数组 113 实例097 不改变长度删除数组中的元素 115 实例098 删除数组元素后改变其长度 116 4.2 常用数组排序算法 117 实例099 使用选择排序法对一维数组...

Global site tag (gtag.js) - Google Analytics