0

次のコードを使用して、コード内に座標点が存在するかどうかを確認しています。

mMap.setOnMapClickListener(new OnMapClickListener() 
{
    public void onMapClick(LatLng point) 
    {
        boolean checkPoly = true;
        Point2D[] points = new Point2D[ myPoints.size()];
        for ( int i = 0; i < myPoints.size(); i ++)
        {
            LatLng pt = myPoints.get(i);
            points[i] = new Point2D(pt.latitude, pt.longitude);
        }
        Polygon2D polygon2d = new SimplePolygon2D(points);

        double a = point.latitude;
        double b = point.longitude;
        Point2D myPt = new Point2D(a,b);

        checkPoly = polygon2d.contains(myPt);
        Log.i("CHECK", String.valueOf(checkPoly));
        if (checkPoly)
        {
            setMarker(point);
        }
        else
            Toast.makeText(NewSearch.this,"The Location is outside of the Area", Toast.LENGTH_LONG).show();
    }

ポリゴン ポイントを見つけるために JavaGeom 0.11.1 ライブラリを使用しています。ただし、このコードはまったく問題なく機能していました。myPoints配列は、ArrayList<LatLng>マップ上に描画されたポリゴンのすべての頂点の 1 つであることに注意してください。しかし、何かが起こり、今ではマップの外にある反対側で機能しています。私が変更した場合!checkPoly、それは正常に動作します。

誰が何が悪いのか知っていますか?

4

2 に答える 2

1

ポリゴン境界定義のソースを見ました。「内側」の通常の規則を使用しており、頂点を「内側」のスペースの周りに反時計回りの順序で指定する必要があります。境界は CW 順で指定されている可能性が高く、これにより、ほとんどの人が外側と呼ぶ「内側」が作成されます。

つまり、あなたが多角形だと思っているものは、実は xy 宇宙全体を覆う無限多角形の穴なのです。

したがって、境界頂点の順序を逆にすると、意図したとおりに機能し始めるはずです。

添加

頂点の順序を逆にすることができない場合は、点の順序に依存しない別のポリゴン メンバーシップ テストがあります。ポイント (x,y) のメンバーシップをテストしている場合、このアルゴリズムは、ポイント (無限大、y) がポリゴンの外側にあると想定し、(x,y) が反対側にあるかどうかを判断します。ここでの C での実装は、WR Franklin によるものです。これを Java に移植するのは簡単です。私はそれを数回使用しましたが、優れた結果が得られました。

于 2012-12-27T02:58:05.937 に答える