Java2D:使用线条剪裁图形对象

Java2D:使用线条剪裁图形对象,java,java-2d,Java,Java 2d,有没有一种方法可以使用图形对象的“setClip()”方法来使用线条形状进行剪裁?现在我正在尝试使用多边形形状,但在模拟线条的“宽度”时遇到了问题。我基本上画了这条线,当我到达终点时,我重新画了它,但这次从y坐标中减去了线宽: Polygon poly = new Polygon(); for(int i = 0; i < points.length; i++) poly.addPoint(points.[i].x, points.[i].y); // Retrace line t

有没有一种方法可以使用图形对象的“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);
Polygon poly=新多边形();
对于(int i=0;i=0;i--)
poly.addPoint(点[i].x,点[i].y-线宽);
它几乎可以工作,但线条的宽度因坡度而异


我不能使用brushtrow和drawLine()方法,因为一旦线条经过任意参考线,它就会改变颜色。是否有一些我忽略了的形状实现,或者我可以创建一个简单的形状实现,使我可以更轻松地完成此操作?

如果有更好的方法,我从未遇到过。我能想到的最好方法是使用一些三角函数,使线宽更加一致。

好的,我在不使用setClip()方法的情况下想出了一个非常好的解决方案。它涉及到将我的背景绘制到一个中间的Graphics2D对象,使用setComposite()指定我要如何屏蔽像素,然后在顶部使用drawLine()绘制我的线条。一旦我有了这条线,我就通过drawImage把它画回到原始图形对象的顶部。下面是一个例子:

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();
BuffereImage mask=g2d.getDeviceConfiguration().createCompatibleImage(宽度、高度、BuffereImage.半透明);
Graphics2D maskGraphics=(Graphics2D)mask.getGraphics();
maskGraphics.setRenderingHint(RenderingHits.KEY\u抗锯齿,RenderingHits.VALUE\u抗锯齿\u开启);
maskGraphics.setStroke(新基本行程(线宽));
maskGraphics.setPaint(颜色:黑色);
//首先在遮罩表面画线。
上一点=行。获取(0);
对于(int i=1;i
也许您可以使用Stroke.createClippedShape来执行此操作?(可能需要使用一个区域从原始形状中添加/减去笔划形状,具体取决于您正试图执行的操作