2012-09-14 37 views
3

我想使用Java的Area類(java.awt.geom.Area)對各種多邊形執行減法和交集操作。java.awt.geom.Area在減法後返回多個部分?

在許多情況下,減法操作可能會將源區域拆分爲兩部分。在這些情況下,我需要返回兩個Area對象,其中一個用於減法操作創建的每個連續節。

在閱讀Area類的JavaDocs之後,我似乎找不到任何方法來返回Area的一個連續部分。事實上,我甚至不確定Area是如何處理這種情況的。

我將如何獲得由Area的減法或交集方法創建的所有連續區域?

感謝, -Cody

+0

什麼我談論走的是兩條禁區對象,在其上運行減法(比如減法B),結果是一個面積被分割中心。從我所瞭解的結果作爲單個Area對象返回。那我怎麼蒸餾它的零件? –

+0

我的回答以任何方式幫助過你嗎? – nullpotent

+0

非常感謝你! –

回答

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(); 
    } 
    }