0

Graphics オブジェクトの 'setClip()' メソッドを使用して、線っぽい形状を使用してクリップする方法はありますか? 現在、ポリゴン形状を使用しようとしていますが、線の「幅」をシミュレートするのに問題があります。私は基本的に線を描き、最後に達したら描き直しますが、今回はy座標から線幅を引きます:

Polygon poly = new Polygon();

for(int i = 0; i < points.length; i++)
  poly.addPoint(points.[i].x, points.[i].y);

// Retrace line to add 'width'
for(int i = points.length - 1; i >=0; i--)
  poly.addPoint(points[i].x, points[i].y - lineHeight);

ほとんど機能しますが、線の幅は傾きによって異なります。

BrushStroke メソッドと drawLine() メソッドは使用できません。これは、線が任意の基準線を通過すると色が変わる可能性があるためです。私が見落としていた Shape の実装、またはこれをより簡単に行えるようにする簡単な実装はありますか?

4

3 に答える 3

1

わかりました、setClip() メソッドを使用せずにかなり良い解決策を思いつくことができました。背景を中間 Graphics2D オブジェクトに描画し、 setComposite() を使用してピクセルをマスクする方法を指定し、次に drawLine() を使用して線を上に描画します。この線を取得したら、drawImage を介して元の Graphics オブジェクトの上に描画します。次に例を示します。

BufferedImage mask = g2d.getDeviceConfiguration().createCompatibleImage(width, height, BufferedImage.TRANSLUCENT);
Graphics2D maskGraphics = (Graphics2D) mask.getGraphics();
maskGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

maskGraphics.setStroke(new BasicStroke(lineWidth));
maskGraphics.setPaint(Color.BLACK);

// Draw line onto mask surface first.
Point prev = line.get(0);
for(int i = 1; i < line.size(); i++)
{
    Point current = line.get(i);
    maskGraphics.drawLine(prev.x, prev.y, current.x, current.y);
        prev = current;
}

// AlphaComposite.SrcIn:    "If pixels in the source and the destination overlap, only the source pixels
//                          in the overlapping area are rendered."
maskGraphics.setComposite(AlphaComposite.SrcIn);

maskGraphics.setPaint(top);
maskGraphics.fillRect(0, 0, width, referenceY);

maskGraphics.setPaint(bottom);
maskGraphics.fillRect(0, referenceY, width, height);

g2d.drawImage(mask, null, 0, 0);
maskGraphics.dispose();
于 2008-10-06T22:05:06.403 に答える
1

より良い方法があれば、私はそれに出くわしたことはありません。私が考えることができる最善の方法は、三角法を使用して線幅をより一貫させることです.

于 2008-10-06T20:59:55.380 に答える
0

たぶん、これを行うために Stroke.createClippedShape を使用できますか? (正確に何をしようとしているかに応じて、領域を使用して、ストロークされた形状を元の形状から/元の形状に追加する必要がある場合があります。

于 2011-02-14T17:32:31.657 に答える