2011-01-18 4 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 раза в разных ширинах, которая показывает, как проблема становится хуже при большей ширине.

Кто-нибудь знает, почему это происходит, и как я могу это предотвратить? Любые идеи будут высоко оценены.

Cheers,

Грегло

+1

Точки не соединяются. Разрыв четко виден с толщиной линии 3. –

+0

Я этого не вижу. Конечно, они должны подключиться в любом случае, поскольку все они добавлены в GraphicsPath. Например, даже если бы я добавил две разные линии, которые были милями друг от друга, а затем нарисовал путь, он все равно соединит их. – Greg

ответ

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 может затем заполнить этот пробел и рисовать гладкий сегмент без нежелательных угловых эффектов, создающих «шипы».

С точки зрения дисплея гораздо лучше иметь пробелы в вашей линии, а не иметь какие-либо перекрытия.

Смежные вопросы