1

ポリゴンをスキャンライン アルゴリズムで塗りつぶしたいと考えています。このためには、スキャンラインがポリゴンと接触するすべてのポイントを知る必要があります。このためのループを書きましたが、明らかに機能していません (リストにポイントを追加することはありません。これは、ポリゴンをカットするポイントを見つけることができないことを意味します)。ポリゴンを作成し、そこからすべてのエッジを取得できます。

ポリゴンと交差するスキャンラインのポイントを取得するためのコードは次のとおりです。xmin、xmax、ymin、ymax はポリゴンの最大ポイントです。それらも正しいです。contains() は、java.awt.Polygon クラスを使用して、Point がポリゴンの内側にあるかどうかをチェックします。これも機能しています。wasInside にはブール値が含まれており、最後にチェックされたポイントがポリゴンの内側にあるかどうかにかかわらず、古い状態が保存されます。

boolean wasInside = false;
ArrayList<Point> intersectionPoints = new ArrayList<Point>();
    for (int yTemp = ymin; yTemp <= ymax; yTemp++) {
        for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
            if (wasInside != this.contains(new Point(xTemp, yTemp))) {
                intersectionPoints.add(new Point(xTemp, yTemp));
                wasInside = !wasInside;
            }
        }
    }
4

1 に答える 1

1

最小限のフレームでコードを実行しました。それは動作します、それは何も悪いことではありません。

これらの落とし穴を確認することをお勧めします。

  • Polygon.contains()ポイントが内にあるかどうかを文字通りチェックします。たとえば、ポリゴンが点 (10, 10) から始まる長方形の場合、contains(10, 10)false が返されます。のみcontains(11, 11)が true を返します。したがって、実際の交点を見つけるのではなく、内部の最初 (および最後) の点を見つけています。
  • (すみません、自分で偶然見つけました) x と y が混同されていないことを確認してください。
  • 向きを確認してください。キャンバスを使用している場合、(0, 0) が左上のポイントです。しかし、数学の本でデカルト図を見ると、(0, 0) は左下の点です (負の値がない限り)。どこか方向性がズレてませんか?
  • にいくつかのポイントが追加されたかどうかをどのように確認しますintersectionPointsか? これはうまくいくはずです:System.out.println("Nb of intersection points found: " + intersectionPoints.size());

この後、それはあなたのために働くはずです。理解を深めるために、チェックした内容を印刷することをお勧めします。

for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
    System.out.println("Check: " + xTemp + ", " + yTemp);
    if (wasInside != this.contains(new Point(xTemp, yTemp))) {
        System.out.println(" - Inside! Bash!");
        intersectionPoints.add(new Point(xTemp, yTemp));
        wasInside = !wasInside;
    }
}
于 2014-06-28T15:10:49.617 に答える