3

Java の Area クラス (java.awt.geom.Area) を使用して、さまざまなポリゴンで減算および交差操作を実行したいと考えています。

これらのケースの多くでは、減算操作によってソース エリアが 2 つに分割される場合があります。これらの場合、2 つの Area オブジェクトを返す必要があります。1 つは、減算操作によって作成された結果の連続するセクションのそれぞれです。

Area クラスの JavaDocs を読んだ後、Area の連続した部分を返す方法を見つけられなかったようです。実際、Area がこのような状況をどのように処理するかはわかりません。

Area の減算または交差メソッドによって作成された結果の連続する Area をすべて取得するにはどうすればよいですか?

ありがとう -コーディ

4

1 に答える 1

5

私のコメントで言ったように。アウトライン パスを反復処理し、曲がりくねった部分を取得して、セグメントの開始点を特定します。PathIterator.SEG_MOVETOコンストラクトをヒットするjava.awt.Path2D.Floatと、ヒットするまでポイントが追加されますPathIterator.SEG_CLOSE

これは、あなたがデモンストレーションするために私が行った例です

   public static List<Area> getAreas(Area area) {
    PathIterator iter = area.getPathIterator(null);
    List<Area> areas = new ArrayList<Area>();
    Path2D.Float poly = new Path2D.Float();
    Point2D.Float start = null;
    while(!iter.isDone()) {
      float point[] = new float[2]; //x,y
      int type = iter.currentSegment(point); 
      if(type == PathIterator.SEG_MOVETO) {
           poly.moveTo(point[0], point[1]);
      } else if(type == PathIterator.SEG_CLOSE) {
           areas.add(new Area(poly));
           poly.reset();
      } else {
        poly.lineTo(point[0],point[1]);
      } 
      iter.next();
    }
    return areas;
   }

   public static void main(String[] args) {
    Area a = new Area(new Polygon(new int[]{0,1,2}, new int[]{2,0,2}, 3));
    Area b = new Area(new Polygon(new int[]{0,2,4}, new int[]{0,2,0}, 3));
    b.subtract(a);

    for(Area ar : getAreas(b)) {
     PathIterator it = ar.getPathIterator(null);
     System.out.println("New Area");
     while(!it.isDone()) {
      float vals[] = new float[2];
      int type = it.currentSegment(vals);
      System.out.print(" " + "[" + vals[0] + "," + vals[1] +"]");
      it.next();
     }
     System.out.println();
    }
   }
于 2012-09-14T10:23:32.717 に答える