Реализация пакета 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).

Точки лежащие на кривой

BezierPoints

  • 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) »

Комментарии (6)

  1. Nox Noctis пишет:

    > кривая аффинно-инвариантна

    папа, ты сейчас с кем разговаривал?

  2. Sergeyev пишет:

    Поправил формулировку на более понятную и грамотную:)

  3. k0zer пишет:

    «площадь фигуры, образуемой кривой Безье и отрезком SE равняется 2/3″ – o_O? может тут тоже надо что-нибудь поправить?

  4. k0zer пишет:

    отзываю вопрос.))
    у меня просто площадь резко ассоциируется с координатами (x,y)

  5. Sergeyev пишет:

    k0zer: это на самом деле так. Такое вот чудесное свойство, и не единственное.

  6. k0zer пишет:

    Я потом сообразил о чем речь.
    Не знаю, может это у меня так только. Там написано «площадь фигуры, образуемой кривой Безье и отрезком SE», сразу возникает картинка кривой Безье на плоскости (x,y). Это и смутило.