1. 程式人生 > >判斷點是否在多邊形內

判斷點是否在多邊形內

大神 java ++ 是否 log 進入 als 循環 開始

將大神的代碼照搬寫了一個JAVA版本,思路很簡單,將這個點往多邊形內每條邊引射線,最終統計交點個數,如果為奇數個,說明在多邊形內,偶數個說明在多邊形外

射線是無限長的,多邊形是有界的,一個點射出的射線經過多邊形,如果在多邊形內,那麽會經歷:進入-離開-進入-離開-......-最終離開的過程,交點總數為偶數個,同理在多邊形內的話,則會經歷離開多邊形然後循環可能數量的進入和離開,交點總數為奇數

    public static boolean isPointInPolygons(double ALon, double ALat, List<double[]> pointList) {
        
int iSum = 0, size; double dLon1, dLon2, dLat1, dLat2, dLon; if (pointList.size() < 3) return false; size = pointList.size(); for (int i = 0; i < size - 1; i++) { double[] aPoint = pointList.get(i); double[] bPoint = pointList.get(i + 1);
if (i == size - 1) { dLon1 = aPoint[0]; dLat1 = aPoint[1]; dLon2 = pointList.get(0)[0]; dLat2 = pointList.get(0)[1]; } else { dLon1 = aPoint[0]; dLat1 = aPoint[1]; dLon2 = bPoint[0]; dLat2
= bPoint[1]; } // 以下語句判斷A點是否在邊的兩端點的水平平行線之間,在則可能有交點,開始判斷交點是否在左射線上 if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) { if (Math.abs(dLat1 - dLat2) > 0) { // 得到 A點向左射線與邊的交點的x坐標: dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2); // 如果交點在A點左側(說明是做射線與 邊的交點),則射線與邊的全部交點數加一: if (dLon < ALon) iSum++; } } } if (iSum % 2 != 0) { return true; } return false; }

判斷點是否在多邊形內