簡體   English   中英

Java2D:使用Line剪切圖形對象

[英]Java2D: Clipping a Graphics object with a Line

有沒有一種方法可以使用Graphics對象的'setClip()'方法來裁剪呈Line形狀的圖形? 現在,我正在嘗試使用多邊形形狀,但是在模擬線的“寬度”時遇到了問題。 我基本上畫了線,到達終點時,我重新畫了線,但是這次從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實施,或者我可以創建的簡單實施,可以讓我更輕松地完成此操作?

如果有更好的方法,我永遠不會遇到它。 我能想到的最好的方法是使用三角函數使線寬更一致。

好的,我設法不使用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();

也許您可以使用Stroke.createClippedShape來做到這一點? (可能需要使用Area來添加/減去原始形狀的筆觸形狀,具體取決於您要嘗試執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM