7

我创建了一个自定义形状,本质上它是四个 Arc2D 对象的集合。

当这些弧线被绘制出来时,它们形成了一个可以被认为是四点圆形星形,有点像三叶草。一条弧线结束的地方,另一条弧线开始。它们在中心形成一个正方形。所以想象一下,取一个正方形,在每一边画半个圆圈。

我可以将此形状绘制到 Graphics2D 对象,但是当我填充它时,它只会填充弧线而不是中心正方形。填充这个内部方块是我的问题。

我已经实现了getPathIterator()下面的方法。我也实现了这些contains()方法。但它仍然只会填充弧线。

我试图添加一个Rectangle. 填充形状时,矩形/正方形会被正确填充,但是它也会绘制矩形,这显然应该是预期的,但绝对不是预期的结果。

那么,有人对如何“填充”这样的形状有任何想法吗?

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

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

    return gp.getPathIterator(at);
}
4

4 回答 4

5

每当我创建一个形状时,我总是创建一个 Path2D.Double 对象。然后,我使用 moveTo 到达起始位置,并结合使用 lineTo() 和 curveTo() 来围绕路径移动。然后,当我完成后,我调用 closePath()。它始终正确填写。

我没有任何实现 getPathIterator 的经验,但我注意到您没有执行 closePath()。我不知道这是否需要,但我确实觉得采取我的方法会奏效。

这是一个填充圆角矩形的示例:

双宽度 = 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);
于 2010-07-26T18:43:41.800 回答
2

I don't know much about graphics.But I have seen these examples in sun's site.I'm just posting the link in case you need it. http://java.sun.com/products/java-media/2D/samples/suite/index.html

于 2010-07-27T04:46:03.250 回答
0

Change the winding rule for the GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);
于 2010-07-27T18:31:44.623 回答
0

Also, try using append with true as the second argument, it will connect the points.

于 2019-10-11T07:41:00.277 回答