290 likes | 532 Views
Компьютерная графика Лекция вторая. Тема Растеризация, линия, окружность. Подготовлено А.А.Пименовым calvrack@googlemail.ru Для 4 курса мат.-мех. СПбГУ в 2006. Растр. Средства визуализации Дисплей Типы дисплеев Принтер Графопостроитель CNC (Computer Numerical Control) ?. Буфер кадра.
E N D
Компьютерная графикаЛекция вторая Тема Растеризация, линия, окружность Подготовлено А.А.Пименовым calvrack@googlemail.ru Для 4 курса мат.-мех. СПбГУ в 2006
Растр • Средства визуализации • Дисплей • Типы дисплеев • Принтер • Графопостроитель • CNC (Computer Numerical Control) ?
Буфер кадра • Местоположение буфера кадра • Основная память • Видео-память • Представление пикселя • Битовое предствавление • 565 • 555 • 24bit • Битовые плоскости • Учет обратного хода луча • Interlacing!!! • Замечание про систему координат
Двойная буферизация • Промаргиваниe (flicker)
Растеризация линии • Связность линии • 4-связность |x1-x2| + |y1-y2| <= 1 • 8-связность |x1-x2| <=1 или |y1-y2| <= 1 • Постановка задачи линии должны быть • Точные (нужные точки начала и конца) • Прямые • Равномерные (одинаковая яркость вне зависимости от наклона) • Быстрые
Размышление о границах пикселя • Свертка • Фильтрация и aliasing. • Варианты • Круглый • с захватом • без захвата • Квадрантный • ромбический
Представление линии (отрезка) • 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
Свдение задачи к частному случаю • Ограничения • Рисуем отрезок в первой восьмушке. • Для удобства перевернем систему координат • Подходы • Деление пополам • На векторном дисплее • Аналитически
Наивный алгоритм 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 ); }
Рекурентрый алгоритм 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 ); }
Алгоритм с коррекцией (избавляемся от округления)
Цифровой дифференциальный анализатор 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 ); } }
Целочисленный алгоритм Брезенхема 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 ); } }
Алгоритм для 4х связаной линии 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 ); } } 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 );
Алгоритм для равномерной линии (размышления) • Идея с удалением лишнего • Выравнивание
Замечания • Прохождение линии в обе стороны (разный проход – разный результат) • d = 0 • Отсечение • Использование симметричности • Алгоритмы Кс.Ву и Дж.Рокне, Гилл. по несколько точек • Алгоритмы J.Boyer и J.J.Bourdin с ортогональным проходом и пядями
Алгоритм Кастеля-Питвея 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
Уловки примененные в алгоритме Брезенхема • Переход к целочисленной арифметике (есть общий знаменатель) • Использование функции отклонения (DDA)
Растеризация окружности • Смотри книжку
Растеризация эллипса • (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)
Архитектура и уловки • Использование кеша • с какой стороны рисовать? • Самомодифицирующийся код • Избавление от лишних переходов
С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/