Реализация пакета Bezier
08.03.2008 от
iv
Введение
Для программного рисования во Flash используется два метода: lineTo() и curveTo(), реализующие соответственно отрисовку отрезка и кривой Безье второго порядка.
В редакторе Flash имеется возможность отрисовывать кривые с помощью кривых Безье третьего порядка, однако, на этапе компиляции, они аппроксимируются кривыми Безье второго порядка.
В итоге, все векторные фигуры в скомпилированном swf файле реализованы с помощью отрезков или кривых Безье второго порядка.
В результате возникает целый спектр задач, для ре?ения которых требуется математический аппарат работы с отрезками и кривыми Безье второго порядка.
Базовые задачи класса
1. управление:
- с помощью контрольных точек;
- установка заданной точки в произвольно заданные координаты;
- поворот относительно произвольно заданной точки;
- смещение на заданное расстояние.
2. геометрические свойства:
- получение точки на плоскости по известному time-итератору;
- родители (прямая для отрезка и парабола для кривой Безье)
- длина заданного сегмента
- габаритный прямоугольник
- площадь (для кривой Безье)
- касательные
3. получение точек на кривой:
- по дистанции от начала;
- ближай?ей до произвольно заданной;
- пересечения с другими кривыми и отрезками.
Подавляющее боль?инство остальных практических задач могут быть ре?ены на основе ре?ений этих базовых задач.
Собственно, перечисленные базовые задачи и реализованы в этом пакете классов.
Примеры ре?ения других практических задач вынесены в пакет howtodo.
Концепции
1. Классы Bezier и Line реализованы схожим образом и подавляющее боль?инство их методов имеют либо схожий, либо аналогичный синтаксис, определенный интерфейсом IParametric.
Разумеется, есть и отличия: к примеру, у Line не может быть свойства area, и отсутствует управляющая точка control; у Bezier, в свою очередь нет свойства angle, присутствующего в Line.
2. Геометрические фигуры(линии), реализованные в классах Line и Bezier, задаются в параметрической форме, и каждая точка фигуры характеризуется time-итератором.
Возможно, что поначалу покажется неудобным, что при вычислении точки на кривой возвращается не привычный всем объект класса Point, а time-итератор, являющийся Number. Однако такая реализация позволяет избежать избыточных конвертаций при последующих расчетах.
Универсально точной характеристикой положения точки на фигуре является time-итератор. Конвертировать в объект Point точку заданную time-итератором можно используя метод getPoint().
Обратное действие предполагает, что точка не обязательно математически точно должна принадлежать линии или кривой. Поэтому, при необходимости получения ее time-итератора, используйте метод getClosest().
3. Объекты Bezier и Line могут быть бесконечны, либо ограничены конечными точками start и end.
Ограниченность может быть установлена свойством isSegment (по умолчанию true).
Если задать isSegment=false, то возвращаемые методами значения будут содержать точки, в том числе, лежащие за пределами сегмента start-end. В противном случае, возвращаемые методами значения будут содержать только точки, принадлежащие сегменту лежащему между start и end.
Класс Bezier представляет кривую Безье второго порядка в параметрическом представлении, задаваемую точками на плоскости start, control и end и реализован в поддержку встроенного метода curveTo().
В классе реализованы свойства и методы, предоставляющие доступ к основным геометрическим свойствам этой кривой.
Краткие сведения о кривой Безье второго порядка
Любая точка Pt на кривой Безье второго порядка вычисляется по формуле (1):
Pt = S*(1-t)2 + 2*C*(1-t)*t + E*t2
где:
- t (time) — time-итератор точки;
- S (start) — начальная опорная (узловая) точка (t=0) (anchor point);
- С (control) — управляющая точка (direction point);
- E (end) — конечная опорная (узловая) точка (t=1) (anchor point).
Построение производится итерационным вычислением множества точек кривой, с изменением значения итератора t в пределах от нуля до единицы.
Точка кривой Безье характеризуется time-итератором.
Две точки кривой, имеющие одинаковый time-итератор совпадут.
В общем случае две точки кривой Безье второго порядка с различным time-итератором не совпадут.
Свойства кривой Безье второго порядка
- кривая непрерывна;
- кривая остается кривой Безье при любых афинных преобразованиях: вращение, мас?табирование, переенос;
- все точки кривой Безье лежат в пределах треугольника ?SCE;
- точки S и E всегда принадлежат кривой Безье и ограничивают ее;
- точки с равномерно изменяющимся итератором распределены плотнее на участках с б?ль?им изгибом;
- вер?ина кривой Безье — точка с итератором t=0.5 лежит на середине отрезка, соединяющем С и середину отрезка SE;
- точка C в общем случае не принадлежит кривой и лежит на пересечении касательных к кривой в точках S и E;
- если точка С лежит на прямой SE, то такая кривая является вырожденной;
- площадь фигуры, образуемой кривой Безье и отрезком SE равняется 2/3 площади описывающего треугольника. Центр тяжести этой фигуры находится на расстоянии 1/5 от середины основания SE до управляющей точки C;
Кривая Безье и парабола
Кривая Безье второго порядка является сегментом параболы.
Кривая, построенная по формуле 1, с итератором t изменяющимся в бесконечных пределах является параболой.
Если кривая Безье лежит на параболе, то такая парабола по отно?ению к ней является родительской.
Это свойство также относится и к кривым Безье других степеней. Так, к примеру, отрезок можно рассматривать как Безье первого порядка, а его родителем будет линия, которой принадлежит этот отрезок.
Класс Line именно так интерпретирует отрезок для упрощения использования совместно с классом Bezier.
Кривая Безье третьего порядка на плоскости – сегмент проекции на плоскость кубической параболы, построенной в трехмерном пространстве.
? общий случай: Кривая Безье порядка N на плоскости – сегмент проекции на плоскость N-мерной кривой, построенной в N-мерном пространстве.
?менования и условные обозначения
При описании алгоритмов, свойств и т.д., если не указано иное, мы используем следующие именования и условные обозначения:
- треугольник Безье, описывающий треугольник — треугольник, образованный контрольными точками SCE;
- основание, основание кривой Безье — отрезок, образованный контрольными точками SE, основание треугольника SCE;
- ось, ось кривой, осевая линия — линия, проходящая через середину основания, вер?ину и управляющую точку C
- итератор, time-итератор, time, t — числовое значение, характеризующее положение точки на кривой Безье.
- родительская парабола, родительская кривая – парабола, которой принадлежит данная кривая Безье (по умолчанию считаем, что кривая Безье ограничена в рамках значений итератора от 0 до 1).
Точки лежащие на кривой
- S (Start) — начальная опорная (узловая) точка (t=0) (anchor point)
- С (Control) — управляющая (направляющая) точка (direction point)
- E (End) — конечная опорная (узловая) точка (t=1) (anchor point)
- V (Vertex) — вер?ина кривой (t=0.5)
- Pt (Point, time) — точка на кривой, заданная итератором t
- T (Top) — вер?ина родительской параболы
Другие точки
- M (Middle) — середина основания — отрезка SE
- St (Start, time) — точка на отрезке SC, заданная итератором t
- Et (End, time) — точка на отрезке CE, заданная итератором t
- F (Focus) — фокус родительской параболы.
- D (Directrix) — точка пересечения оси родительской параболы и директрисы родительской параболы.
- Gi (center of Gravity, internal) — центр тяжести фигуры образуемой кривой Безье и основанием описывающего треугольника SE.
- Ge (center of Gravity, external) — центр тяжести фигуры образуемой кривой Безье и сторонами описывающего треугольника SC и CE.
- Gt (center of Gravity, triangle) — центр тяжести описывающего треугольника SCE.
?ван Дембицкий
Сергеев: даже «камасутра» начинается с главы «введение»…
Рубрики: Примеры использования классо, начинающим |
Комментарии (6) »