Главная страница
Навигация по странице:

  • Кривой Безье

  • Лаб.раб.4. Теоретические сведения


    Скачать 57.84 Kb.
    НазваниеТеоретические сведения
    Дата08.06.2022
    Размер57.84 Kb.
    Формат файлаdocx
    Имя файлаЛаб.раб.4.docx
    ТипДокументы
    #577465

    Рисование сплайнами и кривыми Безье

    Теоретические сведения
    Линии, также как прямоугольники и эллипсы, являются графическими примитивами.

    Для того, чтобы нарисовать отрезок прямой, надо указать координаты начала (Point start) и конца (Point end) отрезка, выбрать перо (pen) для рисования и применить метод объекта g.DrawLine(pen, start, end).

    Для рисования незамкнутой ломаной, состоящей из отрезков, нужно задать массив последовательных точек Point[] pm и применить метод g.DrawLines(pen, pm). Если в качестве последней точки массива указать координаты первой точки, то контур станет замкнутым.

    Для рисования кривых следует использовать методы DrawCurve() или DrawCloseCurve() для рисования сплайном, или же DrawBezier() и DrawBeziers() для рисования кривых Безье.
    Сплайн (основной или фундаментальный сплайн, аналог лекала в черчении) — это последовательность отдельных кривых, объединенных в одну большую кривую. Сплайн задается массивом точек и параметром упругости. Сплайн обязательно проходит через заданные массивом pm точки на плоскости, а параметр упругости (elasticityвещественное число типа float) определяет плавность их соединения. Если упругость = 0.0f (бесконечная физическая упругость), то соединение точек будет выполнено прямыми отрезками. Если упругость = 1.0f (отсутствие физической упругости), то кривая имеет наименьший суммарный изгиб. Если упругость > 1.0f, то кривая напоминает сдавленный берегами ручей, стремящийся увеличить изгиб своих излучин и течь по более длинному пути. Лучше всего исследовать влияние упругости, меняя ее и рисуя сплайн заново. Для вызова метода достаточно написать

    g.DrawCurve(pen, pm, elasticity, FillMode.Alternate);

    незамкнутый сплайн или

    g.DrawClosedCurve(pen, pm, elasticity, FillMode.Alternate);

    — замкнутый сплайн.

    Отличие второго метода от первого в том, что последняя точка массива добавляется от первой (eё можно не добавлять к массиву).

    Кривой Безье называется кривая, задаваемая полиномом 3 порядка: y=ax3+bx2+cx+d. То есть для ее определения нужно задать четыре параметра (a,b,c,d).
    Кривые Безье используются очень часто в 2d- и 3d-графике. Они позволяют задавать любой тип соединений («сшивания») кривых, в этом они являются более универсальными, чем рассмотренные выше сплайны (для которых кроме заданных точек дополнительно вводится только один параметр — упругость).

    Для полного определения кривой Безье, проходящей через начальную (start) и конечную (finish) точки необходимо задать еще две управляющие точки (control1 и control2), задающих касательные к этим точкам и радиусы кривизны.

    Отдаляя управляющую точку control1 от точки start, мы увеличиваем радиус кривизны, смещая ее относительно точки start, мы изменяем направление касательной к кривой в точке start. Все это справедливо и для пары finish-control2.

    Эти четыре точки полностью определяют коэффициенты (a,b,c,d) кривой Безье.
    Требуется нарисовать объекты 2d-графики, используя плавные кривые.

    Наши действия:
    Создайте проект windows.form размером 900х900
    Определяем использование пространства имен
    System.Drawing.Drawing2D;
    Первоначально необходимо задать холст:
    InitializeComponent();

    g = Graphics.FromHwnd(this.Handle);

    g.SmoothingMode = SmoothingMode.AntiAlias;
    Для создания требуемого рисунка используется метод DrawBezier(Pen, Point, Point, Point, Point определяемый четырьмя структурами Point.
    g.DrawBezier(new Pen(Color.Black, 3), start, control1, control2, finish);
    Для создания направляющих используются методы из пространства имен System.Drawing
    SolidBrush br = new SolidBrush(Color.Green);

    Pen pen = new Pen(Color.Green, 1);

    g.FillEllipse(br, start.X - 5, start.Y - 5, 11, 11);

    g.FillEllipse(br, control1.X - 5, control1.Y - 5, 11, 11);

    g.FillEllipse(br, control2.X - 5, control2.Y - 5, 11, 11);

    g.FillEllipse(br, finish.X - 5, finish.Y - 5, 11, 11);

    g.DrawLine(pen, start, control1);

    / g.DrawLine(pen, finish, control2);
    Для тех, кто чувствует в себе силы добавить в программу функционал изменяющий форму кривой в зависимости от положения ручек (манипуляции ручками можно осуществлять или по средствам мышки, или по средствам текст бокс)


    написать администратору сайта