2010-07-26 42 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);