Контуры в GDI+

Пути формируются путем объединения линий, прямоугольников и простых кривых. Ранее в обзоре векторной графики мы рассматривали, что следующие основные стандартные элементы являются наиболее полезными для рисования рисунков:

  • Позиции

  • Прямоугольники

  • Эллипсы

  • Дуги

  • многоугольники

  • Фундаментальные сплайны

  • Сплайны Безье

В GDI+ объект GraphicsPath позволяет соединить последовательность этих стандартных элементов в одну единицу. Затем можно нарисовать всю последовательность линий, прямоугольников, многоугольников и кривых с помощью одного вызова метода DrawPath класса Graphics. На следующем рисунке показан путь, созданный путем объединения линии, дуги, сплайна Безье и фундаментального сплайна.

Image of a single-line path, starting from a straight line and continuing into different shapes.

Использование пути

Класс GraphicsPath предоставляет следующие методы для создания последовательности элементов для рисования: AddLine, AddRectangle, AddEllipse, AddArc, AddPolygonAddCurve (для фундаментальных сплайнов) и AddBezier. Каждый из этих методов перегружен, то есть каждый из них поддерживает несколько различных списков параметров. Например, один из вариантов метода AddLine получает четыре целых числа, а другой вариант метода AddLine получает два объекта Point.

Методы для добавления линий, прямоугольников и сплайнов Безье в путь имеют множество сопутствующих методов, которые добавляют несколько элементов в путь за один вызов: AddLines, AddRectangles и AddBeziers. Кроме того, методы AddCurve и AddArc имеют вспомогательные методы (AddClosedCurveиAddPie), которые добавляют в путь замкнутую кривую или круговую диаграмму.

Для рисования пути требуется объект Graphics, объект Pen и объект GraphicsPath. Объект Graphics предоставляет методDrawPath, а объект Pen хранит в себе такие атрибуты, как ширина и цвет линии, используемой для отрисовки пути. Объект GraphicsPath хранит в себе последовательность линий и кривых, составляющих путь. Объект Pen и объект GraphicsPath передаются в качестве аргументов в метод DrawPath. В следующем примере рисуется путь, состоящий из линии, эллипса и сплайна Безье:

myGraphicsPath.AddLine(0, 0, 30, 20);
myGraphicsPath.AddEllipse(20, 20, 20, 40);
myGraphicsPath.AddBezier(30, 60, 70, 60, 50, 30, 100, 10);
myGraphics.DrawPath(myPen, myGraphicsPath);
myGraphicsPath.AddLine(0, 0, 30, 20)
myGraphicsPath.AddEllipse(20, 20, 20, 40)
myGraphicsPath.AddBezier(30, 60, 70, 60, 50, 30, 100, 10)
myGraphics.DrawPath(myPen, myGraphicsPath)

На рисунке ниже показан путь.

Image of a path displayed within a graph.

Помимо добавления линий, прямоугольников и кривых в путь, туда также можно добавлять пути. Это позволяет объединять существующие пути для формирования больших и более сложных путей.

myGraphicsPath.AddPath(graphicsPath1, false);
myGraphicsPath.AddPath(graphicsPath2, false);
myGraphicsPath.AddPath(graphicsPath1, False)
myGraphicsPath.AddPath(graphicsPath2, False)

В путь можно добавить два других элемента: строки и «пироги». «Пирог» — это «кусок» внутренней части эллипса. В следующем примере создается путь из дуги, фундаментального сплайна, строки и «пирога»:

GraphicsPath myGraphicsPath = new GraphicsPath();

Point[] myPointArray =
{
    new Point(5, 30),
    new Point(20, 40),
    new Point(50, 30)
};

FontFamily myFontFamily = new FontFamily("Times New Roman");
PointF myPointF = new PointF(50, 20);
StringFormat myStringFormat = new StringFormat();

myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180);
myGraphicsPath.StartFigure();
myGraphicsPath.AddCurve(myPointArray);
myGraphicsPath.AddString("a string in a path", myFontFamily,
   0, 24, myPointF, myStringFormat);
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110);
myGraphics.DrawPath(myPen, myGraphicsPath);
Dim myGraphicsPath As New GraphicsPath()

Dim myPointArray As Point() = { _
   New Point(5, 30), _
   New Point(20, 40), _
   New Point(50, 30)}

Dim myFontFamily As New FontFamily("Times New Roman")
Dim myPointF As New PointF(50, 20)
Dim myStringFormat As New StringFormat()

myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180)
myGraphicsPath.StartFigure()
myGraphicsPath.AddCurve(myPointArray)
myGraphicsPath.AddString("a string in a path", myFontFamily, _
   0, 24, myPointF, myStringFormat)
myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110)
myGraphics.DrawPath(myPen, myGraphicsPath)

На рисунке ниже показан путь. Обратите внимание, что путь не обязательно должен быть соединен; дуга, фундаментальный сплайн, строка и «пирог» отделены друг от друга.

Paths

См. также