2010-07-26 2 views
5

사용자 정의 도형을 만들었습니다. 본질적으로 네 개의 Arc2D 객체 모음입니다.Java - 사용자 정의 도형 채우기

이 호가 그려지면 4 점 둥근 별 모양으로 간주 될 수있는 모양을 형성합니다 (클로버와 같은 종류). 하나의 호가 끝나면 다른 호가 시작됩니다. 그들은 중심에 정사각형을 이룹니다. 상상하고, 정사각형을 찍어서 모든면에 반원을 그린다.

이 도형을 Graphics2D 객체에 그릴 수 있지만 채울 때 중심 사각형이 아닌 원호 만 채 웁니다. 이 내부 스퀘어를 채우는 것이 제 문제입니다.

아래의 getPathIterator() 방법을 구현했습니다. 나는 메소드도 구현했다. 그러나 그것은 여전히 ​​호를 채울 것입니다.

Rectangle을 추가하려고했습니다. 모양을 채울 때 사각형/정사각형이 제대로 채워지지만 직사각형도 그릴 수 있습니다. 분명히 예상해야하지만 분명히 원하는 결과는 아닙니다.

그렇다면 누구나 이런 모양을 "채우는"방법에 대한 아이디어가 있습니까?

public PathIterator getPathIterator(AffineTransform at) { 
    GeneralPath gp = new GeneralPath 

    for (Arc2D arcs : this.arcs) { 
     gp.append(arc, false); 
    } 

    return gp.getPathIterator(at); 
} 
+0

굴곡 규칙? – trashgod

답변

4

셰이프를 만들 때마다 항상 Path2D.Double 개체를 만듭니다. 그런 다음 moveTo를 사용하여 시작 위치로 이동하고 lineTo() 및 curveTo()를 조합하여 경로를 이동합니다. 그런 다음, 끝나면 closePath()를 호출합니다. 항상 올바르게 채워져 있습니다.

getPathIterator 구현에 대한 경험이 없지만 closePath()를 수행하지 않습니다. 그게 필요한지 아닌지는 모르지만 내 접근 방식을 취하는 것이 효과가 있다고 생각합니다. 여기

는 모서리가 둥근 직사각형 채우는 예입니다

 
double width = 300; 
double height = 400; 
Path2D.Double path = new Path2D.Double(); 
path.moveTo(0.0, 8.0); 
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0); 
path.lineTo(width - 8.0, 0.0); 
path.curveTo(width, 0.0, width, 8.0, width, 8.0); 
path.lineTo(width, height - 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); 
+0

나는 그것을 줄 것이다. closePath()를 호출했지만 그냥 마지막 호를 닫았습니다. – abrightwell

+0

이것은 채움 문제를 확실히 해결합니다. 내가 원하는 모양을 얻기가 약간 어렵지만, 그것은 곡선 문제의 계산입니다. – abrightwell

+0

많은 작업이 필요하지만 원하는 것을 정확하게 제공합니다. 감사! –

0

변경하여`Arc2D` 인스턴스의 폐쇄 형입니다 무엇 GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);