7

カスタム シェイプを作成しました。基本的には、4 つの Arc2D オブジェクトのコレクションです。

これらの円弧を描くと、クローバーのような 4 点の丸い星の形と見なすことができます。1 つの弧が終わると、もう 1 つの弧が始まります。それらは中央に正方形を形成します。想像してみてください。正方形を取り、四方に半円を描きます。

この形状を 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;
倍の高さ = 400;
Path2D.Double パス = 新しい Path2D.Double();
path.moveTo(0.0, 8.0);
path.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(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

グラフィックについてはよくわかりませんが、sunのサイトでこれらの例を見たことがあります。必要に応じてリンクを投稿しています。 http://java.sun.com/products/java-media/2D/samples/suite/index.html

于 2010-07-27T04:46:03.250 に答える
0

の巻き取り規則を変更しますGeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);
于 2010-07-27T18:31:44.623 に答える