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

Как работать с пакетом классов Bezier

07.03.2008 от iv

Здравствуй дружок,
сегодня я расскажу о том, как эффективно использовать плоды чужого труда.

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

Хуже того: они напридумывали всяких программулечек, которые помогают им использовать чужие разработки легко и непринужденно.

Если ты ленивый как программист, но еще не знае?ь стра?ного слова SVN, то настал тот момент, с которого ты начне?ь делать мень?е, а зарабатывать боль?е.

Мы разместили пакет классов на сервисе GoogleCode, что возможно поставило тебя в тупик. Как этим пользоваться?

Если ты программируе?ь непосредственно во Flash IDE, то достоен почетного знака «Заслуженный мазохист России». Всё это потому, что тебе приходится делать два разных дела одновременно: думать когда программируе?ь. Но ты пропустил новость: уже есть среда разработки, которая позволяет не думать, а тупо программировать.
Есть, конечно среда, в которой совсем программировать не нужно, но она обходится куда дороже чем FDT.

- А вот так, чтобы не накладно и, при этом минимизировать «программировать«, тем самым максимизируя «тупо«, да еще без потери качества? – спроси?ь ты.
- Да, возможно, но для этого придется установить целый комплект: Eclipse + FDT, Subclipse и научиться использовать публичные библиотеки классов.

Поскольку инструкций по установке этих ?тук написано тонны, считаем, что у тебя всё получилось нарядно, и в своем повествовании я плавно перехожу к главному: а как всё же стащить пакет классов Bezier себе на комп.

В FDT открывай File – New – Other, в открыв?емся окне кликай SVN и там выбери Check out projects from SVN и жми Next. Создай New repository location указав http://bezier.googlecode.com/svn/trunk/ После этого начнется спло?ной пендинг. Дождись когда отпендится и выбери папочку bezier. После этого можно со всем согла?аться, учитывая, что у нас проект AS3.

? вот, настал волнующий момент: у тебя в FDT есть проект, именуемый bezier. Поздравляю! Самое главное постараться не испортить этот триумф вопросом:
- А нахрена мне ва? bezier нужен?
Потому что об этом я расскажу только в следующий раз.

?ван Дембицкий

Сергеев: Л.Н. Толстой. «Война и Мир», 2 том. Про третий том я расскажу только в следующий раз.

Рубрики: начинающим | Комментарии (5) »

Текст вдоль кривой Безье

06.03.2008 от Sergeyev

1

исходники

Александр Сергеев

Дембицкий: в первом классе злая-презлая учительница учила Са�?у Сергеева писать ровно по тетрадным линеечкам. Он до сих пор мстит.

Рубрики: Примеры использования классо | Комментарии (9) »

Привет, мир!

06.03.2008 от Sergeyev

Теперь сайт bezier.ru выглядит так. Мы ре?или перейти в формат блога, надеясь что это простимулирует нас боль?е работать над проектом, и легче рассказывать вам о возможностях пакета классов Bezier. На этом блоге будут публиковаться новости, примеры, дополнительные материалы, статьи и все, что касается проекта. Также есть страничка проекта на Google Code, где можно найти свежай?ие версии исходников. Для связи с нами можете использовать комментарии к записям на этом блоге.
Поехали!

Александр Сергеев 

Дембцкий: ну почему Сергееву не понравился тот милый розовый скин с сердечками?

Рубрики: Новости | Комментарии (2) »