Лабораторная работа №1 Вариант эллипс
.doc
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №1
по дисциплине
«Компьютерная графика»
на тему:
«Растеризация кривых второго порядка»
|
Студент |
|
|
|
Филатов А.А. |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-09-1 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Назаркин О.А. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2010
1.Задание
Реализовать алгоритм растрирования кривой с устранением ступенчатости (сглаживанием). Построить одновременно несколько графиков функций с различными параметрами.
Вариант: эллипс
2.Теория
Система координат устройства и мировая система координат
При работе с компьютерной графикой приходится иметь дело с двумя системами координат. Первая система – это система координат устройства (или экранная система координат). Координатами точки в этой системе являются номер пиксела в строке X и номер строки пикселов Y.
Начало координат расположено в левом верхнем углу экрана. Параметры экранной системы координат (максимальное число пикселов в строке Xmax и максимальное число строк пикселов Ymax) зависят от типа монитора, видеоадаптера и текущего графического режима. Таким образом, эта система координат определенным образом связана с конкретным графическим устройством и режимами его работы.
Вторая система координат – так называемая мировая или математическая. Она представляет собой декартову систему (x, y), определяемую программистом, и является независимой от конкретного графического устройства.
Параметры, которыми задаются диапазоны изменения x и y (xmin, ymin, xmax, ymax), определяют прямоугольную область в математическом двумерном пространстве. Эти параметры зависят только от конкретной задачи.
Мировые координаты и координаты устройства связаны между собой простыми соотношениями:
Формула для “экранной” координаты 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.Контрольный пример