多边形范围点判定算法

判断一个二维坐标点是否在一个多边形范围框内,首先给出范围框各顶点的坐标(按顺时针方向给出),分别放到两个数组中再比较大小范围从而判定点是否在多边形返回框中

code如下:

public class RangePoint  {

	double[] x_points;
	double[] y_points;
	public RangePoint(){}
	public RangePoint(double[] x_points,double[] y_points) {
		this.x_points = x_points;
		this.y_points = y_points;
	}

	public boolean RangeMatch(double x, double y) {
		int j = x_points.length - 1;
		boolean odd_nodes = false;
		for (int i = 0; i < x_points.length; i++){
			 if (((y_points[i] < y && y_points[j] >= y)
		                || (y_points[j] < y && y_points[i] >= y))
		                && (x_points[i] <= x || x_points[j] <= x))
		        {
		            odd_nodes ^= (x_points[i]
		                    + (y - y_points[i]) / (y_points[j] - y_points[i])
		                    * (x_points[j] - x_points[i]) < x);
		        }
		        j = i;
		}
        if (odd_nodes==true) {
        	return true;
        }
        return false;
	}

	public static void main(String[] args) {

		double[] x_points = {0, 0, 2, 2 };
		double[] y_points = {0, 1.8, 2, 0 };
		double x = 1.9;
		double y = 1.8;

		RangePoint rp = new RangePoint(x_points,y_points);

	    if (rp.RangeMatch(x, y)) {
	    	System.out.println("This Range include Point:" + x +","+ y);
	    }

	}

}

好吧,这个东西有啥用呢??

看到如下测试代码你可能会觉得有用了,这个是判断某个经纬度坐标是否在给定的范围区域内,下面是故宫顶点的经纬度(可以通过ditu.google.cn点击查看到具体经纬度的值)

	public static void main(String[] args) {

		double[] x_points = {39.922886, 39.923264, 39.913275, 39.912929 };
		double[] y_points = {116.391517, 116.40199, 116.402505, 116.392034 };

	     double x = 39.922804;
	  	double y = 116.391581;

		RangePoint rp = new RangePoint(x_points,y_points);

	    if (rp.RangeMatch(x, y)) {
	    	System.out.println("This Range include Point:" + x +","+ y);
	    }

	}
时间: 2024-12-31 21:38:26

多边形范围点判定算法的相关文章

空间复杂度为O(1)的回文数判定算法

空间复杂度为O(1)的回文数判定算法 一.题设 实现空间复杂度为O(1)的回文数判定,输入为整型常数,要求输出判断是否为回文数. 要求格式如下: public boolean isPalindrome(int x) { //Your judge code } 二.概念 回文数(Palindrome)的定义:设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 特点: 1.负数.

Miller-Rabin素性判定算法

Miller-Rabin素性判定算法是一种基于概率的判定算法,每次判定n是素数的正确性概率至少为75%,出错的概率小于25%. 如果对n进行k次素性检测,如果结果n为素数,那么n为合数的概率为1/(4^k).如果k足够大,那么误判的概率就非常小. 算法原理如下: #include <iostream> #include <random> #include <time.h> using namespace std; typedef unsigned __int64 llo

JVM高级特性与实践(二):对象存活判定算法(引用) 与 回收

关于垃圾回收器GC(Garbage Collection),多数人意味它是Java语言的伴生产物.事实上,GC的历史远比Java悠远,于1960年诞生在MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当Lisp尚在胚胎时期,开发人员就在思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 目前GC早已解决了以上问题,内存的动态分配与内存回收机制已经相当成熟,一切似乎“自动化”起来.而开发人员仍旧需要了解GC和内存分配等底层知识,因为在排查各种内存溢出.内

凸包,多边形面积,线段在多边形内的判定。

zoj3570  Lott's Seal http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4569 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const double eps=1e-8; 7 const int M=10001

第三章 1-对象死亡判定算法

概述 垃圾收集(Garbage Collection,GC),它不是Java语言的伴生产物,它的历史比Java还要久远. 人们主要思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 发展到现在,内存的动态分配与内存回收技术已经相当成熟.那么我们为什么还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出.内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要介入GC的运作过程了. Java的内存回收主要关注堆和方法区.程序计数器.虚拟机栈.本地方法

openCV存储图像的结构和pictureBox存储图像结构的区别

这段时间在做一个基于emgu的行人统计项目,笔者在框定区域时,发现老是出现问题.然后笔者写了一个小程序测试,发现了问题出在图像矩阵扫描这一块 在pictureBox上鼠标的坐标是 而emgu的是从y方向开始扫描的 1 for (int x = 0; x < grayImage1.Width; x++) 2 { 3 for (int y = 0; y < grayImage1.Height; y++) 4 { 5 if (imganalysis.isInArea(x, y, plist)) 6

转:转一个搞ACM需要的掌握的算法. .

要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.  适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,  发挥自己的长处,这才是重要的. 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,  因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打  出来.  1.最短路(Floyd.Dijstra,BellmanFord)  2.最小生成树(先写个prim,kruscal要用并查集,不好写)

算法初学者指南

摘自网络,对于这个训练计划,我只能膜拜,~ 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15 分钟内打完,甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2. 最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同时熟练hash表(

旋转卡壳算法及应用 (参考论文)

多看论文开眼界! 转自:http://blog.csdn.net/acmaker/article/details/3188177 一.目录 一些历史: 1978年, M.I. Shamos's Ph.D. 的论文"Computational Geometry"标志着计算机科学的这一领域的诞生. 当时他发表成果的是一个寻找凸多边形直径的一个非常简单的算法, 即根据多边形的一对点距离的最大值来确定. 后来直径演化为由一对对踵点对来确定. Shamos提出了一个简单的 O(n) 时间的算法来