Компьютерная графика Лекция вторая
Post on 31-Dec-2015
84 Views
Preview:
DESCRIPTION
TRANSCRIPT
1
Компьютерная графикаЛекция вторая
ТемаРастеризация, линия, окружность
Подготовлено А.А.Пименовым calvrack@googlemail.ruДля 4 курса мат.-мех. СПбГУ в 2006
2
Растр
•Средства визуализации•Дисплей
•Типы дисплеев•Принтер•Графопостроитель•CNC (Computer Numerical Control) ?
3
Буфер кадра
• Местоположение буфера кадра– Основная память– Видео-память
• Представление пикселя– Битовое предствавление
• 565• 555• 24bit
– Битовые плоскости
• Учет обратного хода луча • Interlacing!!!• Замечание про систему координат
4
Двойная буферизация
• Промаргиваниe (flicker)
5
Растеризация линии
• Связность линии– 4-связность |x1-x2| + |y1-y2| <= 1 – 8-связность |x1-x2| <=1 или |y1-y2| <= 1
• Постановка задачи линии должны быть– Точные (нужные точки начала и конца)– Прямые – Равномерные (одинаковая яркость вне
зависимости от наклона)– Быстрые
6
Размышление о границах пикселя• Свертка• Фильтрация и aliasing.• Варианты
– Круглый• с захватом• без захвата
– Квадрантный• ромбический
7
Aliasing
8
Представление линии (отрезка)
• A(x1,y1) B(x2,y2)–L = A + (B-A)t, t = 0..1–y = y1 + (y2-y1)/(x2-x1) * (x - x1)–y = kx + b, k = (y2-y1)/(x2-x1), b =
y1 – k * x1
9
Свдение задачи к частному случаю
• Ограничения • Рисуем отрезок в первой восьмушке.• Для удобства перевернем систему координат
• Подходы• Деление пополам• На векторном дисплее• Аналитически
10
Наивный алгоритм
void drawLine ( int xa, int ya, int xb, int yb, int color ){
double k = ((double)(yb - ya))/(xb - xa);double b = ya - k*xa;
for ( int x = xa; x <= xb; x++ )putpixel ( x, (int)( k*x +b ), color );
}
11
Рекурентрый алгоритм
void drawLine ( int xa, int ya, int xb, int yb, int color ){
double k = ((double)(yb - ya))/(xb - xa);double b = ya - k*xa;double y = ya;
for ( int x = xa; x <= xb; x++, y += k )putpixel ( x, (int) y, color );
}
12
Алгоритм с коррекцией (избавляемся от округления)
13
Цифровой дифференциальный анализаторvoid drawLine ( int xa, int ya, int xb, int yb, int color ){
double k = ((double)(yb - ya))/(xb - xa);double d = 2*k - 1;int y = ya;
putpixel ( xa, ya, color );
for ( int x = xa + 1; x <= xb; x++ ){
if ( d > 0 ){
d += 2*k - 2;y++;
}else
d += 2*k;
putpixel ( x, y, color );}
}
14
Целочисленный алгоритм Брезенхема void drawLine ( int xa, int ya, int xb, int yb, int color ){
int dx = xb - xa;int dy = yb - ya;int d1 = dy << 1;int d2 = ( dy - dx ) << 1;int d = d1 - dx;
putpixel ( xa, ya, color );
for ( int x = xa; x <= xb; x++ ){
if ( d > 0 ){
d += d2;y ++;
}else
d += d1;
putpixel ( x, y, color );}
}
15
Алгоритм для 4х связаной линии
void drawLine4 ( int x1, int y1, int x2, int y2, int color ){
int dx = x2 - x1;int dy = y2 - y1;int d = 0;//( dy << 1 ) - dx;int d1 = dy << 1;int d2 = - ( dx << 1 );
putpixel ( x1, y1, color );
for ( int x = x1, y = y1, i = 1; i <= dx + dy; i++ ){
if ( d > 0 ){
d += d2;y += 1;
}else{
d += d1;x += 1;
}
putpixel ( x, y, color );}
}
16
Алгоритм для равномерной линии (размышления)• Идея с удалением лишнего
• Выравнивание
17
Замечания
• Прохождение линии в обе стороны (разный проход – разный результат)– d = 0
• Отсечение
• Использование симметричности
• Алгоритмы Кс.Ву и Дж.Рокне, Гилл. по несколько точек
• Алгоритмы J.Boyer и J.J.Bourdin с ортогональным проходом и пядями
18
Алгоритм Кастеля-Питвеяy = b;x = a - b;
m1 = "s";m2 = "d";
while( x != y ){ if( x > y ) { x = x - y; m2 = m1 # ~ m2; } else { y = y - x; m1 = m2 # ~ m1; }}m = m2 # ~ m1
19
Уловки примененные в алгоритме Брезенхема• Переход к целочисленной арифметике (есть общий знаменатель)
• Использование функции отклонения (DDA)
20
Растеризация окружности
• Смотри книжку
21
Растеризация эллипса
• (x^2 / a^2) + (y^2 / b^2) = 1• b^2 * x^2 + a^2 * y^2 – a^2 * b^2 = 0• Точка перехода gradF(x,y) = (2*b^2*x, 2*a^2*y)
22
Архитектура и уловки
• Использование кеша–с какой стороны рисовать?
• Самомодифицирующийся код• Избавление от лишних
переходов
23
Заливка рекурсивная
24
Заливка продвинутая
25
Заливка при известном контуре
26
Сcылки• http://graphics.cs.msu.su
• http://cylib.iit.nau.edu.ua/Books/Graph/Study/3d_course-2/brezquic.html
• http://graphics.cs.msu.su/courses/cg_el99/notes/lect01.doc
• http://www.intuit.ru/department/graphics/rastrgraph/
27
Q&A
28
Thanks!
top related