Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

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

Слово "сплайн" раньше относилось к гибкому куску дерева, резины или металла, который использовали для рисования кривых на листе бумаги. У нас такой прибор назывался лекалом. Например, если вы имели несколько отстоящих друг от друга точек, и вы хотели соединить их с помощью кривой (для интерполяции или экстраполяции), вы должны были, во-первых, отметить эти точки на чертежной бумаге, затем "привязать" сплайн к точкам и карандашом нарисовать кривую по сплайну так, как он был изогнут вокруг точек. (Пожалуйста, не смейтесь. Кажется, что так могло быть только в 19 веке, но хорошо известно, что механические сплайны использовались страховыми служащими, рассчитывавшими вероятность страхового случая, еще 30 лет назад.)

В наше время, конечно, сплайны — это математические выражения. Они имеют самые разные применения.

Сплайны Безье — одни из самых популярных в программировании компьютерной графики. Это сравнительно недавнее усовершенствование в арсенале графических средств, доступных на уровне операционной системы, и оно пришло с неожиданной стороны. В шестидесятых годах автомобильная компания Renault переходила от ручного проектирования кузовов автомобилей (что требовало много глины) к компьютерному. Требовался математический аппарат, и Пьер Безье предложил набор формул, оказавшихся очень полезными в этой работе.

С тех пор двумерная форма сплайна Безье показала себя как самая удобная кривая (после прямых линий и эллипсов) в компьютерной графике. Например, в языке PostScript сплайны Безье используются для всех кривых — эллиптические линии аппроксимируются из сплайнов Безье. Кривые Безье также используются для описания контуров символов различных шрифтов языка PostScript. (TrueType используют более простые и быстрые формы сплайнов.)

Простой двумерный сплайн Безье определяется четырьмя точками — двумя конечными и двумя контрольными. Концы кривой привязаны к двум конечным точкам. Контрольные точки выступают в роли магнитов для оттягивания кривой от прямой, соединяющей две крайние точки. Это лучше всего иллюстрируется интерактивной программой BEZIER.

Поскольку эта программа использует логику обработки мыши (об этом пойдет речь в главе 6), здесь не будут объясняться принципы ее функционирования (это было бы преждевременным). Вместо этого, поэкспериментируйте со сплайнами Безье. В этой программе две крайние точки установлены на половине высоты и на 1/4 и 3/4 ширины рабочей зоны окна. Двумя контрольными точками можно манипулировать: первой — нажатием левой кнопки мыши и перемещением мыши, второй — нажатием правой кнопки мыши и перемещением.

Кроме самого сплайна Безье программа также отображает слева прямую линию из первой контрольной точки в первую крайнюю точку (или начальную точку) и прямую линию из второй контрольной точки в конечную точку справа.

Сплайны Безье считаются полезными для компьютерного проектирования благодаря следующим характеристикам.

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

Во-вторых, сплайны Безье очень легко управляются. В некоторых формах сплайнов кривая не может быть проведена через все определяющие точки. Сплайны Безье всегда "привязаны" к двум конечным точкам. (Это первое допущение, которое берет начало в формулах Безье.) Кроме того, существуют сплайны с бесконечными кривыми, которые имеют свои особенности. В компьютерном проектировании редко встречаются подобные типы сплайнов. Как правило, кривые Безье всегда ограничены четырехэлементной ломаной, называемой "выпуклым корпусом" (convex hull), которая получается соединением конечных и контрольных точек.

В-третьих, в сплайнах Безье существует связь между конечными и контрольными точками. Кривая всегда является касательной к прямой, соединяющей начальную точку и первую контрольную точку, и направленной в ту же сторону. (Это иллюстрируется программой BEZIER.) Кривая также является касательной к прямой, соединяющей конечную точку и вторую контрольную точку, и направленной в ту же сторону. Это еще два допущения на основе формул Безье.

В-четвертых, сплайны Безье в основном хорошо смотрятся. Понятно, что это критерий субъективный, но так считают многие.

До появления Windows 95 сплайны Безье создавались с помощью функции Polyline. Вам следовало также знать параметрические уравнения, описывающие сплайны Безье. Начальная точка (x0,y0), конечная точка (x3, y3). Две контрольные точки (x1, y1) и (x2, y2). Кривая, отображаемая в интервале t от 0 до 1 описывалась так:

x(t) = (1—t)3x0 + 3t(1—t)2x1 + 3t2(1—t)x2 +t3x3

y(t) = (1—t)3y0 + 3t(1—t)2y1 + 3t2(1—t)y2 +t3y3

Начиная с Windows 95 эти формулы знать не нужно. Для того, чтобы нарисовать одну или более связанных сплайнов Безье, используйте:

PolyBezier(hdc, pt, iCount);

Или

PolyBezierTo(hdc, pt, iCount);

В обоих случаях pt — массив структур типа POINT. В функции PolyBezier первые четыре точки идут в таком порядке: начальная точка, первая контрольная точка, вторая контрольная точка, конечная точка кривой Безье.

Каждая следующая кривая Безье требует три новых точки, поскольку начальная точка следующей кривой есть конечная точка предыдущей и т. д. Параметр iCount всегда равен единице плюс умноженному на три числу связанных кривых, которые вы хотите отобразить.

Функция PoliBezierTo использует текущее положение пера как начальную точку. Первый и все последующие сплайны требуют только три точки. Когда функция возвращает управление, текущая позиция пера устанавливается в конечную точку последней кривой.

Одно предупреждение: когда вы рисуете набор связанных сплайнов Безье, в точке связи будет плавный переход, только если вторая контрольная точка первой кривой Безье, конечная точка первой кривой (она же начальная точка второй кривой) и первая контрольная точка второй кривой лежат на одной прямой.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]