Данный алгоритм является модификацией алгоритма генерации окружности, предложенного Джеком Брезенхемом
Уравнение эллипса имеет вид . Перепишем его следующим образом: b2x2+a2y2=a2b2
Рассмотрим точку с абсциссой . Касательная к эллипсу в этой точке будет составлять угол 45º. Тогда эллипс в первой четверти можно построить в два этапа: сперва при изменении абсциссы от 0 до xm, затем от a до xm.
Алгоритм Брезенхема пошагово генерирует очередные точки эллипса, выбирая на каждом шаге для занесения пикселя точку растра Pi(xi,yi), ближайшую к истинному эллипсу, так чтобы ошибка ε(Pi) =b2xi2+a2yi2-a2b2 была минимальной.
Рассмотрим генерацию части эллипса, лежащей в первой четверти, по часовой стрелке при изменении абсциссы от 0 до xm.
Проанализируем возможные варианты занесения i -й точки, после занесения i –1 -й.
При генерации эллипса в рассматриваемой области после занесения
точки P(xi-1,yi-1) следующая точка может быть (см. рис) либо S(xi-1+1,yi-1) - перемещение по горизонтали, либо T(xi-1+ 1, yi-1- 1) - перемещение по диагонали. Для этих возможных точек вычислим и сравним абсолютные значения разностей квадратов расстояний от центра эллипса до точки и эллипса:
|Si| = |(xi-1+1)2b2+ yi-12a2– a2b2|
|Ti| = |(xi-1+1)2b2+ (yi-1- 1)2a2– a2b2|
Выбирается и заноситься та точка, для которой это значение минимально. Для определения того, какой пиксель выбрать, составим разность
di = |Si| - |Ti|= |(xi-1+1)2b2+ yi-12a2– a2b2| - |(xi-1+1)2b2+ (yi-1- 1)2a2– a2b2|
И будем выбирать Ti если di> 0 и Si если di≤ 0.
Попробуем избавиться от модулей. Возможны 3 случая:
1. Si> 0, а Ti< 0. Тогда di=Si+Ti.
2. Si> 0, а Ti >0. Тогда надо будет выбрать точку Ti. Если рассмотрим di=Si+Ti, то оно, очевидно, будет положительным, что соответствует точке Ti
3. Si< 0, а Ti< 0. Тогда надо будет выбрать точку Si. Если рассмотрим di=Si+Ti, то оно, очевидно, будет отрицательным, что соответствует точке Si
Одним словом, знак выражения di=Si+Ti определяет следующую точку однозначно. Преобразуем его следующим образом:
di= Si+ Ti= 2 (xi-1+1)2b2+ 2 yi-12a2+a2- 2 yi-1a2- 2 a2b2=
= 2 xi-12b2+ 4 xi-1b2+ 2 b2+ 2 yi-12a2+ a2- 2 yi-1a2- 2 a2b2 (*)
Выведем рекуррентную формулу для di. Для этого рассмотрим разность di+1-di.
di+1- di =2 xi2b2+ 4 xib2+ 2 b2+ 2 yi2a2+ a2- 2 yia2- 2 a2b2– ( 2 xi-12b2+ 4 xi-1b2+ 2 b2+ 2 yi-12a2+ a2- 2 yi-1a2- 2 a2b2)
Так как xi=xi-1 + 1, то di+1-di = 4 b2xi-1 + 6 b2+ 2 a2(yi-yi-1)(yi+yi-1+ 1 )
Если на i-ом шаге выбрана точка S, то yi=yi-1 и di+1=di + 4 b2xi-1 + 6 b2; а если точка P, то yi=yi-1 – 1 и di+1=di + 4 b2xi-1 + 6 b2- 4 a2yi-1
Подставляя в формулу (*) начальные значения x= 0 и у =b, получаем, что d1 = 2 b2+a2- 2 ba2
Таким образом, дуга эллипса при изменении абсциссы от 0 до xm построена. Построение оставшейся части эллипса в первой четверти ведётся аналогично, только меняется направление просмотра и все х заменяются на у.
Эллипс целиком можно получить отображением части, лежащей в первой четверти, относительно осей координат и начала координат.
Кривы́е Безье́
Кривы́е Безье́ или Бернште́йна-Безье́ – типы кривых, предложенные в 60-х годах XX века независимо друг от друга Пьером Безье из автомобилестроительной компании «Рено» и Полем де Кастельжо из компании «Ситроен », где применялись для проектирования кузовов автомобилей.
Несмотря на то, что открытие де Кастельжо было сделано несколько ранее Безье (1959), его исследования не публиковались и скрывались компанией как производственная тайна до конца 1960-х.
Благодаря простоте задания и манипуляции, кривые Безье нашли широкое применение в компьютерной графике для моделирования гладких линий. Кривая целиком лежит в выпуклой оболочке своих опорных точек. Это свойство кривых Безье с одной стороны значительно облегчает задачу нахождения точек пересечения кривых (если не пересекаются выпуклые оболочки опорных точек, то не пересекаются и сами кривые), а с другой стороны позволяет осуществлять интуитивно понятное управление параметрами кривой в графическом интерфейсе с помощью её опорных точек.
Наибольшее значение имеют кривые Безье второй и третьей степеней (квадратичные и кубические). Кривые высших степеней при обработке требуют большего объёма вычислений и для практических целей используются реже. В программах векторной графики, например AdobeIllustrator, подобные фрагменты известны под названием «путей» (path), а в 3DS Max и подобных программах 3D-моделирования кривые Безье имеют название «сплайны».
Свойства кривой Безье
- непрерывность заполнения сегмента между начальной и конечной точками;
- кривая всегда располагается внутри фигуры, образованной линиями, соединяющими контрольные точки;
- при наличии только двух контрольных точек сегмент представляет собой прямую линию;
- прямая линия образуется при коллинеарном (на одной прямой) размещении управляющих точек;
- кривая Безье симметрична, то есть обмен местами между начальной и конечной точками (изменение направления траектории) не влияет на форму кривой;
- масштабирование и изменение пропорций кривой Безье не нарушает её стабильности, так как она с математической точки зрения «аффинно инвариантна»;
- изменение координат хотя бы одной из точек ведет к изменению формы всей кривой Безье;
- любой частичный отрезок кривой Безье также является кривой Безье;
- степень кривой всегда на одну ступень ниже числа контрольных точек. Например, при трех контрольных точках форма кривой — парабола;
- окружность не может быть описана параметрическим уравнением кривой Безье;
- невозможно создать параллельные кривые Безье, за исключением тривиальных случаев (прямые линии и совпадающие кривые), хотя существуют алгоритмы, строящие приближённую параллельную кривую Безье с приемлемой для практики точностью.
Кривая Безье— параметрическаякривая, задаваемая выражением
гдеPi— функция компонент векторов опорных вершин, аbi,n(t)— базисные функции кривой Безье, называемые такжеполиномами Бернштейна.
Координаты кривой описываются в зависимости от параметра t ⋲[0,1]
· Для двух точек:
P = (1-t)P1 + tP2
· Для трёх точек:
P =(1−t)2P1 + 2(1−t)tP2 + t2P3
· Для четырёх точек:
P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4
Вместо Pi нужно подставить координаты i-й опорной точки (xi, yi).
Эти уравнения векторные, то есть для каждой из координат:
· x = (1−t)2x1 + 2(1−t)tx2 + t2x3
· y = (1−t)2y1 + 2(1−t)ty2 + t2y3
Вместо x1, y1,x2, y2, x3, y3 подставляются координаты трёх опорных точек, и в то время как t пробегает множество от 0 до 1, соответствующие значения (x, y) как раз и образуют кривую.
Впрочем, это чересчур наукообразно, не очень понятно, почему кривые именно такие, и как зависят от опорных точек. С этим нам поможет разобраться другой, более наглядный алгоритм.