Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-填充自定义形状_Java_Swing_Awt_Graphics2d - Fatal编程技术网

Java-填充自定义形状

Java-填充自定义形状,java,swing,awt,graphics2d,Java,Swing,Awt,Graphics2d,我创建了一个自定义形状,本质上它是四个Arc2D对象的集合 当这些弧被画出来时,它们形成了一个四点圆形的星形,有点像三叶草。一条弧结束时,另一条弧开始。它们在中心形成一个正方形。想象一下,画一个正方形,每边画半圆 我可以将此形状绘制到Graphics2D对象,但当我填充它时,它将只填充圆弧,而不会填充中心正方形。填充这个内部方块是我的问题 我已经实现了下面的getPathIterator()方法。我还实现了contains()方法。但它仍然只会填充弧 我试图添加一个矩形。填充形状时,矩形/正方形

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

当这些弧被画出来时,它们形成了一个四点圆形的星形,有点像三叶草。一条弧结束时,另一条弧开始。它们在中心形成一个正方形。想象一下,画一个正方形,每边画半圆

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

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

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

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

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

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

    return gp.getPathIterator(at);
}

每当我创建一个形状时,我总是创建一个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); 双倍宽度=300; 双倍高度=400; Path2D.Double path=新的Path2D.Double(); path.moveTo(0.0,8.0); 路径曲线图(0.0,0.0,8.0,0.0,8.0,0.0); lineTo(宽度-8.0,0.0); 路径曲线(宽度,0.0,宽度,8.0,宽度,8.0); lineTo(宽度、高度-8.0); 路径曲线(宽度,高度,宽度-8.0,高度,宽度-8.0,高度); path.lineTo(8.0,高度); 路径曲线(0.0,高度,0.0,高度-8.0,0,高度-8.0); closePath(); g2.填充(路径);
我对图形不太了解。但我在sun的网站上看到了这些例子。我只是在发布链接,以备您需要。
更改
通用路径的缠绕规则

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);

另外,尝试使用
append
true
作为第二个参数,它将连接点。

您的
Arc2D
实例的闭包类型是什么?我将试一试。我调用closePath(),但发现它刚刚关闭了最后一个弧。这肯定解决了填充问题。事实证明,要得到我想要的形状有点困难,但这是曲线问题的计算。需要大量的工作,但能给你想要的。谢谢