Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие по КГГ полное2.doc
Скачиваний:
39
Добавлен:
17.09.2019
Размер:
2.49 Mб
Скачать

2.1.2.Растровая развёртка окружности

Существует несколько очень простых, но не эффективных способов преоб­разования окружностей в растровую форму. Например, рассмотрим для про­стоты окружность с центром в начале координат. Ее уравнение записыва­ется как x2 + y2 = R2. Решая это урав­нение относительно y, получим

y = ±

Чтобы изобразить четвертую часть окружности будем изменять x с еди­ничным шагом от 0 до R и на каждом шаге вычислять y. Вторым простым методом растровой развертки окружности является использование вычисле­ний x и y по формулам x = R cos α, y = R sin α, при пошаговом изменении угла α от 00 до 900.

Для упрощения алгоритма растровой развёртки стандартной окружности можно вос­пользоваться её симметрией относительно координатных осей и прямых y = ± x в случае, когда центр окружности не совпадает с началом ко­ординат, эти прямые необходимо сдвинуть параллельно так, чтобы они прошли через центр окружности. Тем са­мым дос­таточно построить растро­вое представление для 1/8 части окружности, а все оставшиеся точки полу­чить симметрией (рис. 2.5).

Рис. 2.14 Восьмисторонняя симметрия

Рассмотрим участок окружности из второго октанта x Є [0, R/ ]. Далее опишем алго­ритм Брезенхейма для этого участка окружности.

На каждом шаге алгоритм выбирает точку Pi (xi, yi), которая является бли­жайшей к ис­тинной окружности. Идея алгоритма заключается в выборе ближайшей точки при по­мощи управляющих переменных, значения которых можно вычислить в пошаговом ре­жиме с использованием небольшого числа сложений, вычитаний и сдвигов.

Рассмотрим небольшой участок сетки пикселов, а также возможные спо­собы (от A до E) прохождения истинной окружности через сетку (Рис. 2.6).

Предположим, что точка Pi-1 была выбрана как ближайшая к окружности при x = xi-1. Теперь найдем, какая из точек Si или Ti расположена ближе к ок­ружности при x = xi-1 + 1.

Рис. 2.15 Варианты прохождения окружности через рас­тровую сетку

Заметим, что ошибка при выборе точки Pi (xi, yi) была равна

D(Pi) = (xi2+ yi2) – R2.

Запишем выражение для ошибок, получаемых при выборе точки Si или Ti.

D(Si) = [(xi-1+ 1)2 + (yi-1)2] – R2

D(Ti) = [(xi-1+ 1)2 + (yi-1 – 1)2] – R2

Если | D(Si) | ≥ | D(Ti) |, то Ti ближе к реальной окружности, иначе выбира­ется Si.

Введем di = | D(Si) | – | D(Ti) |

Ti будет выбираться при di ≥ 0, в противном случае будет устанавливаться Si.

Опуская алгебраические преобразования, запишем di и di+1 для разных ва­риантов вы­бора точки Si или Ti.

D1 = 3 – 2 R

Если выбирается Si (когда di < 0), то di+1 = di + 4 xi-1 + 6

Если выбирается Ti (когда di ≥ 0), то di+1 = di + 4 (xi-1yi-1) + 10

Существует модификация алгоритма Брезенхейма для эллипса.

static int xCenter;

static int yCenter;

static void circlePoints (int x, int y, int color )

{

putpixel ( xCenter + x, yCenter + y, color);

putpixel ( xCenter + y, yCenter + x, color);

putpixel ( xCenter + y, yCenter - x, color);

putpixel ( xCenter + x, yCenter - y, color);

putpixel ( xCenter - x, yCenter - y, color);

putpixel ( xCenter - y, yCenter - x, color);

putpixel ( xCenter - y, yCenter + x, color);

putpixel ( xCenter - x, yCenter + y, color);

}

void circle2 (int xc, int yc, int r,int color )

{

int x=0;

int y=r;

int d=1-r;

int delta1=3;

int delta2 = -2*r + 5;

xCenter=xc;

yCenter=yc;

circlePoints(x,y,color);

while (y>x)

{

if(d<0)

{

d+=delta1;

delta1 += 2;

delta2 += 2;

x++;

}

else

{

d+=delta2;

delta1 += 2;

delta2 += 4;

x++;

y--;

}

//delta2 = -2*r + 5;

circlePoints ( x, y, color );

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]