Java - 如何填充自定义形状

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

你的 Arc2D 实例的闭包类型是什么? - trashgod
4个回答

5
每当我创建一个形状时,我总是创建一个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);

我打算试一试。我曾经调用closePath(),但发现它只关闭了最后一个弧线。 - abrightwell
这确实解决了填充问题。但是,得到我想要的形状有点困难,因为那是曲线计算的问题。 - abrightwell
需要大量的工作,但可以得到你想要的结果。谢谢! - Igor Rodriguez

2

1
此外,尝试在使用append时将true作为第二个参数,它会连接这些点。

0

更改GeneralPath的绕线规则

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接