Алгоритм вывода эллипса.




 

Данный алгоритм является модификацией алгоритма генерации окружности, предложенного Джеком Брезенхемом

Уравнение эллипса имеет вид . Перепишем его следующим образом: 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-моделирования кривые Безье имеют название «сплайны».

 

Свойства кривой Безье

  1. непрерывность заполнения сегмента между начальной и конечной точками;
  2. кривая всегда располагается внутри фигуры, образованной линиями, соединяющими контрольные точки;
  3. при наличии только двух контрольных точек сегмент представляет собой прямую линию;
  4. прямая линия образуется при коллинеарном (на одной прямой) размещении управляющих точек;
  5. кривая Безье симметрична, то есть обмен местами между начальной и конечной точками (изменение направления траектории) не влияет на форму кривой;
  6. масштабирование и изменение пропорций кривой Безье не нарушает её стабильности, так как она с математической точки зрения «аффинно инвариантна»;
  7. изменение координат хотя бы одной из точек ведет к изменению формы всей кривой Безье;
  8. любой частичный отрезок кривой Безье также является кривой Безье;
  9. степень кривой всегда на одну ступень ниже числа контрольных точек. Например, при трех контрольных точках форма кривой — парабола;
  10. окружность не может быть описана параметрическим уравнением кривой Безье;
  11. невозможно создать параллельные кривые Безье, за исключением тривиальных случаев (прямые линии и совпадающие кривые), хотя существуют алгоритмы, строящие приближённую параллельную кривую Безье с приемлемой для практики точностью.

Кривая Безье— параметрическаякривая, задаваемая выражением

где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) как раз и образуют кривую.
Впрочем, это чересчур наукообразно, не очень понятно, почему кривые именно такие, и как зависят от опорных точек. С этим нам поможет разобраться другой, более наглядный алгоритм.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-04-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: