1. 程式人生 > 其它 >判斷任意一點是否在多邊形範圍內

判斷任意一點是否在多邊形範圍內

技術標籤: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。
在這裡插入圖片描述