2009-11-23 5 views
2

.NET의 System.Drawing.Graphics GDI 항목을 사용하면 두 개의 점 배열이있는 모양을 갖게됩니다. 아래 이미지의 빨간색과 녹색 픽셀입니다.겹치는 커브로 어떻게 GraphicsPath를 채울 수 있습니까?

이제이 도형의 내부를 색상으로 채우려고합니다. 간단한 선으로 그려도 괜찮습니다. 이와 같이 :

g.DrawCurve(Pens.Red, points1); 
    g.DrawCurve(Pens.Green, points2); 

이렇게하면 왼쪽 이미지 (1)가됩니다.

alt text http://lisa.xms.se/wic/filled.png

내가 이런 GraphicsPath를 사용하여 시도,이 일을 채우려면 :

GraphicsPath gp = new GraphicsPath(); 
    gp.AddCurve(points1); 
    gp.AddCurve(points2); 
    g.FillPath(Brushes.Blue, gp); 

의미가 있습니다 ... 그렇다고. 문제는 중간 이미지 (2)에서 볼 수있는 것처럼 모양이 겹쳐져 겹치는 부분을 채우지 않을 때입니다.

나는 윤곽을 얻고 그 후에 채우기 위해 gp.widen()를 사용하여 시도 :

 gp.Widen(new Pen(Color.Blue, 3)); 
     g.FillPath(Brushes.Blue, gp); 
작동한다고

하지만 단지 3 픽셀 조각 외부 모양이 아닌 전체를 채울 것으로 보인다 , 이미지 (3)에서 볼 수 있듯이.

어떻게 해결할 수 있습니까?

+0

당신은 점 1과 points2 초기화를 추가 할 수 있습니까? –

답변

4

기본적으로 GraphicsPath는 FillMode.Alternate 열거 형을 사용합니다. 당신은 FillMode.Winding

GraphicsPath gp = new GraphicsPath(FillMode.Winding); 

는 권선 모드는 각 교차로의 경로 세그먼트의 방향을 고려해야합니다. 모든 시계 방향 교차점에 대해 하나씩 더하 고 시계 반대 방향 교차점마다 하나씩 빼십시오. 결과가 0이 아니면 포인트는 채우기 또는 클립 영역 내부로 간주됩니다. 제로 카운트는 점이 채우기 또는 클립 영역 밖에 있음을 의미합니다.

더 많은 정보 here

+0

필자는 실제로 권선 모드를 일찍 시도했지만 완전히 채워졌다. 그것은 결국 마지막 포인트! = 배열의 첫 번째 포인트로 문제가되었습니다. 그래서 저는 포인트 2 배열을 뒤집었고 FillMode.Winding이 작동합니다! 나는 내일 다시 체크인하고 이것을 답변으로 표시 할 것이다 (뭔가 다른 것이 나타나지 않는 한 :-) –

관련 문제