2008-10-06 7 views
0

그래픽 객체의 'setClip()'메서드를 사용하여 선 모양을 사용하여 클립하는 방법이 있습니까? 지금은 다각형 모양을 사용하려고하지만 선의 "너비"를 시뮬레이트하는 데 문제가 있습니다. 나는 기본적으로 선을 그어야, 내가 마지막에 도달했을 때, 나는 그것을 다시 그리기하지만 이번에는 y 좌표에서 선 두께를 빼기 :Java2D : 선이있는 그래픽 객체 클리핑

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의 구현이 있습니까? 아니면 쉽게 만들 수있는 Shape가 있습니까? 더 쉽게이 작업을 수행 할 수 있습니까?

답변

1

더 좋은 방법이 있다면, 나는 그것을 가로 질러 본 적이 없습니다. 내가 생각할 수있는 최선의 방법은 삼각 함수를 사용하여 선 너비를보다 일관되게 만드는 것입니다.

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(); 
0

은 어쩌면 당신은이 작업을 수행하기 위해 Stroke.createClippedShape를 사용할 수 있습니다 예를 들면 다음과 같습니다입니까? (정확하게 추가하려는 영역에 따라 원래 모양에서 선 모양을 뺍니다.