java实现判断给定点是否在指定区域内的判断
直接上代码
/*主要算法,判断给定坐标是否在指定区域内
* 参数:入参经度列,纬度列,经度,纬度;出参true-false
* step1:取4个最值,先判断点与最值的位置关系
* step2:点与边界点位置关系
* step3:核心算法,判断点所引的横向射线与不规则区域交点个数
*/
public static boolean JudgeInOutFirst(double[] LngCollotions,double[] LatCollotions,double Lng,double Lat){
//点在最值区域外
if(Lng<GetMinLng(LngCollotions)||Lng>GetMaxLng(LngCollotions)||Lat<GetMinLat(LatCollotions)||Lat>GetMaxLat(LatCollotions)){
return false;
}else{
int nvert =LngCollotions.length;//点数
int i,j,c=0,k=0;
//该点位与n个点所成n-1条线的判断
for(i=0,j=nvert-1;i<nvert;j=i++){
boolean LngTemp =(LngCollotions[i]==Lng);
Boolean latTemp = (LatCollotions[i]==Lat);
if(LngTemp&&latTemp){
//点在点上
return true;
}else if(((LngCollotions[i]>=Lng) !=(LngCollotions[j]>=Lng))&&
(Lat==(LatCollotions[j]-LatCollotions[i])*(Lng-LngCollotions[i])/(LngCollotions[j]-LngCollotions[i])+LatCollotions[i])) {
//点在边界线上
return true;
}else if(((LngCollotions[i]>=Lng) !=(LngCollotions[j]>=Lng))&&
(Lat!=(LatCollotions[j]-LatCollotions[i])*(Lng-LngCollotions[i])/(LngCollotions[j]-LngCollotions[i])+LatCollotions[i])){
//点不再边界线上
double TempLat = (LatCollotions[j]-LatCollotions[i])*(Lng-LngCollotions[i])/(LngCollotions[j]-LngCollotions[i])+LatCollotions[i];//过点的横向线与边界线的交点
//统计单一方向射线方向数
if(Lat<TempLat){
k++;
}
}
}
//改点位与始点与终点所在线的判断
if(((LngCollotions[0]>=Lng) !=(LngCollotions[LngCollotions.length-1]>=Lng))&&
(Lat==(LatCollotions[LngCollotions.length-1]-LatCollotions[0])*(Lng-LngCollotions[i])/(LngCollotions[LngCollotions.length-1]-LngCollotions[0])+LatCollotions[0])){
return true;
}else if(((LngCollotions[0]>=Lng) !=(LngCollotions[LngCollotions.length-1]>=Lng))&&
(Lat!=(LatCollotions[LngCollotions.length-1]-LatCollotions[0])*(Lng-LngCollotions[i])/(LngCollotions[LngCollotions.length-1]-LngCollotions[0])+LatCollotions[0])){
//点不再边界线上
double TempLat = (LatCollotions[LngCollotions.length-1]-LatCollotions[0])*(Lng-LngCollotions[0])/(LngCollotions[LngCollotions.length-1]-LngCollotions[0])+LatCollotions[0];//过点的横向线与边界线的交点
//统计单一方向射线方向数
if(Lat<TempLat){
c++;
}
}
System.out.println(c+"\t"+k);
if((c+k)%2==0){
return false;
}else{
return true;
}
}
}
//工具相关
public static double[] String2Double(String[] List){
double[] GpsList=new double[List.length];
for(int i=0;i<List.length;i++){
GpsList[i]=Double.parseDouble(List[i]);
}
return GpsList;
}
public static double GetMaxLng(double[] LngCollotions){
double MaxLng=LngCollotions[0];
for(int i=0;i<LngCollotions.length;i++){
if(MaxLng<LngCollotions[i]){
MaxLng=LngCollotions[i];
}
}
return MaxLng;
}
public static double GetMinLng(double[] LngCollotions){
double MinLng=LngCollotions[0];
for(int i=0;i<LngCollotions.length;i++){
if(MinLng>LngCollotions[i]){
MinLng=LngCollotions[i];
}
}
return MinLng;
}
public static double GetMaxLat(double[] LatCollotions){
double MaxLat=LatCollotions[0];
for(int i=0;i<LatCollotions.length;i++){
if(MaxLat<LatCollotions[i]){
MaxLat=LatCollotions[i];
}
}
return MaxLat;
}
public static double GetMinLat(double[] LatCollotions){
double MinLat=LatCollotions[0];
for(int i=0;i<LatCollotions.length;i++){
if(MinLat>LatCollotions[i]){
MinLat=LatCollotions[i];
}
}
return MinLat;
}
java实现判断给定点是否在指定区域内的判断相关推荐
- 判断一点是否在多边形内(附Java实现代码)
引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...
- 射线法判断点是否在多边形内-JAVA
1.定义点 public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepubli ...
- 判断点是否处于多边形内的三种方法(转)
1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...
- 判断点是否在凸多边形内
文章目录 判断点是否在凸多边形内 1,原理 2.右手坐标系 3.向量叉积 补充知识: 可以理解利用向量的叉积,很容易判定一个多边形的凹凸性.也可以判定点是否在多边形的内部. - 判定多边形的凹凸性 判 ...
- 用Java编写2到100之间的素数;判断一个数是不是素数
目录 1.用Java编写2到100之间的素数 2.判断一个数是不是素数 1.用Java编写2到100之间的素数 package day_2023_4_18;public class Main {pub ...
- Java File文件流读取文件夹内的文件并替换文件内容
Java File文件流读取文件夹内的文件并替换文件内容 一.前言 二.代码 三.运行结果 一.前言 批量读取文件夹内的文件,并替换各个文件的内容 二.代码 新建一个普通 Java 项目就可以,创建文 ...
- java 计算 点是否在电子围栏范围内
java计算坐标点是否在电子围栏范围内 ps:注意坐标系转换 /*** 地球半径*/private static double EARTH_RADIUS = 6378138.0;private sta ...
- c语言for循环多条件判断,解决在for循环内判断条件多次执行
最近遇到的这个问题,就是在for循环内if判断的条件会多次执行. 例如,在返回的30数据中,a条目是第7条则会进行30次判断,弹出29次查无数据,也就是要点击29次关闭alert,很是让人不爽. 有了 ...
- 项目5 判断点是否在圆内
项目5 判断点是否在圆内 请编写一个Java应用程序,判断给定的平面点坐标(x1,y1)是否在一个指定半径的圆内.程序先请求输入圆的半径,再请求输入点的x坐标和y坐标,然后给出判断点是否在圆内并打印输 ...
最新文章
- linux 安全 ***检测 杀毒 rootkit
- hdu_5878_I Count Two Three(预处理)
- DevOps自动化工具集合
- php输出多余的空格或者空行
- php解escape,PHP下escape解码函数用法示例
- 最近很喜欢Hello World啊,这次来Groovy的Hello World啦
- AWS ECS简单了解
- python文件路径改了需要重新配置环境吗_python自学环境配置
- sql2005安装过程,(不装C盘)
- vc 可用的正则表达式库
- 百度输入法皮肤工具提示 CSS,百度手机输入法皮肤布局制作工具
- mqtt+ActiveMQ用发布订阅实现点对点推送
- 基于java的志愿信息管理系统_毕业设计 基于JAVA的志愿者管理系统的设计与实现...
- google浏览器Chrome部署HttpWatch
- 新冠时空分析——Global evidence of expressed sentiment alterations during the COVID-19 pandemic
- H5--大概的,没事看看
- Jinja2渲染的两种方式
- csr_matrix矩阵
- 人工神经网络与深度神经网络
- 鼠标API函数(windows)
热门文章
- Android4.0中添加新语言实现方案(以缅甸语为例)
- 在Java中声明一个unsigned int
- Java开发环境:Win10安装最新版eclipse与jdk(超详细)
- 树莓派魔镜MagicMirror —— 8 MagicMirror基本模块设计
- 视频伪原创软件,这样处理或许更加简单
- 2023计算机毕业设计SSM最新选题之javaJava青年志愿者信息管理系统15925
- iris-session梳理
- 树莓派VNC远程桌面使用,包含静态IP设置与窗口大小调整 (附软件链接)
- MS10_002漏洞利用
- java排序 二分法_JAVA二分法排序