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 определяет способ его заливки (т.е. способ преобразования в область), если контур содержит пересекающиеся линии.

Остальные свойства несут избыточную информацию, определяя всего два идентичных по размеру массива:

Свойство 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz