2011-01-18 6 views
3

내 프로그램에서 GraphicsPath를 그려려고하지만 경로에 임의의 스파이크가 추가되는 문제가있는 것으로 보입니다. 이것은 경로가 더 넓어 질수록 악화 될 것으로 보인다. 이 문제를 재현 할 수있는 몇 가지 테스트 코드를 만들었습니다.C# 그래픽 경로 그리기 문제

이 코드에는 PictureBox가 포함 된 양식 (PictureBox 크기가 최소 630 x 1050 이상)과 하나의 단추가 필요합니다. 나는 문제가 더 큰 폭으로 악화하는 방법을 보여줍니다있는 폭이 다른 여기 3 번 경로를 그린

private void button1_Click(object sender, EventArgs e) 
    { 
     drawSomeLines(); 

     pictureBox1.Refresh(); 
    } 

    private void drawSomeLines() 
    { 
     //initialise the plot area: 
     Bitmap image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
     pictureBox1.BackgroundImage = image; 

     Graphics g = Graphics.FromImage(image); 

     //create a graphics path: 
     GraphicsPath gPath = new GraphicsPath(); 

     //add sections to the path: 
     gPath.AddLine(587.310059F, 29.2261658F, 229.974731F, 668.2402F); 
     gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.532426F); 
     gPath.AddArc(new RectangleF(203.177368F,560.3876F,421.357F,421.357F), -(90 - 297.72672132554612F), -1.53240252F); 
     gPath.AddLine(224.740067F,678.2186F, 76.6899643F,979.773865F); 

     //draw the path 3 times, at different widths: 
     g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(100, Color.Blue)), 80), gPath); 
     g.DrawPath(new Pen(new SolidBrush(Color.Blue), 40), gPath); 
     g.DrawPath(new Pen(new SolidBrush(Color.Red), 2), gPath);   
    } 

다음과 같이 코드는 다음입니다.

왜 이런 일이 발생하는지 그리고 어떻게 방지 할 수 있는지 아는 사람이 있습니까? 어떤 아이디어라도 높이 평가할 수 있습니다.

건배,

그렉

+1

점들이 연결되지 않습니다. 불연속성은 3의 선 두께로 명확하게 볼 수 있습니다. –

+0

나는 이것을 보지 못합니다. 반드시 GraphicsPath에 모두 추가 될 때 어쨌든 연결해야합니다. 예를 들어, 수 마일 떨어진 두 개의 다른 선을 추가하고 경로를 그린 경우에도 여전히 경로를 연결합니다. – Greg

답변

3

당신은 아마 지금이 알아 낸, 그러나 당신이 당신의 라인에 '스파이크'를 얻고있다 이유는 다음과 같습니다

당신은 두 번째 호를 추가 할 때 graphicspath 객체의 시작점은 추가 한 첫 번째 호의 끝점 앞에 있습니다. 이런 일이 생기면 그래픽 경로가 두 번째 호 그리기를 시작하기 위해 되돌아 와야하며 특히 선 폭이 큰 경우 매우 날카 롭고 이상한 모양의 모서리가 생깁니다.

라인에 간격이있는 경우 graphicspath를 채우는 것이 좋지만 중복되는 경우 결과가 좋지 않습니다. 이것에

gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.532426F); 

:

gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.0F); 

이 당신의 2 개 호 세그먼트에서 중복을 제거하고 graphicspath 다음의 격차를 입력하고 그릴 수 있습니다 당신이 코드 줄을 변경하는 경우

'스파이크'를 생성하는 바람직하지 않은 코너 효과가없는 부드러운 세그먼트.

디스플레이 관점에서 볼 때 겹치는 부분이 있기보다는 줄에 간격이있는 것이 훨씬 낫습니다.

관련 문제