当前位置: 首页 > news >正文

地图后台判断一点是否在一个区域内

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

package com.eshangm.yymall.console.util;

import java.awt.geom.Point2D;
import java.util.List;

public class GeoUtils {
	/**
	 * 判断点是否在多边形内
	 * @param point 检测点
	 * @param pts   多边形的顶点
	 * @return      点在多边形内返回true,否则返回false
	 */
	public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts){
	    
	    int N = pts.size();
	    boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
	    int intersectCount = 0;//cross points count of x 
	    double precision = 2e-10; //浮点类型计算时候与0比较时候的容差
	    Point2D.Double p1, p2;//neighbour bound vertices
	    Point2D.Double p = point; //当前点
	    
	    p1 = pts.get(0);//left vertex        
	    for(int i = 1; i <= N; ++i){//check all rays            
	        if(p.equals(p1)){
	            return boundOrVertex;//p is an vertex
	        }
	        
	        p2 = pts.get(i % N);//right vertex            
	        if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests                
	            p1 = p2; 
	            continue;//next ray left point
	        }
	        
	        if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)
	            if(p.y <= Math.max(p1.y, p2.y)){//x is before of ray                    
	                if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray
	                    return boundOrVertex;
	                }
	                
	                if(p1.y == p2.y){//ray is vertical                        
	                    if(p1.y == p.y){//overlies on a vertical ray
	                        return boundOrVertex;
	                    }else{//before ray
	                        ++intersectCount;
	                    } 
	                }else{//cross point on the left side                        
	                    double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y                        
	                    if(Math.abs(p.y - xinters) < precision){//overlies on a ray
	                        return boundOrVertex;
	                    }
	                    
	                    if(p.y < xinters){//before ray
	                        ++intersectCount;
	                    } 
	                }
	            }
	        }else{//special case when ray is crossing through the vertex                
	            if(p.x == p2.x && p.y <= p2.y){//p crossing over p2                    
	                Point2D.Double p3 = pts.get((i+1) % N); //next vertex                    
	                if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
	                    ++intersectCount;
	                }else{
	                    intersectCount += 2;
	                }
	            }
	        }            
	        p1 = p2;//next ray left point
	    }
	    
	    if(intersectCount % 2 == 0){//偶数在多边形外
	        return false;
	    } else { //奇数在多边形内
	        return true;
	    }
	    
	}
}

转载于:https://my.oschina.net/u/3238650/blog/898931

相关文章:

  • 思科路由器DHCP配置(GNS3模拟)
  • 冲刺(8)
  • POJ - 1062 昂贵的聘礼(最短路Dijkstra)
  • openssl生成https证书 (转)
  • vue单文件里name属性是做什么的?
  • JS题目及答案整理
  • docker 构建dockerfile
  • 重构摘要11_处理概括关系
  • 自定义reg52.h头文件(单片机学习重难点核心知识点)
  • leetcode46 Permutation 排列组合
  • Cocos2D-X2.2.3学习笔记8(处理精灵单击、双击和三连击事件)
  • 无法抗拒Minecraft给予超高的自由度和探索-微访谈
  • 移动端播放视频文件
  • 《Spring 5官方文档》翻译邀请
  • 树莓派玩耍笔记1 -- 开箱 amp; 安装系统以及简单配置
  • 30天自制操作系统-2
  • EventListener原理
  • iOS 颜色设置看我就够了
  • Kibana配置logstash,报表一体化
  • MySQL QA
  • Odoo domain写法及运用
  • PHP 7 修改了什么呢 -- 2
  • php中curl和soap方式请求服务超时问题
  • 代理模式
  • 技术发展面试
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端面试之CSS3新特性
  • 使用权重正则化较少模型过拟合
  • 首页查询功能的一次实现过程
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (LeetCode) T14. Longest Common Prefix
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (三)elasticsearch 源码之启动流程分析
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)图像的%2线性拉伸
  • (一)SpringBoot3---尚硅谷总结
  • (转)用.Net的File控件上传文件的解决方案
  • .NET CF命令行调试器MDbg入门(一)
  • .Net 垃圾回收机制原理(二)
  • [100天算法】-x 的平方根(day 61)
  • [Angular] 笔记 6:ngStyle
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [c]统计数字
  • [CF543A]/[CF544C]Writing Code
  • [Codeforces] combinatorics (R1600) Part.2
  • [CQOI 2010]扑克牌
  • [DP 训练] Longest Run on a Snowboard, UVa 10285
  • [Everyday Mathematics]20150130
  • [Flutter]打包IPA
  • [IE编程] IE8 新增的C++开发接口
  • [javaSE] GUI(事件监听机制)
  • [JS]JavaScript 注释 输入输出语句