Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №1 Вариант эллипс

.doc
Скачиваний:
9
Добавлен:
20.06.2014
Размер:
313.86 Кб
Скачать

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №1

по дисциплине

«Компьютерная графика»

на тему:

«Растеризация кривых второго порядка»

Студент

Филатов А.А.

подпись, дата

фамилия, инициалы

Группа

АС-09-1

Принял

Назаркин О.А.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

1.Задание

Реализовать алгоритм растрирования кривой с устранением ступенчатости (сглаживанием). Построить одновременно несколько графиков функций с различными параметрами.

Вариант: эллипс

2.Теория

Система координат устройства и мировая система координат

При работе с компьютерной графикой приходится иметь дело с двумя системами координат. Первая система – это система координат устройства (или экранная система координат). Координатами точки в этой системе являются номер пиксела в строке X и номер строки пикселов Y.

Начало координат расположено в левом верхнем углу экрана. Параметры экранной системы координат (максимальное число пикселов в строке Xmax и максимальное число строк пикселов Ymax) зависят от типа монитора, видеоадаптера и текущего графического режима. Таким образом, эта система координат определенным образом связана с конкретным графическим устройством и режимами его работы.

Вторая система координат – так называемая мировая или математическая. Она представляет собой декартову систему (xy), определяемую программистом, и является независимой от конкретного графического устройства.

Параметры, которыми задаются диапазоны изменения x и y (xminyminxmaxymax), определяют прямоугольную область в математическом двумерном пространстве. Эти параметры зависят только от конкретной задачи.

Мировые координаты и координаты устройства связаны между собой простыми соотношениями:

Формула для “экранной” координаты Y несколько отличается от формулы для координаты X в силу того, что в экранной системе координат ось OY направлена вниз.

Формат пикселя

Пиксель имеет формат вида 0xAARRGGBB, где

8 бит(A): альфа-составляющая, отвечающая за прозрачность;

8 бит(R): красный;

8 бит(G): зеленый;

8 бит(G): синий.

Каждое такое восьмибитное значение обычно называют каналом.

Растр

Растровое изображение — это файл данных или структура, представляющая прямоугольную сетку пикселей или точек цветов на компьютерном мониторе, бумаге и других отображающих устройствах и материалах.

При использовании растровой графики важным элементом является размер полотна, цветовое пространство (например, RGB), количество используемых цветов.

Основой растрового представления графики является пиксел (точка) с указанием ее цвета. Изображение представляется в виде большого количества точек - чем их больше, тем визуально качественнее изображение и больше размер файла. Т.е. одна и та же картинка может быть представлена с лучшим или худшим качеством в соответствии с количеством точек на единицу длины - разрешением (обычно, точек на дюйм - dpi или пикселов на дюйм - ppi).

3.Алгоритм

1. Всем пикселям присваивается значение заданного фонового цвета.

2. Для каждого пикселя проверяется, насколько близко он расположен к уравнению эллипса и если это значение меньше заданного параметра, пиксель накладывается на предыдущее значение пикселя с этими же координатами с учетом прозрачности (которая прямо пропорционально зависит от близости пикселя к уравнению эллипса).

3. Пункт 2 выполняется 10 раз (по количеству графиков).

4.Листинг программы

int Width= 800;

int Height= 600;

int xmin=-Width/2;

int xmax=Width/2;

int ymin=-Height/2;

int ymax=Height/2;

int Xmax=Width;

int Ymax=Height;

int Xs(int x){return float(Xmax/(xmax-xmin))*(x-xmin);}

int Ys(int y){return Ymax-(y-ymin)*float(Ymax/(ymax-ymin));}

unsigned int AlphaBlend(const unsigned int bg, const unsigned int src)

{

unsigned int Rbg=(bg>>16)%256;

unsigned int Gbg=(bg>>8)%256;

unsigned int Bbg=bg%256;

unsigned int Asrc=(src>>24)%256;

unsigned int Rsrc=(src>>16)%256;

unsigned int Gsrc=(src>>8)%256;

unsigned int Bsrc=src%256;

unsigned int R,G,B;

R = int(Rbg + Rsrc*(float)(Asrc/255.));

G = int(Gbg + Gsrc*(float)(Asrc/255.));

B = int(Bbg + Bsrc*(float)(Asrc/255.));

if(R>255)

R=255;

if(G>255)

G=255;

if(B>255)

B=255;

return 0xFF000000 | R<<16 | G<<8 | B;

}

unsigned int colorPix(double a, double b, double x, double y, double dx, double dy, double p, const unsigned int color)

{

double d;

d=abs((x-dx)*(x-dx)/(a*a)+(y-dy)*(y-dy)/(b*b)-1);

if(d<=p && d>=0)

return 0x00000000 | (255-(int)((d/p)*255)%256)<<24 | ((color>>16)%256)<<16 | ((color>>8)%256)<<8 | color%256;

else

return 0x00000000;

}

void PreparePage(void *data, int width, int height)

{

unsigned int* pDest = (unsigned int*)data;

double p=0.05;

int background=0xFF000000;//цветовые составляющие пикселя

for(int y = ymax; y > ymin; y--)

for(int x = xmin; x < xmax; x++)

pDest[Ys(y)*Width+Xs(x)] = background;//заполнение фоном

for(int y = ymax; y > ymin; y--)//рисование эллипсов

for(int x = xmin; x < xmax; ++x)

{

if(!(x%100) || !(y%100))

pDest[Ys(y)*Width+Xs(x)] = 0xFF555555;

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(150,200,x,y,10,90,p,0xFFFF00FF));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(200,150,x,y,-230,100,p,0xFFFF5555));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(100,300,x,y,-50,-100,p,0xFF00FFFF));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(250,70,x,y,250,-166,p,0xFFAA0000));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(100,100,x,y,400,100,p,0xFFFFFFFF));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(100,500,x,y,0,0,p,0xFF5500FF));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(200,90,x,y,10,20,p,0xFF115555));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(250,100,x,y,130,-100,p,0xFF0022FF));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(250,60,x,y,200,166,p,0xFFAA0033));

pDest[Ys(y)*Width+Xs(x)] = AlphaBlend(pDest[Ys(y)*Width+Xs(x)],colorPix(100,600,x,y,-200,100,p,0xFFFF99FF));

}

}

5.Контрольный пример