1

の一部がPolygon画面に表示されているかどうかを知る必要があります。ArrayListの2 つがありますLatLng。1 つは を形成するポイントのリストを含みPolygon、2 つ目は画面の 4 つのコーナーを含みます。

これは私のコードです:

protected boolean doPolygonsHaveAnyCoincidingArea(ArrayList<LatLng> polygon1, final ArrayList<LatLng> polygon2) {
    for (LatLng point : polygon1) {
        if (isPointInsidePolygon(point, polygon2)) {
            return true;
        }
    }
    for (LatLng point : polygon2) {
        if (isPointInsidePolygon(point, polygon1)) {
            return true;
        }
    }
    return false;
}

private boolean isPointInsidePolygon(final LatLng tap, final ArrayList<LatLng> vertices) {      
    int intersectCount = 0;
    for (int j = 0; j < vertices.size() - 1; j++) {
        if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) {
            intersectCount++;
        }
    }
    return (intersectCount % 2) == 1;
}

private boolean rayCastIntersect(final LatLng tap, final LatLng vertA, final LatLng vertB) {
    final double aY = vertA.latitude;
    final double bY = vertB.latitude;
    final double aX = vertA.longitude;
    final double bX = vertB.longitude;
    final double pY = tap.latitude;
    final double pX = tap.longitude;
    if ((aY > pY && bY > pY) || (aY < pY && bY < pY) || (aX < pX && bX < pX)) {
        return false;
    }
    final double m = (aY - bY) / (aX - bX);
    final double bee = (-aX) * m + aY;
    final double x = (pY - bee) / m;
    return x > pX;
} 

doPolygonsHaveAnyCoincidingAreaただし、共有領域が小さな三角形である場合があり、そのうちの 1 つだけisPointInsidePolygonが true を返すことがあるため、可能性よりも遅いと思います。

2 つのポリゴンが衝突するか、1 つにもう 1 つのポリゴンが含まれているかを判断するより速い方法はありますか?

4

1 に答える 1

2

1 つのポリゴンの頂点が 2 番目のポリゴンの内側にあることを確認するだけでは十分ではありません (2 つの等しい正方形があり、1 つが 45 度回転しているとします)。

必ず:

  1. 多角形のいずれかの辺が、軸に沿った長方形 (スクリーン) と交差するかどうかを調べます。ここで金属の答えを試してください。

  2. そうでない場合は、ポリゴンの1つの頂点が長方形の内側にあるかどうかを確認します(非常に簡単なテスト)

  3. そうでない場合は、長方形の1つの頂点がポリゴンの内側にあるかどうかを確認してください(関数を使用してください)

于 2013-05-24T13:56:55.190 に答える