`

判断点是否在多边形的范围内

阅读更多
public class GeometryUtils {
	public final static double  EPSILON=0.00001;
	
	
	public static double getEpsilon(double maxx, double maxy,double minx, double miny, double epsilon){
		if((maxy-miny+maxx-minx)==0)return epsilon;
		return Math.abs(epsilon/(maxy-miny+maxx-minx));
	}

	// / <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];
			}
		}
		
		double epsilon = getEpsilon(maxx, maxy, minx, miny, EPSILON);
		
		if (point != null) {

			// 首先判断是否在面的外框范围内
			if (point[0] < minx || point[0] > maxx || point[1] < miny
					|| point[1] > maxy) {
				System.out.println("直接out");
				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 ((lt(point1[0] , point[0],epsilon) &&
							(eq(point2[0],point[0],epsilon) || gt(point2[0] , point[0],epsilon) ) )
							|| (lt(point2[0] , point[0],epsilon) &&
									(eq(point1[0],point[0],epsilon)) || gt(point1[0], point[0],epsilon)  )) {
						tempValue = point1[1] + (point[0] - point1[0])
								/ (point2[0] - point1[0])
								* (point2[1] - point1[1]);
						if (tempValue < point[1]) {
							count++;
						} else if (eq(tempValue ,point[1],epsilon)) {
							count = -1;
							break;
						}
					}
					j = i;
				}
			}
		}
		if (count == -1) {
			result = 0;// 点在线段上
		} else {
			tempI = count % 2;
			if (tempI == 0)// 为偶数
			{
				result = -1;
			} else {
				result = 1;
			}
		}
		return result;
	}
	
	public static boolean eq(double a,double b, double epsilon){		
		return Math.abs(a-b)<epsilon;
	}
	
	public static boolean gt(double a,double b, double epsilon){		
		return a-b>=epsilon;
	}
	public static boolean lt(double a,double b, double epsilon){		
		return b-a>=epsilon;
	}
	
	public static void main(String[] args){
		int result =  polygonIsContainPoint(new double[]{106.63,35.85}, 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);
       
       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);
       
   	  result =  polygonIsContainPoint(new double[]{10,10}, 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);

	}

}




原文链接:http://peizhiinfo.iteye.com/blog/1237481
分享到:
评论

相关推荐

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

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

    C++判断点是否在多边形内

    判断点是否在多边形内 #include #include #include #define max(a,b) ((a&gt;b)?a:b) #define min(a,b) ((a)?a:b) using namespace std; const double INFINITY = 1e10; const double ESP = 1e-5; const int MAX_N ...

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

    在Java编程中,判断一个点是否位于多边形区域内是一个常见的地理空间运算问题。这个问题在地图应用、GIS(地理信息系统)以及游戏开发等领域有广泛的应用。以下是对这个知识点的详细阐述: 1. **坐标系统与投影**:...

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

    总结起来,通过C#实现判断点是否在多边形内的功能,我们可以利用射线交叉数法则,创建一个`Polygon`类,存储顶点信息,并提供一个`IsPointInside`方法用于判断。在实际项目中,这个功能可以广泛应用于各种图形处理和...

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

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

    C#判断地图坐标点是否在多边形内坐标组范围内

    C#判断指定的坐标点(经纬度)是否在指定多边形内坐标组范围内 !地图坐标点判断(经纬度判断)

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

    总之,Go语言提供了强大的工具来处理几何计算问题,如判断点是否在多边形内。通过射线交叉法,我们可以高效地实现这个功能,同时支持凸多边形和凹多边形。在实际应用中,根据具体需求,还可以对算法进行优化和扩展,...

    判断一个点是否在一个多边形范围内

    判断GPS经纬度坐标点是否在一个多边形范围内,测试代码如下: $point = array('lng'=&gt;'116.293616', 'lat'=&gt;'39.884003'); $point = array('lng'=&gt;'116.260846', 'lat'=&gt;'39.879574'); $point = array('lng'=&gt;'116....

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

    总结,JavaScript中判断点是否在多边形内的方法主要依赖于射线交叉数算法,它通过检查点与多边形边的交点数量来确定点的位置。为了提高代码质量,我们还需要编写全面的测试用例来验证函数的正确性。

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

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

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

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

    判断点在多边形内算法javascript

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

    判断点在多边形内部

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

    提供的点是否在圆,矩形,多边形内部的方法.txt

    提供的点是否在圆,内部的方法 提供的点是否在矩形内部的方法 提供的点是否在多边形内部的方法

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

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

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

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

    电子地图判断点线面是否在范围内

    点 线 面 多边形 范围内 电子地图上判断新的标注是否在已有的范围内

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

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

    Android如何判断一个点在不在多边形区域内

    "Android判断一个点在不在多边形区域内" Android判断一个点在不在多边形区域内是Android开发中的一种常见问题。多边形区域内的点判断可以应用于各种场景,如游戏、地图、图形编辑等领域。本文将详细介绍Android...

Global site tag (gtag.js) - Google Analytics