检查多边形是否包含了某点(经纬度)


/**
 * 检查多边形是否包含了某点~多边形都是由点组成
 * @param px 纬度
 * @param py 经度
 * @param xD 多边形所有纬度
 * @param yD 多边形所有经度
 * @return
 */
public boolean containsPoint(double px, double py,ArrayList<Double> xD,ArrayList<Double> yD) {
    int verticesCount = xD.size();
    int nCross = 0;
    for (int i = 0; i < verticesCount; ++ i) {
        double ix =  xD.get(i);
        double iy =  yD.get(i);
        double i1x =  xD.get((i + 1) % verticesCount);
        double i1y =  yD.get((i + 1) % verticesCount);

        // 求解 y=p.y 与 p1 p2 的交点
        if ( iy == i1y ) {   // p1p2 与 y=p0.y平行
            continue;
        }
        if ( py < Math.min(iy, i1y) ) { // 交点在p1p2延长线上
            continue;
        }
        if ( py >= Math.max(iy, i1y) ) { // 交点在p1p2延长线上
            continue;
        }
        // 求交点的 X 坐标
        float x = (float) ((py - iy) * (i1x - ix)
                / (i1y - iy) + ix);
        if ( x > px ) { // 只统计单边交点
            nCross++;
        }
    }
    // 单边交点为偶数,点在多边形之外
    return (nCross%2==1);
}


你可能感兴趣的:(检查多边形是否包含了某点(经纬度))