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行代码
判断点是否在多边形内 #include #include #include #define max(a,b) ((a>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编程中,判断一个点是否位于多边形区域内是一个常见的地理空间运算问题。这个问题在地图应用、GIS(地理信息系统)以及游戏开发等领域有广泛的应用。以下是对这个知识点的详细阐述: 1. **坐标系统与投影**:...
总结起来,通过C#实现判断点是否在多边形内的功能,我们可以利用射线交叉数法则,创建一个`Polygon`类,存储顶点信息,并提供一个`IsPointInside`方法用于判断。在实际项目中,这个功能可以广泛应用于各种图形处理和...
java判断某个点是否在所画多边形或圆形内 在计算机图形学和 GIS 领域中,判断某个点是否在所画多边形或圆形内是一个常见的问题。java语言提供了多种方法来解决这个问题。本文将详细介绍java判断某个点是否在所画...
C#判断指定的坐标点(经纬度)是否在指定多边形内坐标组范围内 !地图坐标点判断(经纬度判断)
总之,Go语言提供了强大的工具来处理几何计算问题,如判断点是否在多边形内。通过射线交叉法,我们可以高效地实现这个功能,同时支持凸多边形和凹多边形。在实际应用中,根据具体需求,还可以对算法进行优化和扩展,...
判断GPS经纬度坐标点是否在一个多边形范围内,测试代码如下: $point = array('lng'=>'116.293616', 'lat'=>'39.884003'); $point = array('lng'=>'116.260846', 'lat'=>'39.879574'); $point = array('lng'=>'116....
总结,JavaScript中判断点是否在多边形内的方法主要依赖于射线交叉数算法,它通过检查点与多边形边的交点数量来确定点的位置。为了提高代码质量,我们还需要编写全面的测试用例来验证函数的正确性。
点在多边形的边上 前面我们讲到,射线法的主要思路就是计算射线穿越多边形边界的次数。那么对于点在多边形的边上这种特殊情况,射线出发的这一次,是否应该算作穿越呢?
在矢量多边形区域中,一个坐标点的位置是否在区域内 算法: C#代码,适用于任意多边形(凹凸多边形),但是没有考虑实际误差范围的情况(应用在实际问题解决中,接近区域一定范围是可以忽略的,这个误差范围考虑后算法的...
#### 一、判断点在多边形内的算法 在计算机图形学及相关的领域中,判断一个点是否位于一个多边形内部是一个常见的问题。本篇文章将介绍一种利用计算几何中的弧线法(即内角和法的一种变形)来实现这一功能的方法,...
在计算机图形学、地理信息系统(GIS)以及许多其他领域中,经常需要确定一个点是否位于一个多边形内部、边界上还是外部。这种问题的解决方法对于路径规划、地图绘制、碰撞检测等应用至关重要。 #### 方法介绍 一种...
提供的点是否在圆,内部的方法 提供的点是否在矩形内部的方法 提供的点是否在多边形内部的方法
在计算机图形学中,判断一个点是否位于多边形内部是一项基本任务,有着广泛的应用,例如在游戏开发、图像处理和碰撞检测等领域。本程序基于VC++编程环境,利用几何算法来实现这一功能。下面我们将深入探讨这个算法的...
点是否落在多边形中的判断,采用向上射线算法,在多边形中返回值为1,在边上为0,在多边形外返回-1
点 线 面 多边形 范围内 电子地图上判断新的标注是否在已有的范围内
在.NET开发环境中,尤其是使用C#语言进行ASP.NET后端编程时,有时我们需要处理地理空间数据,例如判断一个经纬度点是否位于一个多边形区域内。这个需求常见于地图应用、地理信息系统(GIS)或者物流配送等领域。下面...
"Android判断一个点在不在多边形区域内" Android判断一个点在不在多边形区域内是Android开发中的一种常见问题。多边形区域内的点判断可以应用于各种场景,如游戏、地图、图形编辑等领域。本文将详细介绍Android...