Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция Брезенхем окружность.doc
Скачиваний:
10
Добавлен:
15.11.2018
Размер:
203.26 Кб
Скачать

Методы растрирования кривых второго порядка

1. Вывод окружности

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

1.1. Метод прямого вычисления координат

Рассмотрим окружность с центром в начале координат, для которой x2+y2=R2 .

Согласно определению тригонометрических функций произвольная окружность радиуса R с центром в точке (x0y0) может быть определена как множество точек A(xy), координаты которых удовлетворяют системе уравнений:

    x = x0 + R cos        y = y0 + R sin ,

   где   [0;2).

Построим процедуру, которая будет по одной координате ставить восемь точек, симметричных центру окружности:

Void Circle_Pixel(int x0, int y0, int X, int y, int color); {

putpixel(x0 + x, y0 + y, color); putpixel(x0 + y, y0 + x, color); putpixel(x0 + y, y0 - x, color); putpixel(x0 + x, y0 - y, color); putpixel(x0 - x, y0 - y, color); putpixel(x0 - y, y0 - x, color); putpixel(x0 - y, y0 + x, color); putpixel(x0 - x, y0 + y, color);

}

Таким образом, можно написать программу рисование окружности по точкам:

Void Circle (int x0, int y0, int r, int color) {

for ( int x=0; x<=R/sqrt(2); x++) {

int y = (int)(sqrt(sqr(R)-sqr(x))); Circle_Pixel (x0, y0, x, y, color);

}

}

procedure my_circle(x,y,r:integer);

var alfa: integer;

begin

moveto(x+r,y);

for alfa:=1 to 360 do

{ угол измерятся в градусах }

lineto(round(x+r*cos(alfa*pi/360)), round(y+r*sin(alfa*pi/360)))

{ здесь используется радианная мера углов }

end;

Существенные временные затраты при реализации вышеотмеченной процедуры по сравнению процедурой circle становятся заметны при визуализации тысячи произвольных окружностей. Кроме того, на самом деле мы строим не окружность, а правильный 360-угольник. Развитие аппаратных средств и увеличение разрешающей способности дисплеев может привести к тому, что отличие многоугольника от окружности станет заметным на глаз. Это обусловливает бесперспективность приведенного алгоритма.

1.2. Алгоритм Брезенхема для вывода окружности

Реализация инкрементных алгоритмов изображения окружности несколько сложнее, чем при построении отрезка. Мы рассмотрим алгоритм построения растровой развертки окружности радиуса R с центром в начале координат. При этом задача сводится к генерации дуги окружности АВ, равной одной восьмой части окружности от 0 до 45° в направлении по часовой стрелке с исходной точкой построения A (R, 0). В этом случае координата окружности x является монотонно убывающей функцией координаты y. Остальные части окружности получают путем последующих отображений симметрии:

Рис. 1. Матрицы преобразований симметрии

Если сгенерирован первый октант, то второй октант можно получить зеркальным отражением относительно прямой у = х, что дает в совокупности первый квадрант. Первый квадрант отражается относительно прямой х = 0 для получения соответствующей части окружности во втором квадранте. Верхняя полуокружность отражается относительно прямой у = 0 для завершения построения. На рис. 1 приведены двумерные матрицы соответствующих преобразований.

П

mH = |(xi + 1)2 + (yi)2 -R2|

mD = |(xi + 1)2 + (yi -1)2 -R2|

mV = |(xi )2 + (yi -1)2 -R2|

редполагается, что центр окружности и начальная точка находятся точно в точках растра. Для любой заданной точки (xiyi) на окружности при генерации по часовой стрелке существует только три возможности выбрать следующий пиксел, наилучшим образом приближающий окружность: горизонтально вправо, по диагонали вниз и вправо, вертикально вниз. На рис. 3 эти направления обозначены соответственно mH, mD, mV. Алгоритм выбирает пиксел, для которого минимален квадрат расстояния между одним из этих пикселов и окружностью, т. е. минимум из mH, mD, mV.

Приступим к разбору ключевой идеи алгоритма. Пусть мы находимся в некоторой промежуточной фазе построения. Мы только что поставили точку (xiyi) и теперь должны сделать выбор между точками 1(xi+1, yi-1) и 2(xi+1, y):

Рис. 2

Реальная окружность может быть расположена относительно точек 1 и 2 одним из пяти способов 1-5. Если мы выбираем точку 1, то тем самым полагаем, что

(xi+1)2+(yi-1)2 R2.

Если же выбираем точку 2, то допускаем, что

(xi+1)2+(yi)2 R2.

Рассмотрим две погрешности i1 и i2:

i1 = (xi+1)2+(yi-1)2-R2

i2 = (x1+1)2+(yi)2-R2

и контрольную величину i = i1+i2.

При выборе точки на следующем шаге, станем руководствоваться следующим критерием:

если i > 0, выберем точку 1;

если i  0, выберем точку 2.

Обоснуем разумность такого выбора. Рассмотрим знаки погрешностей i1 и i2 и их влияние на знак контрольной величины i для всех пяти возможных положений окружности.

Для положения 1.

i1 < 0, i2 < 0  i1+i2 < 0  выбирается 2.

Для положения 2.

i1 < 0, i2 = 0  i1+i2 < 0  выбирается 2.

Для положения 3 возможны варианты (учитывая, что i1 < 0, i2 > 0).

Вариант 3.1. |i1|  |i2|  i1+i2 < 0  выбирается 2.

Вариант 3.2. |i1| < |i2| i1+i2 > 0  выбирается 1.

Для положения 4.

i1 = 0, i2 > 0  i1+i2 > 0  выбирается 1.

Для положения 5.

i1 > 0, i2 > 0  i1+i2 > 0  выбирается 1.

Далее получим выражение для контрольной величины i

i = i1+i2 = (xi+1)2+(yi-1)2-R2+(xi+1)2+(yi)2-R2 = 2xi2+2yi2+4xi-2yi+3-2R2.

Выражение для i+1 существенным образом зависит от выбора следующей точки. Необходимо рассмотреть два случая: yi+1 = yi и yi+1 = yi-1.

i+1 [при yi+1 = yi] = 2x2i+1+2y2i+1+4xi+1-2yi+1+3-2R2 = 2(xi+1)2+2yi2+4(xi+1)-2yi+3-2R2 = i+4xi+6.

i+1 [при yi+1 = yi-1] = 2x2i+1+2y2i+1+4xi+1-2yi+1+3-2R2 = 2(xi+1)2+2(yi-1)2+4(xi+1)-2(yi-1)+3-2R2 = i+4(xi-yi)+10.

Теперь, когда получено рекуррентное выражение для i+1 через i, остается получить 1 (контрольную величину в начальной точке.) Она не может быть получена рекуррентно, ибо не определено предшествующее значение, зато легко может быть найдена непосредственно

x1 = 0, y1 = R  11 = (0+1)2+(R-1)2-R2 = 2-2R,

12 = (0+1)2+R2-R2 = 1

1 = 11+12 = 3-2R.

Таким образом, алгоритм Брезенхема для построения окружности основан на последовательном выборе точек; в зависимости от знака контрольной величины i выбирается следующая точка и нужным образом изменяется сама контрольная величина. Согласно процедуре sim, процесс начинается в точке (0, R), а первая точка, которую ставит процедура, имеет координаты (xcyc+r). При x = y процесс заканчивается.