Скачать презентацию Компьютерная графика Лекция вторая Тема Растеризация линия окружность Скачать презентацию Компьютерная графика Лекция вторая Тема Растеризация линия окружность

ad6a2777ed2d5378b379f201bc60f639.ppt

  • Количество слайдов: 28

Компьютерная графика Лекция вторая Тема Растеризация, линия, окружность Подготовлено А. А. Пименовым Для 4 Компьютерная графика Лекция вторая Тема Растеризация, линия, окружность Подготовлено А. А. Пименовым Для 4 курса мат. -мех. СПб. ГУ в 2006 18/03/2018 calvrack@googlemail. ru 1

Растр • Средства визуализации • Дисплей • Типы дисплеев • Принтер • Графопостроитель • Растр • Средства визуализации • Дисплей • Типы дисплеев • Принтер • Графопостроитель • CNC (Computer Numerical Control) ? 18/03/2018 2

Буфер кадра • Местоположение буфера кадра – Основная память – Видео-память • Представление пикселя Буфер кадра • Местоположение буфера кадра – Основная память – Видео-память • Представление пикселя – Битовое предствавление • 565 • 555 • 24 bit – Битовые плоскости • Учет обратного хода луча • Interlacing!!! 18/03/2018 • Замечание про систему координат 3

Двойная буферизация • Промаргиваниe (flicker) 18/03/2018 4 Двойная буферизация • Промаргиваниe (flicker) 18/03/2018 4

Растеризация линии • Связность линии – 4 -связность |x 1 -x 2| + |y Растеризация линии • Связность линии – 4 -связность |x 1 -x 2| + |y 1 -y 2| <= 1 – 8 -связность |x 1 -x 2| <=1 или |y 1 -y 2| <= 1 • Постановка задачи линии должны быть – Точные (нужные точки начала и конца) – Прямые – Равномерные (одинаковая яркость вне зависимости от наклона) – Быстрые 18/03/2018 5

Размышление о границах пикселя • Свертка • Фильтрация и aliasing. • Варианты – Круглый Размышление о границах пикселя • Свертка • Фильтрация и aliasing. • Варианты – Круглый • с захватом • без захвата – Квадрантный • ромбический 18/03/2018 6

Aliasing 18/03/2018 7 Aliasing 18/03/2018 7

Представление линии (отрезка) • A(x 1, y 1) B(x 2, y 2) – L Представление линии (отрезка) • A(x 1, y 1) B(x 2, y 2) – L = A + (B-A)t, t = 0. . 1 – y = y 1 + (y 2 -y 1)/(x 2 -x 1) * (x - x 1) – y = kx + b, k = (y 2 -y 1)/(x 2 -x 1), b = y 1 – k * x 1 18/03/2018 8

Свдение задачи к частному случаю • Ограничения • Рисуем отрезок в первой восьмушке. • Свдение задачи к частному случаю • Ограничения • Рисуем отрезок в первой восьмушке. • Для удобства перевернем систему координат • Подходы • Деление пополам • На векторном дисплее • Аналитически 18/03/2018 9

Наивный алгоритм void draw. Line ( int xa, int ya, int xb, int yb, Наивный алгоритм void draw. Line ( 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 ); } 18/03/2018 10

Рекурентрый алгоритм void draw. Line ( int xa, int ya, int xb, int yb, Рекурентрый алгоритм void draw. Line ( 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 ); } 18/03/2018 11

Алгоритм с коррекцией (избавляемся от округления) 18/03/2018 12 Алгоритм с коррекцией (избавляемся от округления) 18/03/2018 12

Цифровой дифференциальный анализатор void { double int draw. Line ( int xa, int ya, Цифровой дифференциальный анализатор void { double int draw. Line ( int xa, int ya, int xb, int yb, int color ) k = ((double)(yb - ya))/(xb - xa); d = 2*k - 1; 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 ); } } 18/03/2018 13

Целочисленный алгоритм Брезенхема void { int int int draw. Line ( int xa, int Целочисленный алгоритм Брезенхема void { int int int draw. Line ( int xa, int ya, int xb, int yb, int color ) dx = xb - xa; dy = yb - ya; d 1 = dy << 1; d 2 = ( dy - dx ) << 1; d = d 1 - dx; putpixel ( xa, ya, color ); for ( int x = xa; x <= xb; x++ ) { if ( d > 0 ) { d += d 2; y ++; } else d += d 1; putpixel ( x, y, color ); } } 18/03/2018 14

Алгоритм для 4 х связаной линии for ( int x = x 1, y Алгоритм для 4 х связаной линии for ( int x = x 1, y = y 1, i = 1; i <= dx + dy; i++ ) { void draw. Line 4 ( int x 1, int y 1, int x 2, int y 2, if ( d > 0 ) int color ) { { d += d 2; int dx = x 2 - x 1; y += 1; int dy = y 2 - y 1; int d = 0; //( dy << } else 1 ) - dx; { int d 1 = dy << 1; d += d 1; int d 2 = - ( dx << 1 ); x += 1; } putpixel ( x 1, y 1, color ); putpixel ( x, y, color ); } } 18/03/2018 15

Алгоритм для равномерной линии (размышления) • Идея с удалением лишнего • Выравнивание 18/03/2018 16 Алгоритм для равномерной линии (размышления) • Идея с удалением лишнего • Выравнивание 18/03/2018 16

Замечания • • • Прохождение линии в обе стороны (разный проход – разный результат) Замечания • • • Прохождение линии в обе стороны (разный проход – разный результат) – d=0 Отсечение Использование симметричности Алгоритмы Кс. Ву и Дж. Рокне, Гилл. по несколько точек Алгоритмы J. Boyer и J. J. Bourdin с ортогональным проходом и пядями 18/03/2018 17

Алгоритм Кастеля-Питвея y = b; x = a - b; m 1 = Алгоритм Кастеля-Питвея y = b; x = a - b; m 1 = "s"; m 2 = "d"; while( x != y ) { if( x > y ) { x = x - y; m 2 = m 1 # ~ m 2; } else { y = y - x; m 1 = m 2 # ~ m 1; } } m = m 2 # ~ m 1 18/03/2018 18

Уловки примененные в алгоритме Брезенхема • Переход к целочисленной арифметике (есть общий знаменатель) • Уловки примененные в алгоритме Брезенхема • Переход к целочисленной арифметике (есть общий знаменатель) • Использование функции отклонения (DDA) 18/03/2018 19

Растеризация окружности • Смотри книжку 18/03/2018 20 Растеризация окружности • Смотри книжку 18/03/2018 20

Растеризация эллипса • (x^2 / a^2) + (y^2 / b^2) = 1 • b^2 Растеризация эллипса • (x^2 / a^2) + (y^2 / b^2) = 1 • b^2 * x^2 + a^2 * y^2 – a^2 * b^2 = 0 • Точка перехода grad. F(x, y) = (2*b^2*x, 2*a^2*y) 18/03/2018 21

Архитектура и уловки • Использование кеша –с какой стороны рисовать? • Самомодифицирующийся код • Архитектура и уловки • Использование кеша –с какой стороны рисовать? • Самомодифицирующийся код • Избавление от лишних переходов 18/03/2018 22

Заливка рекурсивная 18/03/2018 23 Заливка рекурсивная 18/03/2018 23

Заливка продвинутая 18/03/2018 24 Заливка продвинутая 18/03/2018 24

Заливка при известном контуре 18/03/2018 25 Заливка при известном контуре 18/03/2018 25

Сcылки • http: //graphics. msu. su • http: //cylib. iit. nau. edu. ua/Books/Graph/Study/3 d_course-2/brezquic. Сcылки • http: //graphics. msu. su • http: //cylib. iit. nau. edu. ua/Books/Graph/Study/3 d_course-2/brezquic. html • http: //graphics. msu. su/courses/cg_el 99/notes/lect 01. doc • http: //www. intuit. ru/department/graphics/rastrgraph/ 18/03/2018 26

Q&A 18/03/2018 27 Q&A 18/03/2018 27

Thanks! 18/03/2018 28 Thanks! 18/03/2018 28