2011-01-18 143 views
3

我想在我的程序中繪製一個GraphicsPath,但它似乎有問題,它將隨機尖峯添加到路徑。路徑越寬,這似乎越嚴重。我製作了一些可以複製這個問題的測試代碼。C#GraphicsPath繪圖問題

此代碼需要一個帶有PictureBox的窗體(PictureBox尺寸至少爲630 x 1050)和一個按鈕。該代碼然後如下:

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);   
    } 

我畫的路徑在這裏3次在不同的寬度,這顯示瞭如何將問題在較大的寬度變得更糟。

有誰知道爲什麼會發生這種情況,以及我如何防止它?任何想法將不勝感激。

乾杯,

格雷格

+1

點不連接。不連續性清晰可見,線條粗細爲3. – 2011-01-18 21:21:04

回答

3

你現在大概想通了這一點,但是這就是爲什麼你得到你行「尖峯」:

當您添加第二個弧您的圖形路徑對象,其起點出現在您添加的第一個弧的終點之前。發生這種情況時,圖形路徑必須回溯以開始繪製第二個弧線,並且最終會形成一些非常尖銳且形狀奇怪的拐角,特別是在大線寬處。

如果你的線條有空白,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的可填補缺口和繪製光滑的部分沒有產生'尖峯'的不良角落效果。

從展示的角度來看,您的生產線中存在差距要好得多,而不是有重疊。