做企业网站用二级域名好吗,2024年重启核酸,长春seo关键字排名优化,2000元代理微信朋友圈广告应项目需求#xff0c;需要判断一个点所属哪个区域范围内管辖#xff0c;突然想起来三年前做了个外卖的项目里面有个功能#xff0c;判断用户是否在商家自己划的配送范围内#xff0c;又找回来以前的代码来看了下#xff0c;所以在此处记录一下DataNoArgsConstructorAllAr…应项目需求需要判断一个点所属哪个区域范围内管辖突然想起来三年前做了个外卖的项目里面有个功能判断用户是否在商家自己划的配送范围内又找回来以前的代码来看了下所以在此处记录一下DataNoArgsConstructorAllArgsConstructorpublic class Point {private Double lat;private Double lng;}/*** 判断当前位置是否在多边形区域内** param checkPoint 当前经纬度* param areaAround 围栏范围* return*/public static boolean checkIsInPolygon(Point checkPoint, List areaAround) {Point2D.Double point new Point2D.Double(checkPoint.getLat(), checkPoint.getLng());List pointList new ArrayList();for (Point everyPoint : areaAround) {Point2D.Double polygonPoint new Point2D.Double(everyPoint.getLat(), everyPoint.getLng());pointList.add(polygonPoint);}return checkIsPtInPoly(point, pointList);}/*** 判断点是否在多边形内如果点位于多边形的顶点或边上也算做点在多边形内直接返回true** param point 检测点* param pts 多边形的顶点* return 点在多边形内返回true, 否则返回false*/public static boolean checkIsPtInPoly(Point2D.Double point, List pts) {int N pts.size();//如果点位于多边形的顶点或边上也算做点在多边形内直接返回trueboolean boundOrVertex true;//cross points count of xint intersectCount 0;//浮点类型计算时候与0比较时候的容差double precision 2e-10;//neighbour bound verticesPoint2D.Double p1, p2;//当前点Point2D.Double p point;//left vertexp1 pts.get(0);//check all raysfor (int i 1; i N; i) {if (p.equals(p1)) {//p is an vertexreturn boundOrVertex;}//right vertexp2 pts.get(i % N);//ray is outside of our interestsif (p.x Math.min(p1.x, p2.x) || p.x Math.max(p1.x, p2.x)) {p1 p2;//next ray left pointcontinue;}//ray is crossing over by the algorithm (common part of)if (p.x Math.min(p1.x, p2.x) p.x Math.max(p1.x, p2.x)) {//x is before of rayif (p.y Math.max(p1.y, p2.y)) {//overlies on a horizontal rayif (p1.x p2.x p.y Math.min(p1.y, p2.y)) {return boundOrVertex;}//ray is verticalif (p1.y p2.y) {//overlies on a vertical rayif (p1.y p.y) {return boundOrVertex;//before ray} else {intersectCount;}} else {//cross point on the left side//cross point of ydouble xinters (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) p1.y;//overlies on a rayif (Math.abs(p.y - xinters) precision) {return boundOrVertex;}//before rayif (p.y xinters) {intersectCount;}}}} else {//special case when ray is crossing through the vertex//p crossing over p2if (p.x p2.x p.y p2.y) {//next vertexPoint2D.Double p3 pts.get((i 1) % N);//p.x lies between p1.x p3.xif (p.x Math.min(p1.x, p3.x) p.x Math.max(p1.x, p3.x)) {intersectCount;} else {intersectCount 2;}}}//next ray left pointp1 p2;}//偶数在多边形外if (intersectCount % 2 0) {return false;} else {//奇数在多边形内return true;}}还是三年前写的先记录一下抽时间再优化一下代码