`
123003473
  • 浏览: 1064836 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

判断点是否在任意多边形内(java)

阅读更多
import java.util.ArrayList;

public class Test {

	public static void main(String[] args) {
		double px = 113.0253;
		double py = 23.98049;
		ArrayList<Double> polygonXA = new ArrayList<Double>();
		ArrayList<Double> polygonYA = new ArrayList<Double>();
		polygonXA.add(113.0253);
		polygonXA.add(113.4121);
		polygonXA.add(113.37109);
		polygonXA.add(113.02148);
		// 113.18359,23.8496

		// 113.0253,23.98049 113.4121,23.9687 113.37109,2.73828

		// 113.02148,23.7539C

		polygonYA.add(23.98049);
		polygonYA.add(23.9687);
		polygonYA.add(23.73828);
		polygonYA.add(23.7539);
		Test test = new Test();
		System.out.println(test.isPointInPolygon(px, py, polygonXA, polygonYA));
	}

	public boolean isPointInPolygon(double px, double py,
			ArrayList<Double> polygonXA, ArrayList<Double> polygonYA) {
		boolean isInside = false;
		double ESP = 1e-9;
		int count = 0;
		double linePoint1x;
		double linePoint1y;
		double linePoint2x = 180;
		double linePoint2y;

		linePoint1x = px;
		linePoint1y = py;
		linePoint2y = py;

		for (int i = 0; i < polygonXA.size() - 1; i++) {
			double cx1 = polygonXA.get(i);
			double cy1 = polygonYA.get(i);
			double cx2 = polygonXA.get(i + 1);
			double cy2 = polygonYA.get(i + 1);
			if (isPointOnLine(px, py, cx1, cy1, cx2, cy2)) {
				return true;
			}
			if (Math.abs(cy2 - cy1) < ESP) {
				continue;
			}

			if (isPointOnLine(cx1, cy1, linePoint1x, linePoint1y, linePoint2x,
					linePoint2y)) {
				if (cy1 > cy2)
					count++;
			} else if (isPointOnLine(cx2, cy2, linePoint1x, linePoint1y,
					linePoint2x, linePoint2y)) {
				if (cy2 > cy1)
					count++;
			} else if (isIntersect(cx1, cy1, cx2, cy2, linePoint1x,
					linePoint1y, linePoint2x, linePoint2y)) {
				count++;
			}
		}
		if (count % 2 == 1) {
			isInside = true;
		}

		return isInside;
	}

	public double Multiply(double px0, double py0, double px1, double py1,
			double px2, double py2) {
		return ((px1 - px0) * (py2 - py0) - (px2 - px0) * (py1 - py0));
	}

	public boolean isPointOnLine(double px0, double py0, double px1,
			double py1, double px2, double py2) {
		boolean flag = false;
		double ESP = 1e-9;
		if ((Math.abs(Multiply(px0, py0, px1, py1, px2, py2)) < ESP)
				&& ((px0 - px1) * (px0 - px2) <= 0)
				&& ((py0 - py1) * (py0 - py2) <= 0)) {
			flag = true;
		}
		return flag;
	}

	public boolean isIntersect(double px1, double py1, double px2, double py2,
			double px3, double py3, double px4, double py4) {
		boolean flag = false;
		double d = (px2 - px1) * (py4 - py3) - (py2 - py1) * (px4 - px3);
		if (d != 0) {
			double r = ((py1 - py3) * (px4 - px3) - (px1 - px3) * (py4 - py3))
					/ d;
			double s = ((py1 - py3) * (px2 - px1) - (px1 - px3) * (py2 - py1))
					/ d;
			if ((r >= 0) && (r <= 1) && (s >= 0) && (s <= 1)) {
				flag = true;
			}
		}
		return flag;
	}
}
分享到:
评论
3 楼 hb214 2014-08-06  
这个算法有问题,我测试了  不在范围内的   也是返回的true,
2 楼 123003473 2012-06-30  
weizaiC 写道
算法有问题呀  明明不在范围内的  也返回true

只支持凸多边形,凹多边形好像是有问题。。。
1 楼 weizaiC 2012-06-25  
算法有问题呀  明明不在范围内的  也返回true

相关推荐

    java 判断点在多边形内

    根据给定的信息,本文将详细解释如何在Java中实现判断一个点是否位于一个多边形内的算法。该算法基于射线交叉法(Ray Casting Algorithm),这是一种常见的几何计算方法,用于确定一个给定点是否属于一个给定的...

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

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

    判断点在多边形 资料

    4. **判断点是否在任意多边形内(java) .pdf 和 .txt**:这些文档提供了Java语言实现的点在多边形内的判断算法,可能包括代码示例和详细的步骤解释,例如通过遍历多边形边并计算角度差来判断。 5. **一种判断点在...

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

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

    判断点是否在多边形内部-非常简单-多种言语通用

    知识点:判断点是否在多边形内部的算法及其在C#、Java、JavaScript中的实现 在计算机图形学、地理信息系统(GIS)以及游戏开发等领域,判断一个点是否位于一个多边形内部是一个常见的需求。该需求涉及到空间数据...

    判断2d点是否在多边形内

    此外,为了提高效率,还可以通过预处理多边形,如构建包围盒(BoundingBox)或使用空间细分技术,先判断点是否在多边形的大致区域内,再进行精确的判断。 在编程实现时,可以使用各种编程语言,如Python、C++、Java...

    一个点是否在多边形中

    本篇将详细介绍如何在Android环境中判断一个点是否在多边形内部,重点讨论“点在三角形内”的算法,因为大多数多边形可以分解为多个三角形。 首先,我们要理解“点在多边形内”的定义。通常,我们采用“射线交叉法...

    多边形点集排序--针对凸多边形,按逆时针方向进行排序

    在二维空间中,一个凸多边形是由一系列点(顶点)连接形成的闭合图形,其中任意两点之间的连线都在多边形内部。如果从多边形外部向内射入的任何直线都会与多边形的边界交于连续的两点或不相交,那么这个多边形就是凸...

    WPF 基础 2D 图形学知识 判断点是否在任意几何内部方法.rar

    在本文档中,我们将深入探讨WPF(Windows Presentation Foundation)中的2D图形学知识,特别是如何判断一个点是否位于任意几何形状内部。WPF是.NET Framework的一个重要组件,它为开发者提供了丰富的用户界面(UI)...

    点与多边形的位置关系

    在计算机图形学、地理信息系统(GIS)以及游戏开发等领域中,判断一个点是否位于一个多边形内部是一项基础而重要的操作。这项技术不仅被用于地图应用中的路径规划、区域选择,还在游戏开发中用于碰撞检测、视线遮挡...

    基于opencv3.1库的JAVA源码

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

    多边形算法

    【多边形算法】是计算机图形学和GIS...总之,多边形算法在GIS和计算机图形学中具有广泛的应用,而判断点是否在多边形内的问题是一个基础且重要的问题,可以通过多种方法实现,选择哪种方法取决于具体的需求和性能要求。

    点与多边形 碰撞 逐点检测

    例如,在游戏中判断玩家角色(通常可简化为一个点)是否触碰到障碍物(多边形表示)等场景。 #### 二、算法原理 点与多边形碰撞检测的核心思想是确定一个点是否位于一个多边形内部或边界上。本文将详细介绍一种...

    凸多边形的最优三角划分(java)

    在二维空间中,凸多边形是由一系列直线段连接的点形成的封闭图形,其中任意两点之间的线段都完全位于多边形内部或边界上。与之相对的是凹多边形,其内部存在一些区域无法通过直线段连接两点。 最优三角划分的目标是...

    在Java中指向3D凸多边形内部

    2. 定义3D多边形类,存储顶点列表,并实现判断点是否在多边形内的方法。该方法中,遍历多边形的所有边,检查测试点与每条边构成的三角形是否面向多边形。如果是,则增加交点计数。 3. 使用向量叉乘判断三角形面向。...

    射线算法+坐标系转换.zip

    这种方法简单且效率较高,适用于判断点是否位于任意多边形内部,包括凸多边形和凹多边形。 在实际生产环境中,这样的功能可能被用于地图应用的各种场景,比如用户位置的判断、兴趣点搜索范围的确定等。通过这个项目...

    Computer Graphics for Java Programmers

    与点在三角形内的测试类似,点在多边形内的测试用于判断一个给定点是否位于由多个顶点构成的多边形内部。这个问题通常采用射线交叉法来解决,即从待测点发射一条射线,统计该射线与多边形边界的交点数量,以此判断点...

    geotools 地理编码工具类

    然后,通过将任意经纬度点转换为Point对象,我们可以通过点在面内的包含关系判断,来确定该点是否在这个区域内。这个过程涉及到空间关系的计算,通常使用几何对象的contains()或intersects()等方法来实现。 为了...

    Java开发技术大全(500个源代码).

    HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...

Global site tag (gtag.js) - Google Analytics