判斷任意一點是否在多邊形範圍內
阿新 • • 發佈:2021-01-17
技術標籤:java
判斷任意一點是否在多邊形範圍內
1.射線法
射線法。該法中常用水平掃描線法或垂直線法來判斷一點是否在區域內。假若有一疑問點P(x,y),要判斯它是否在多邊形內,可從該疑問點向左引水平掃描線(即射線)。
計算此線段與區域邊界的相交次數c。如果c為奇數,認為疑問點在多邊形內;為偶數,則疑問點在多邊形外。
/** *射線法判斷 * @param pointX 要判斷的點的橫座標 * @param pointY 要判斷的點的縱座標 * @param x 指定區域的橫座標組成的陣列 * @param y 指定區域的縱座標組成的陣列 * @return */ private static boolean isInArea(double pointX, double pointY, double[] x, double[] y) { //區域點個數 int num = x.length; boolean result = false; for (int i = 0, j = x- 1; i < x; j = i++) { // 滿足條件,與多邊形相交一次,result布林值取反一次,奇數個則在區域內 if ((y[i] > pointY) != (y[j] > pointY) && (pointX< (x[j] - x[i]) * (pointY - y[i]) / (y[j] - y[i]) + x[i])) { result = !result; } } return result; }
2.Java2D的GeneralPath類
更簡潔的方法利用GeneralPath類裡的lineTo方法繪製任意多邊形,再用contains方法判斷目標點位是否在該圖形內。
/** * 一個點是否在多邊形內 * * @param point 要判斷的點的座標 * @param polygon 組成的範圍點座標集合 * @return */ private static boolean check(Point2D.Double point, List<Point2D.Double> polygon) { java.awt.geom.GeneralPath generalPath = new java.awt.geom.GeneralPath(); Point2D.Double first = polygon.get(0); // 通過移動到指定座標(以雙精度指定),將一個點新增到路徑中 generalPath .moveTo(first.x, first.y); polygon.remove(0); for (Point2D.Double d : polygon) { // 通過繪製一條從當前座標到新指定座標(以雙精度指定)的直線,將一個點新增到路徑中。 generalPath .lineTo(d.x, d.y); } // 將幾何多邊形封閉 generalPath .lineTo(first.x, first.y); generalPath .closePath(); // 測試指定的 Point2D 是否在 Shape 的邊界內。 return peneralPath.contains(point); }
注:該方法輸入的範圍點座標一定按照順/逆時針順序,有序排列,繪製的圖形才會是想要的結果,該方法結果才是準確的。否則程式計算出的圖形與目標圖形不同,結果失真。
更多Java後端學習知識,請關注我的公眾號:Java後端知識分享。回覆:面試題。可獲得Java面試大禮包*1。