netlib.narod.ru | < Назад | Оглавление | Далее > |
Теперь рассмотрим контур более формально и приведем его краткий обзор. Для начала дадим несколько определений.
Контур (path) — это независимый от устройства набор точек координат, описывающий совокупность прямых и кривых. Эти прямые и кривые могут быть как соединенными, так и независимыми. Любой набор соединенных прямых и кривых в составе контура называется фигурой (figure) или субконтуром (subpath) (оба термина используются в интерфейсе Windows Forms и являются синонимами). Таким образом, контур — это совокупность фигур, число которых может равняться 0, а любая фигура — это совокупность соединенных прямых и кривых. Контур, созданный программой LineArcPath, состоит всего лишь из одной фигуры.
Фигура может быть открытой (open) или закрытой (closed). Фигура является закрытой, если конец ее последней линии соединен с началом первой (для закрытия фигур служит специальный метод класса GraphicsPath — CloseFigure), иначе фигура считается открытой. Единственная фигура, созданная LineArcPath, является открытой.
Я уже демонстрировал метод DrawPath, рисующий на устройстве вывода прямые и кривые, составляющие контур. Класс Graphics также включает метод FillPath, который при помощи кисти заливает внутренние области всех закрытых фигур контура. При исполнении метод FillPath закрывает все открытые фигуры контура, чтобы превратить их в замкнутые области.
Как я покажу ниже, можно также преобразовать контур в область (region). В отличие от контура (который является набором прямых и кривых) область описывает часть поверхности экрана, которая может быть как простой (например, прямоугольной), так и довольно сложной формы. Область можно применять и для отсечения (clipping). Отсечение ограничивает рисование заданной областью поверхности дисплея.
Программисты, впервые встретившись с контурами, склонны думать что контур — это нечто существенно большее, чем просто совокупность определений прямых и кривых. Чтобы избавиться от этой иллюзии, рассмотрим свойства объекта GraphicsPath. В контуре нет постоянных данных, кроме тех, что доступны через свойства этого объекта:
Свойства GraphicsPath
Тип | Свойство | Доступ | Описание |
FillMode | FillMode | Чтение/запись | FillMode.Alternate или FillMode.Winding |
int | PointCount | Чтение | Число точек контура |
PointF[] | PathPoints | Чтение | Массив точек контура |
byte[] | PathTypes | Чтение | Массив типов точек |
PathData | PathData | Чтение | Дублирует PathPoints и PathTypes |
Перечисление FillMode также используется методами DrawPolygon и DrawClosedCurve, с которым мы познакомились в главах 5 и 13. В случае контура свойство FillMode определяет способ его заливки (т.е. способ преобразования в область), если контур содержит пересекающиеся линии.
Остальные свойства несут избыточную информацию, определяя всего два идентичных по размеру массива:
массив PathPoints структур PointF;
массив PathTypes значений типа byte.
Свойство PointCount предоставляет число элементов этих массивов (его также можно получить из PathPoints.Length или PathTypes.Length).
Свойство PathData, представляющее собой объект типа PathData, определяемый в пространстве имен System.Drawing.Drawing2D, обеспечивает дополнительный уровень избыточности. У класса PathData два свойства:
Свойства PathData
Тип | Свойство | Доступ | Описание |
PointF[] | Points | Чтение/запись | Массив координат точек |
byte[] | Types | Чтение/запись | Массив типов точек |
Для любого объекта GraphicsPath массив Points, содержащийся в свойстве PathData, идентичен значению свойства PathPoints, а массив Types из свойства PathData — значению свойства PathTypes.
Значения типа byte, составляющие массив из свойства PathTypes, реально представляют собой значения перечисления PathPointType, также определенного в пространстве имен System.Drawing.Drawing2D.
Перечисление PathPointType
Член | Значение |
Start | 0 |
Line | 1 |
Bezier или Bezier3 | 3 |
PathTypeMask | 7 |
DashMode | 16 |
PathMarker | 32 |
CloseSubpath | 128 |
С каждой структурой PointF из массива PathPoints связано значение PathPointType. Это может быть Start, Line или Bezier. Тип Start идентифицирует первую точку фигуры, Line — точку, определяющую прямую, a Bezier — точку кривой Безье. По мере добавления к контуру дуги и канонические сплайны преобразуются в кривые Безье. Думаю, после того как в главе 13 я показал точность аппроксимации окружности кривыми Безье, никто не усомнится в допустимости подобных преобразований.
Последние три значения перечисления PathPointType — это флаги, которые можно комбинировать со значениями Start, Line или Bezier. Как я покажу ниже, флаги PathMarker и CloseSubpath генерируются при вызове метода GraphicsPath.
Член PathTypeMask — это битовая маска, позволяющая отделять в значениях массива Types типы точек (Start, Line или Bezier) от флагов (DashMode, PathMarker или CloseSubpath).
Контур не содержит ничего такого, что связывало бы координаты составляющих его точек с размерами в реальном мире. Вопрос о том, в каких единицах исчисляются координаты точек контура (пикселах, дюймах, миллиметрах или каких-либо еще), не имеет смысла — это просто точки. Их координаты преобразуются в пикселы, дюймы или миллиметры лишь при визуализации контура на устройстве вывода.
netlib.narod.ru | < Назад | Оглавление | Далее > |