日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 判断范围_java判断一个点是否在一个围栏范围内

發(fā)布時(shí)間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 判断范围_java判断一个点是否在一个围栏范围内 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

應(yīng)項(xiàng)目需求,需要判斷一個(gè)點(diǎn)所屬哪個(gè)區(qū)域范圍內(nèi)管轄,突然想起來三年前做了個(gè)外賣的項(xiàng)目里面有個(gè)功能,判斷用戶是否在商家自己劃的配送范圍內(nèi),又找回來以前的代碼來看了下,所以在此處記錄一下

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Point {

private Double lat;

private Double lng;

}

/**

* 判斷當(dāng)前位置是否在多邊形區(qū)域內(nèi)

*

* @param checkPoint 當(dāng)前經(jīng)緯度

* @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);

}

/**

* 判斷點(diǎn)是否在多邊形內(nèi),如果點(diǎn)位于多邊形的頂點(diǎn)或邊上,也算做點(diǎn)在多邊形內(nèi),直接返回true

*

* @param point 檢測點(diǎn)

* @param pts 多邊形的頂點(diǎn)

* @return 點(diǎn)在多邊形內(nèi)返回true, 否則返回false

*/

public static boolean checkIsPtInPoly(Point2D.Double point, List pts) {

int N = pts.size();

//如果點(diǎn)位于多邊形的頂點(diǎn)或邊上,也算做點(diǎn)在多邊形內(nèi),直接返回true

boolean boundOrVertex = true;

//cross points count of x

int intersectCount = 0;

//浮點(diǎn)類型計(jì)算時(shí)候與0比較時(shí)候的容差

double precision = 2e-10;

//neighbour bound vertices

Point2D.Double p1, p2;

//當(dāng)前點(diǎn)

Point2D.Double p = point;

//left vertex

p1 = pts.get(0);

//check all rays

for (int i = 1; i <= N; ++i) {

if (p.equals(p1)) {

//p is an vertex

return boundOrVertex;

}

//right vertex

p2 = pts.get(i % N);

//ray is outside of our interests

if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {

p1 = p2;

//next ray left point

continue;

}

//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 ray

if (p.y <= Math.max(p1.y, p2.y)) {

//overlies on a horizontal ray

if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {

return boundOrVertex;

}

//ray is vertical

if (p1.y == p2.y) {

//overlies on a vertical ray

if (p1.y == p.y) {

return boundOrVertex;

//before ray

} else {

++intersectCount;

}

} else {

//cross point on the left side

//cross point of y

double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;

//overlies on a ray

if (Math.abs(p.y - xinters) < precision) {

return boundOrVertex;

}

//before ray

if (p.y < xinters) {

++intersectCount;

}

}

}

} else {

//special case when ray is crossing through the vertex

//p crossing over p2

if (p.x == p2.x && p.y <= p2.y) {

//next vertex

Point2D.Double p3 = pts.get((i + 1) % N);

//p.x lies between p1.x & p3.x

if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {

++intersectCount;

} else {

intersectCount += 2;

}

}

}

//next ray left point

p1 = p2;

}

//偶數(shù)在多邊形外

if (intersectCount % 2 == 0) {

return false;

} else {

//奇數(shù)在多邊形內(nèi)

return true;

}

}

還是三年前寫的,先記錄一下,抽時(shí)間再優(yōu)化一下代碼

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java 判断范围_java判断一个点是否在一个围栏范围内的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。