Java - 填充自定义形状

abr*_*ell 6 java swing awt graphics2d

我创建了一个自定义形状,实际上它是四个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);
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*son 5

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

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

下面是填充圆角矩形的示例:

双倍宽度 = 300;
双倍高度 = 400;
Path2D.Double 路径 = new Path2D.Double();
路径.moveTo(0.0, 8.0);
路径.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0);
path.lineTo(宽度 - 8.0, 0.0);
path.curveTo(宽度, 0.0, 宽度, 8.0, 宽度, 8.0);
path.lineTo(宽度, 高度 - 8.0);
path.curveTo(宽度、高度、宽度 - 8.0、高度、宽度 - 8.0、高度);
path.lineTo(8.0, 高度);
path.curveTo(0.0, .height, 0.0, 高度 - 8.0, 0, 高度 - 8.0);
路径.closePath();
g2.fill(路径);