1 / 28

Компьютерная графика Лекция вторая

Компьютерная графика Лекция вторая. Тема Растеризация, линия, окружность. Подготовлено А.А.Пименовым calvrack@googlemail.ru Для 4 курса мат.-мех. СПбГУ в 2006. Растр. Средства визуализации Дисплей Типы дисплеев Принтер Графопостроитель CNC (Computer Numerical Control) ?. Буфер кадра.

nigel-lang
Download Presentation

Компьютерная графика Лекция вторая

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation 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х связаной линии 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 );

  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!

More Related