判断点与多边形的关系(在平面上),不能用简单的向量叉乘来判断,特别是在有凹边形的情况下,下面和大家分享一个判断点是否在多边形范围内的简单算法。在进行判断前,建议先进行范围大致判断,在许多情况下,应该说大部分情况下,我们进行判断的对象在空间上相差可能很远,如果一开始就直接用算法去计算,这样会浪费大量的计算时间和空间,所以在使用具体算法前,先进行一个大致范围的判断。先判断它是否有可能在这个区域,如果不可能就直接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;
}
}
分享到:
相关推荐
判断一个坐标点是否在多边形区域范围内。可直接使用。 用来做地图经纬度 判断一个点是否在一个多边形范围内很合适 代码简洁 不到100行代码
java判断百度地图的点是否在多边形区域内,这是完整的demo
先输入多边形的顶点数,左击即可判断点击的点是否在多边形内
在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...
点在多边形的边上 前面我们讲到,射线法的主要思路就是计算射线穿越多边形边界的次数。那么对于点在多边形的边上这种特殊情况,射线出发的这一次,是否应该算作穿越呢?
点是否落在多边形中的判断,采用向上射线算法,在多边形中返回值为1,在边上为0,在多边形外返回-1
范例10-6-1判断某点是否在凸边形的轮廓内 356 范例10-7-1计算轮廓的面积与周长 357 范例10-8-1使用匹配模板找出某物 359 范例10-8-2使用非匹配模板找出某物 363 范例10-8-3 修正使用匹配与非匹配模板找出某物 364 ...
平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充)。...
| 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | ...
当然网上也有很多方法,只不过那些方法非常粗糙,无非就是meshgrid出离散网格,比较两曲面在某位置的坐标是否在某一精度范围内,然后标记显示之。这个方法仅仅当离散网格非常细的时候才比较精确。除此之外,还有个...
3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算、内点外点的判断、凸包等等。计算几何的题目难度不会...
(通过与顶点关联的两条边的另外两个顶点是不是在交点同一侧来判断一个顶点是否为极值点) 顶点为局部极值:交点被连续记录两次 顶点不是局部极值:交点只被记录一次 运行结果 注:本思路与介绍图片均来自CSDN上博主...
百度地图展示附近1公里范围内的目标需求从DB中检索附近一公里内的数据,并在百度地图展示;...(2) 判断点是否在圆中GeoUtils.js提供若干几何算法,用来帮助用户判断点与矩形、圆形、多边形线、多边形面的关系,
0081 判断身份证是否合法的算法 54 0082 判断素数的算法 55 0083 将字符串转换成Unicode格式 56 3.4 排序及分组类算法 56 0084 利用回溯法将一组数平均分成两组 56 0085 利用冒泡法对数字进行排序 58 ...
0081 判断身份证是否合法的算法 54 0082 判断素数的算法 55 0083 将字符串转换成Unicode格式 56 3.4 排序及分组类算法 56 0084 利用回溯法将一组数平均分成两组 56 0085 利用冒泡法对数字进行排序 58 ...
实例095 在数组中添加一个元素 112 实例096 在数组中添加一个数组 113 实例097 不改变长度删除数组中的元素 115 实例098 删除数组元素后改变其长度 116 4.2 常用数组排序算法 117 实例099 使用选择排序法对一维数组...