2

私が取り組んでいる小さなプロジェクトの一部として、Polygon クラスを使用していますが、適切に交差するのではなく、「接触」しているポリゴンに問題があります。

たとえば、2 つのポリゴンがある場合:

Polygon a = new Polygon(new int[] {0,0,3,3}, new int[] {0,1,0,1}, 4);
Polygon b = new Polygon(new int[] {1,1,2,2}, new int[] {1,2,1,2}, 4);

contains メソッドを使用して各ポイントを他のポリゴンと照合していましたが、コードは次のとおりです。

System.out.print(a.contains(1,1));
System.out.print(a.contains(2,1));

false を 2 回返します。

これらの「ちょうど触れている」ポリゴンを検​​出する方法はありますか?

4

2 に答える 2

0

共通領域がない場合でも、2 つのポリゴンが交差しているかどうかを確認するソリューションを見つけました。これには math.geom2D ライブラリ ( http://sourceforge.net/apps/mediawiki/geom-java/index.php?title=Main_Page ) を使用しています。Polygons2D クラスを使用すると、クリップ、交差、結合などの操作を比較的簡単に処理できるため、個人的に気に入っています。

このメソッドは、addVertex(Point2D ポイント) を使用してデータから構築できる入力として 2 つの SimplePolygon2D オブジェクトを使用します。

この方法がうまくいかない場合もありますが、それらに取り組む方法が見つかり次第、詳細を投稿します.

public static boolean checkShapeAdjacency(SimplePolygon2D polygon1, SimplePolygon2D polygon2) {
    // Buffer distance. Depends on scale / data
    final float bufferDistance = 0.2f;

    if (polygon1 == polygon2) {
        return false;
    }

    List<Point2D> intersectingPoints = new ArrayList<Point2D>();

    if (polygon1.area() > 0 && polygon2.area() > 0) {

        try {
            // Make a buffer of one polygon
            CirculinearDomain2D bufferDomain = polygon1
                    .buffer(bufferDistance);
            /*               
             * Iterate through the points of the other polygon and see if they
             * are contained within the buffer
             */
            for (Point2D p : polygon2.vertices()) {
                if (bufferDomain.contains(p)) {
                    // Increase the intersecting point count
                    if (!intersectingPoints.contains(p)) {
                        intersectingPoints.add(p);
                    }
                }
            }
        } catch (Exception e) {
            // Try/Catch to avoid degenerated line exceptions (common with math.geom2d)s
            e.printStackTrace();
            return false;
        }
    }

    // Check against the number of intersecting points
    if (intersectingPoints.size() >= 2) {

        /*
         * It is safe enough to assume that with 2 intersecting points,
         * the shape are adjacent. It will not work in the case of bad
         * geometry though. There are other methods of cleaning bad
         * geometry up.
         */
        return true;
    } else if (intersectingPoints.size() == 1) {
        /*
         * It gets tricky in the case of 1 intersecting point as one line may
         * be longer than the other. Check to see if one edge is entirely
         * in the other polygon.
         */
        for (LineSegment2D edge1 : polygon1.edges()) {
            if (polygon2.distance(edge1.firstPoint()) < 0.001 
                    && polygon2.distance(edge1.lastPoint()) < 0.001
                    && edge1.length() > 1) {

                return true;
            }
        }
        for (LineSegment2D edge2 : polygon2.edges()) {
            if (polygon1.distance(edge2.firstPoint()) < 0.001 
                    && polygon1.distance(edge2.lastPoint()) < 0.001
                    && edge2.length() > 1) {

                return true;
            }
        }
        // One common point and no common edge returns false
        return false;
    } else {
        return false;
    }
}

これに関して問題が発生した場合はお知らせください。できる限り対応させていただきます。

ありがとうございました!

于 2014-03-26T11:55:48.690 に答える