[幾何]計算不規則多邊形的面積、中心、重心

MapleShao發表於2019-04-25

原文:blog.csdn.net/shao941122/…

最近專案用到:在不規則多邊形的中心點加一個圖示。(e.g: xx地區發生暴雪,暴雪區域是多邊形,給多邊形中心加一個暴雪的圖示)

之前的設計是,計算不規則多邊形範圍矩形bounds的中心點。這個比較簡單,對於一些圓,矩形,凸多邊形都比較適合。但是遇到凹多邊形就會出現問題,比如一個月牙型的不規則多邊形,bounds的中心點,就落到月牙外了。就有點難以接受了。

經過討論,決定將中心改為重心。

下面上程式碼,

計算不規則多邊形的中心:

    /**
     * 獲取不規則多邊形幾何中心點
     *
     * @param mPoints
     * @return
     */
    public static LatLng getCenterPoint(List<LatLng> mPoints) {
        // 1 自己計算
        // 2 使用Google map API提供的方法(推薦)
        LatLngBounds.Builder boundsBuilder = LatLngBounds.builder();
        for (LatLng ll : mPoints)
            boundsBuilder.include(ll);
        return boundsBuilder.build().getCenter();
    }
複製程式碼

計算不規則多邊形的重心:

    /**
     * 獲取不規則多邊形重心點
     *
     * @param mPoints
     * @return
     */
    public static LatLng getCenterOfGravityPoint(List<LatLng> mPoints) {
        double area = 0.0;//多邊形面積
        double Gx = 0.0, Gy = 0.0;// 重心的x、y
        for (int i = 1; i <= mPoints.size(); i++) {
            double iLat = mPoints.get(i % mPoints.size()).latitude;
            double iLng = mPoints.get(i % mPoints.size()).longitude;
            double nextLat = mPoints.get(i - 1).latitude;
            double nextLng = mPoints.get(i - 1).longitude;
            double temp = (iLat * nextLng - iLng * nextLat) / 2.0;
            area += temp;
            Gx += temp * (iLat + nextLat) / 3.0;
            Gy += temp * (iLng + nextLng) / 3.0;
        }
        Gx = Gx / area;
        Gy = Gy / area;
        return new LatLng(Gx, Gy);
    }
複製程式碼

其中LatLng類就是一個包含經緯度點的簡單類。可以自己建立一個包含 x ,y 的類代替。

    public class LatLng {
        public final double latitude;
        public final double longitude;
    }
複製程式碼

Demo地址:github.com/shaoshuai90…

通過這張圖,就可以發現中心和重心的區別

1.png

2.png

專案實際表現:

3.jpeg

4.jpeg

原文:blog.csdn.net/shao941122/…

版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關文章