Компьютерная графика
This presentation is the property of its rightful owner.
Sponsored Links
1 / 28

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


  • 158 Views
  • Uploaded on
  • Presentation posted in: General

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

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


6537700

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

Тема

Растеризация, линия, окружность

Подготовлено А.А.Пименовым [email protected]

Для 4 курса мат.-мех. СПбГУ в 2006


6537700

Растр

  • Средства визуализации

    • Дисплей

      • Типы дисплеев

    • Принтер

    • Графопостроитель

    • CNC (Computer Numerical Control) ?


6537700

Буфер кадра

  • Местоположение буфера кадра

    • Основная память

    • Видео-память

  • Представление пикселя

    • Битовое предствавление

      • 565

      • 555

      • 24bit

    • Битовые плоскости

  • Учет обратного хода луча

  • Interlacing!!!

  • Замечание про систему координат


6537700

Двойная буферизация

  • Промаргиваниe (flicker)‏


6537700

Растеризация линии

  • Связность линии

    • 4-связность |x1-x2| + |y1-y2| <= 1

    • 8-связность |x1-x2| <=1 или |y1-y2| <= 1

  • Постановка задачи линии должны быть

    • Точные (нужные точки начала и конца)‏

    • Прямые

    • Равномерные (одинаковая яркость вне зависимости от наклона)‏

    • Быстрые


6537700

Размышление о границах пикселя

  • Свертка

  • Фильтрация и aliasing.

  • Варианты

    • Круглый

      • с захватом

      • без захвата

    • Квадрантный

      • ромбический


6537700

Aliasing


6537700

Представление линии (отрезка)‏

  • 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


6537700

Свдение задачи к частному случаю

  • Ограничения

    • Рисуем отрезок в первой восьмушке.

    • Для удобства перевернем систему координат

  • Подходы

    • Деление пополам

    • На векторном дисплее

    • Аналитически


6537700

Наивный алгоритм

voiddrawLine ( int xa, int ya, int xb, int yb, int color )‏

{

doublek = ((double)(yb - ya))/(xb - xa);

doubleb = ya - k*xa;

for ( int x = xa; x <= xb; x++ )‏

putpixel ( x, (int)( k*x +b ), color );

}


6537700

Рекурентрый алгоритм

voiddrawLine ( int xa, int ya, int xb, int yb, int color )‏

{

doublek = ((double)(yb - ya))/(xb - xa);

doubleb = ya - k*xa;

doubley = ya;

for ( int x = xa; x <= xb; x++, y += k )‏

putpixel ( x, (int) y, color );

}


6537700

Алгоритм с коррекцией (избавляемся от округления)‏


6537700

Цифровой дифференциальный анализатор

voiddrawLine ( int xa, int ya, int xb, int yb, int color )‏

{

doublek = ((double)(yb - ya))/(xb - xa);

doubled = 2*k - 1;

inty = 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 );

}

}


6537700

Целочисленный алгоритм Брезенхема

voiddrawLine ( int xa, int ya, int xb, int yb, int color )‏

{

intdx = xb - xa;

intdy = yb - ya;

intd1 = dy << 1;

intd2 = ( dy - dx ) << 1;

intd = 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 );

}

}


6537700

Алгоритм для 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 );

}

}

voiddrawLine4 ( int x1, int y1, int x2, int y2, int color )‏

{

intdx = x2 - x1;

intdy = y2 - y1;

intd = 0;//( dy << 1 ) - dx;

intd1 = dy << 1;

intd2 = - ( dx << 1 );

putpixel ( x1, y1, color );


6537700

Алгоритм для равномерной линии (размышления)‏

  • Идея с удалением лишнего

  • Выравнивание


6537700

Замечания

  • Прохождение линии в обе стороны (разный проход – разный результат)‏

    • d = 0

  • Отсечение

  • Использование симметричности

  • Алгоритмы Кс.Ву и Дж.Рокне, Гилл. по несколько точек

  • Алгоритмы J.Boyer и J.J.Bourdin с ортогональным проходом и пядями


6537700

Алгоритм Кастеля-Питвея

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


6537700

Уловки примененные в алгоритме Брезенхема

  • Переход к целочисленной арифметике (есть общий знаменатель)‏

  • Использование функции отклонения (DDA)‏


6537700

Растеризация окружности

  • Смотри книжку


6537700

Растеризация эллипса

  • (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)‏


6537700

Архитектура и уловки

  • Использование кеша

    • с какой стороны рисовать?

  • Самомодифицирующийся код

  • Избавление от лишних переходов


6537700

Заливка рекурсивная


6537700

Заливка продвинутая


6537700

Заливка при известном контуре


6537700

С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/


6537700

Q&A


6537700

Thanks!


  • Login