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

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

 
阅读更多

判断点与多边形的关系(在平面上),不能用简单的向量叉乘来判断,特别是在有凹边形的情况下,下面和大家分享一个判断点是否在多边形范围内的简单算法。在进行判断前,建议先进行范围大致判断,在许多情况下,应该说大部分情况下,我们进行判断的对象在空间上相差可能很远,如果一开始就直接用算法去计算,这样会浪费大量的计算时间和空间,所以在使用具体算法前,先进行一个大致范围的判断。先判断它是否有可能在这个区域,如果不可能就直接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行代码

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

    在计算机图形学中,判断一个点是否位于一个多边形内部是一项常见的任务,尤其在交互式应用和游戏开发中。本文将详细讲解如何使用C#语言实现这个功能,并结合实例进行说明。 首先,我们需要理解基本的几何概念。一个...

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

    3. **点在多边形内的判断算法**:有多种算法可以用来判断一个点是否在多边形内,如Ray Casting(射线法)、Winding Number(风向数法)和Even-Odd Rule(偶奇规则)。其中,射线法是最常用的一种,它的基本思想是从...

    判断点在多边形内算法javascript

    在计算机图形学及相关的领域中,判断一个点是否位于一个多边形内部是一个常见的问题。本篇文章将介绍一种利用计算几何中的弧线法(即内角和法的一种变形)来实现这一功能的方法,并通过JavaScript代码进行具体实现。...

    java判断某个点是否在所画多边形/圆形内

    在计算机图形学和 GIS 领域中,判断某个点是否在所画多边形或圆形内是一个常见的问题。java语言提供了多种方法来解决这个问题。本文将详细介绍java判断某个点是否在所画多边形或圆形内的方法,并提供相应的代码实例...

    Go-polygon-判断点是否在一个多边形区域内支持凸多边形与凹多边形

    在计算机图形学中,判断一个点是否位于一个多边形内部是一项基本任务,这对于游戏开发、地理信息系统、图像处理等领域都非常重要。本知识点将详细介绍如何在Go语言中实现这个功能,支持凸多边形和凹多边形。我们将...

    js计算点是否在多边形范围内

    下面是一个简化的JavaScript函数,用于判断点是否在多边形内: ```javascript function isPointInPolygon(point, polygon) { let inside = false; let numPoints = polygon.length; let j = numPoints - 1; ...

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

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

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

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

    点在多边形的内外判断方法

    点在多边形的内外判断是计算机图形学和计算机辅助设计中非常重要的一个问题,判断一个点是否在一个多边形内部或外部是许多应用程序中的一个关键步骤。今天,我们将讨论两种经典的点在多边形的内外判断算法:叉乘判别...

    验证点是否在多边形内的算法

    在计算机图形学中,判断一个点是否位于一个多边形内部是一项常见的任务,具有广泛的应用,例如在游戏开发、地图绘制和碰撞检测等领域。本篇将详细介绍一种优化过的算法,该算法将浮点运算转化为整数运算,以提高计算...

    判断点在多边形内部 源程序

    在计算机图形学中,判断一个点是否位于多边形内部是一项基本任务,有着广泛的应用,例如在游戏开发、图像处理和碰撞检测等领域。本程序基于VC++编程环境,利用几何算法来实现这一功能。下面我们将深入探讨这个算法的...

    判断点在多边形内部

    在计算机图形学、地理信息系统(GIS)以及许多其他领域中,经常需要确定一个点是否位于一个多边形内部、边界上还是外部。这种问题的解决方法对于路径规划、地图绘制、碰撞检测等应用至关重要。 #### 方法介绍 一种...

    js 判断点是否在一个区域里面

    在JavaScript编程中,经常需要处理与图形相关的逻辑,例如判断一个点是否位于一个多边形内部。这种需求常见于地图应用、游戏开发等场景。本文将详细介绍一种经典的算法——交叉检测法,来解决这一问题。 #### 算法...

    c# 点是否在区域内

    在C#编程中,判断一个点是否位于一个多边形区域内是一项常见的几何运算任务,尤其在地理信息系统(GIS)和地图应用中。这个任务通常应用于确定某个地理位置是否在特定的地理边界内,例如行政区划、建筑物轮廓等。在...

    判断一系列坐标点是否在封闭图形内

    本篇将详细讲解如何利用Matlab来实现这个功能,特别是判断一个点是否在三角形内的算法。 首先,我们需要理解基本的几何概念。一个封闭图形是由多个顶点(坐标点)通过线段连接形成的,如三角形、四边形等。在二维...

    多边形区域填充算法

    算法从一个或多个种子点开始,通过判断相邻像素是否位于多边形内部,进行递归地填充。这种方法可以有效地避免因边界处理不当导致的漏填或溢出问题。 改进的扫描线填充算法在基本扫描线算法上进行了优化,通常包括更...

    .net后台判断某个经纬度是否在经纬度多边形内

    在.NET开发环境中,尤其是使用C#语言进行ASP.NET后端编程时,有时我们需要处理地理空间数据,例如判断一个经纬度点是否位于一个多边形区域内。这个需求常见于地图应用、地理信息系统(GIS)或者物流配送等领域。下面...

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

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

    多边形裁剪算法.rar

    而窗口坐标系统则将屏幕看作一个固定大小的矩形窗口,通过判断多边形顶点是否在窗口内来决定是否保留该多边形。 “zpx多边形裁剪算法3”这个项目可能包含了一种优化的裁剪算法,可能利用了边界框检测、Sutherland-...

Global site tag (gtag.js) - Google Analytics