Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по компьютерной графике [по вопросам].doc
Скачиваний:
84
Добавлен:
02.05.2014
Размер:
783.36 Кб
Скачать

20. Растровое представление отрезка: построение сглаженной линии (метод Флойда-Стейнберга, модификация алгоритма Брезенхейма, сглаживание всей сцены).

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

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

В результате простой модификации алгоритма Брезенхейма можно получить аппроксимацию площади части пиксела, находящейся внутри многоугольника. Эту аппроксимацию можно использовать для модуляции интенсивности. При пересечении пиксела и отрезка с тангенсом угла наклона m (0 <= m <= 1) может быть задействован либо один, либо два пиксела. Если пересекается только один пиксел, то площадь правее и ниже отрезка равна уi+ m/2. Если же надо рассмотреть два пиксела, то площадь нижнего пиксела составляет 1 - (1 - yi)2/2m, а верхнего - (yi-1+m)2/2m. Суммарная площадь для двух пикселов равна уi + m /2.

Алгоритм Брезенхейма, учитывающий площадь части пиксела для устранения ступенчатости.

Если к ошибке в исходном алгоритме Брезенхейма добавить величину w = 1 - m, т.е. ввести преобразование e' = e + w, то 0<=e'<=1. Теперь ошибка е' - это мера площади той части пиксела, которая находится внутри многоугольника, т. е. уi+m/2. В связи с этими модификациями начальное значение ошибки равно 1/2, поэтому для первого пиксела алгоритм, приводившийся на первом рисунке, всегда будет выдавать значение интенсивности, равное половине максимальной. Более реалистичное значение для первого пиксела дает перемещение оператора активирования пиксела на другое место. Более того, можно получить непосредственно значение интенсивности, а не десятичную дробь от ее максимума с помощью умножения на максимальное число доступных уровней интенсивности I следующих величин: тангенса угла наклона (m), весового коэффициента (w) и ошибки е'.

21. Растровое представление окружности: постановка задачи, простой алгоритм, алгоритм Брезенхейма.

Из геометрии мы знаем, что окружность с центром в точке (xc,yc) и радиусом r, задается параметрически с помощью системы уравнений:

Отсюда не сложно получить алгоритм генерации окружности:

  1. Полагаем А=0.

  2. Если А больше либо равно 2, то окружность отрисована.

  3. Вычислим x=Trunc(xc+r*cos(A)), y=Trunc(yc+r*sin(A))

  4. Screen[x,y]=Color

  5. Увеличим A на d и перейдем к шагу 2.

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

Если точка (x,y) лежит на окружности с центром в точке (0,0), то и точка (x,-y), так же лежит на этой окружности. Последнее утверждение можно развить, а именно: если точка (x,y) лежит на окружности с центром в точке (0,0), то и точки (x,-y);(-x,-y);(-x,y);(y,x),(y,-x);(-y,-x);(-y,x), так же лежат на этой окружности. Координата x увеличивается на единицу на каждом шаге. Так же координата y либо уменьшается на единицу, либо остается без изменений. Нужно выбрать, куда переходить из точки (xi,yi) либо в точку (xi+1,yi), либо в точку (xi+1,yi-1). Для того, чтобы осуществить выбор рассмотрим две невязки:

di1=(xi+1)2+yi2-r2

di2=(xi+1)2+(yi-1)2-r2

А так же будем следить за их суммой:

di=di1+di2

Рассмотрим несколько вариантов расположения "вещественной" окружности относительно "целых" точек:

Случай 1. di1 < 0, di2 < 0, и следовательно di < 0. Случай 2. di1= 0, di2 < 0, и следовательно di < 0. Случай 3. di1 > 0, di2 < 0, и следовательно имеем два варианта для di: Случай 3.1. |di1| < |di2| и следовательно di < 0. Случай 3.2. |di1| > |di2| и следовательно di > 0. Случай 4. di1 > 0, di2=0, и следовательно di > 0: Случай 5. di1 > 0, di2 > 0, и следовательно di > 0:

В случае, если di < 0 надо активировать точку (xi+1,yi), а в случае, если di > 0 надо активировать точку (xi+1,yi-1). di=di1+di2=(xi+1)2+yi2-r2+(xi+1)2+(yi-1)2-r2=2xi2+2yi2+4xi-2yi+3-2r2

Теперь получим выражение di+1 через di .

di+1=2xi+12+2yi+12+4xi+1-2yi+1+3-2r2=di+4(xi-yi)+10

Осталось получить значение d1 в начальной точке (x1=0,y1=r):

d1=3-2r

Если x > y, то выходим.

1. Screen[x+xc,y+yc]:=Color;

2. Screen[x+xc,-y+yc]:=Color;

3. Screen[-x+xc,y+yc]:=Color;

4. Screen[-x+xc,-y+yc]:=Color;

5. Screen[y+xc,x+yc]:=Color;

6. Screen[y+xc,-x+yc]:=Color;

7. Screen[-y+xc,x+yc]:=Color;

8. Screen[-y+xc,-x+yc]:=Color;

Если d < 0, то d:=d+4*x+6, переходим на Шаг 13

d:=d+4(x-y)+10; y:=y-1;

x:=x+1 ; Переходим на Шаг 2.