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

Лабораторная работа №1 Вариант 11 (гиперболы)

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

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

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

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

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

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

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

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

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

на тему:

«Визуализация кривых второго порядка с устранением эффекта ступенчатости»

Студент

Ключанских А.С

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

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

Группа

АС-10

Принял

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

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

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

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

Липецк 2011

  1. Задание кафедры

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

Вариант 11

Функция: гипербола

  1. Краткие теоретические сведения

Задача данной лабораторной работы заключается в том, чтобы для каждого элемента растра принять решение о принадлежности его к заданной кривой. В случае принадлежности закрасить данный пиксель цветом объекта, в случае непринадлежности – цветом фона. Основной недостаток данного подхода заключается в том, что геометрическое место точек кривой как правило определено непрерывным образом, а применяется на дискретной растровой матрице. Центры пикселей на растровой решетке в общем случае не попадают на точки кривой. Решение заключается в использовании допусков на сравнение расстояний от центра текущего пикселя до точного положения на кривой ближайшей окрестности. Предложенный подход автоматически решает задачу устранения эффекта ступенчатости, возникающего при растеризации гладких кривых.

- уравнение гиперболы.

  1. Алгоритм

  1. Закрасить текущий пиксель цветом фона.

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

  3. Умножить компоненты цвета пикселя на значение функции Гаусса в данной точке растра.

  4. Пункты 2 и 3 повторить 10 раз для каждой кривой.

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

//--------------------------------------------------------

cbuffer TargetSize : register(b0)

{

uint2 target_size;

};

//--------------------------------------------------------

struct RasterizedPoint

{

float4 pos : SV_Position;

};

//--------------------------------------------------------

float fd(float d)

{

return exp(-20.0f * d * d);

}

//-------------------------------------------------------

float4 main(RasterizedPoint thisPoint) : SV_Target {

float2 p = thisPoint.pos.xy / (float2)target_size;

p *= 2;

p.x -= 1;

p.y = 1 - p.y;

float aspect_ratio = (float)target_size.x / (float)target_size.y;

p.y /= aspect_ratio;

//-------------------------------------------------------------------------

float4 background_color = {0.0f, 0.0f, 0.0f, 1.0f}; // черный цвет фона

//-------------------------------------------------------------------------

float colors[10][3] ={ 0.85f, 0.23f, 0.03f,

0.2f, 0.7f, 0.2f,

0.34f, 0.22f, 0.31f,

0.21f, 0.34f, 0.77f,

0.85f, 0.71f, 0.04f,

0.01f, 0.88f, 0.66f,

0.87f, 0.44f, 0.66f,

0.15f, 0.32f, 0.82f,

0.44f, 0.32f, 0.21f,

0.66f, 0.88f, 0.01f

};

float epsilon[10] = {0.31f, 0.45f, 0.26f, 0.2f, 0.3f, 0.3f, 0.25f, 0.35f, 0.35f, 0.25f};

float a[10] = {0.09f, 0.15f, 0.24f, 0.33f, 0.47f, 0.06f, 0.1f, 0.25f, 0.18f, 0.12f};

float b[10] = {0.25f, 0.18f, 0.15f, 0.09f, 0.08f, 0.35f, 0.25f, 0.09f, 0.15f, 0.2f};

//------------------------------------------------------------------------------------

float4 color = background_color;

int j=0;

for(int i=0;i<10;i++){

if(i<5){

if(abs(pow(p.x,2)/pow(a[i],2)-pow(p.y,2)/pow(b[i],2)-1.0f)<=epsilon[i]){

if((color.r == background_color.r) && (color.g == background_color.g) && (color.b == background_color.b)){

color.r=colors[i][j];

color.g=colors[i][j+1];

color.b=colors[i][j+2];

color*=fd(pow(p.x,2)/pow(a[i],2)-pow(p.y,2)/pow(b[i],2)-1.0f);

}

else{

color.r+=colors[i][j];

color.g+=colors[i][j+1];

color.b+=colors[i][j+2];

color*=fd(pow(p.x,2)/pow(a[i],2)-pow(p.y,2)/pow(b[i],2)-1.0f);

}

}

}

else{

if(abs(pow(p.y,2)/pow(b[i],2)-pow(p.x,2)/pow(a[i],2)-1.0f)<=epsilon[i]){

if((color.r == background_color.r) && (color.g == background_color.g) && (color.b == background_color.b)){

color.r=colors[i][j];

color.g=colors[i][j+1];

color.b=colors[i][j+2];

color*=fd(pow(p.y,2)/pow(b[i],2)-pow(p.x,2)/pow(a[i],2)-1.0f);

}

else{

color.r+=colors[i][j];

color.g+=colors[i][j+1];

color.b+=colors[i][j+2];

color*=fd(pow(p.y,2)/pow(b[i],2)-pow(p.x,2)/pow(a[i],2)-1.0f);

}

}

}

}

return color;

}

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