Visual C # проблемы рисования Безье - PullRequest
0 голосов
/ 30 мая 2018

У меня есть проблема в приложении для рисования, что я разрабатывал, в каких кривых Безье не работают должным образом.

У меня есть эта строка кода:

g.DrawBezier(pen, points[i - 1], points[i], points[i], points[i + 1]);

Это делаетего работа хорошая, но по какой-то причине он также рисует дополнительную строку, что очень бесполезно ...

CLICK ME

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

Может кто-нибудь помочь мне?

for (int i = 0; i < points.Count - 1; i++) {
    pen.Color = colors[i];
    pen.Width = widths[i];
    if (visible[i] == true) {
        g.DrawBezier(pen, points[i - 1], points[i], points[i], points[i + 1]);
        if (spoints == true) {
            g.DrawEllipse(new Pen(Color.LimeGreen, 5), points[i].X - 1, points[i].Y - 1, 2, 2);
            if (spositions == true) {
                g.DrawString(points[i].X.ToString() + ", " + points[i].Y.ToString(), new Font("Courier", 8), pen.Brush, points[i]);
            }
        }
    }
    if (sskeleton == true)
    {
        g.DrawLine(new Pen(Color.Magenta, 1), points[i].X, points[i].Y, points[i + 1].X, points[i + 1].Y);
    }
}

1 Ответ

0 голосов
/ 30 мая 2018

Я думаю, что вот что происходит.

Скажите, что точки

List<Point> points = new List<Point>() {
    new Point(50, 50),
    new Point(150, 150),
    new Point(150, 250),
    new Point(300, 300),
    new Point(400, 300)};

Первая кривая Безье нарисована First points

зеленые точки являются фактическими точками.Обратите внимание, что кривая фактически не проходит через вторую точку.

Следующая кривая нарисована. Next points Эта кривая начинается во второй точке (а не там, где прошла последняя кривая).

Окончательный график: Final plot

Средние две точки в функции DrawBezier являются контрольными точками, поэтому кривая не обязательно пройдет эти дветочки.https://msdn.microsoft.com/en-us/library/a7h66bsy(v=vs.110).aspx

Возможно, то, что вы пытаетесь достичь, можно сделать с помощью DrawBeziers.https://msdn.microsoft.com/en-us/library/ds101091(v=vs.110).aspx

Другой вариант - начать следующую кривую Безье в конечной точке последней (а не в контрольной точке последней).Starting at last end point

Если вы хотите, чтобы кривая проходила через все точки, попробуйте DrawCurve (ручка, точки).DrawCurve

...