C # GraphicsPath проблемы рисования - PullRequest
3 голосов
/ 18 января 2011

Я пытаюсь нарисовать 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 Ответ

4 голосов
/ 03 января 2012

Вы, наверное, уже поняли это, но именно поэтому вы получаете «шипы» в своей строке:

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

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

...