2010-07-26 102 views
5

我創建了自定義形狀,實質上它是四個Arc2D對象的集合。Java - 填充自定義形狀

當這些弧形畫出時,它們形成可以被認爲是四點圓形星形的形狀,有點像三葉草。一個弧結束,另一個開始。它們在中心形成一個正方形。所以想象一下,以一個方形並在每邊畫半圈。

我可以將這種形狀繪製成Graphics2D對象,但是當我填充它時,它將只填充圓弧而不是中心正方形。填充這個內部廣場是我的問題。

我已經實施了下面的getPathIterator()方法。我也實施了方法。但它仍然只會填滿弧線。我試着添加一個Rectangle。填充形狀時,矩形/正方形將被正確填充,但它也會繪製矩形,這顯然應該是預期的,但絕對不是所需的結果。

那麼,有沒有人有任何想法如何「填補」這樣的形狀?

public PathIterator getPathIterator(AffineTransform at) { 
    GeneralPath gp = new GeneralPath 

    for (Arc2D arcs : this.arcs) { 
     gp.append(arc, false); 
    } 

    return gp.getPathIterator(at); 
} 
+0

纏繞規則你是什麼'Arc2D'實例的閉合類型? – trashgod 2010-07-26 20:40:49

回答

4

每當我創建一個形狀,我總是創建一個Path2D.Double對象。然後,我使用moveTo到達起始位置,並使用lineTo()和curveTo()的組合移動路徑。然後,當我完成時,我調用closePath()。它一直填寫正確。

我對實現getPathIterator沒有任何經驗,但是我注意到您不會執行closePath()。我不知道這是否是必需的,但我確實想讓我的方法行得通。

這裏是填補了一個圓角矩形的例子:

 
double width = 300; 
double height = 400; 
Path2D.Double path = new Path2D.Double(); 
path.moveTo(0.0, 8.0); 
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0); 
path.lineTo(width - 8.0, 0.0); 
path.curveTo(width, 0.0, width, 8.0, width, 8.0); 
path.lineTo(width, height - 8.0); 
path.curveTo(width, height, width - 8.0, height, width - 8.0, height); 
path.lineTo(8.0, height); 
path.curveTo(0.0, .height, 0.0, height - 8.0, 0, height - 8.0); 
path.closePath(); 
g2.fill(path); 
+0

我會給它一個鏡頭。我打電話給closePath(),但發現它只是關閉了最後一個弧。 – abrightwell 2010-07-27 00:35:57

+0

這絕對解決了填充問題。證明我想要得到完全一樣的形狀有點困難,但那是曲線問題的計算。 – abrightwell 2010-08-10 19:21:50

+0

需要大量的工作,但給你你想要的東西。謝謝! – 2013-05-04 20:35:03

0

更改爲GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);