Лабораторная работа №1 Вариант 11 (гиперболы)
.docМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №1
по дисциплине
«Компьютерная графика»
на тему:
«Визуализация кривых второго порядка с устранением эффекта ступенчатости»
|
Студент |
|
|
|
Ключанских А.С |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-10 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Назаркин О.А. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2011
-
Задание кафедры
Реализовать приложение, выполняющее построение на рабочей области окна не менее 10 кривых заданного типа с варьирующимися атрибутами. Атрибутами следует считать цвет, толщину и параметры канонического уравнения. Построение выполнить с устранением эффекта ступенчатости.
Вариант 11
Функция: гипербола
-
Краткие теоретические сведения
Задача данной лабораторной работы заключается в том, чтобы для каждого элемента растра принять решение о принадлежности его к заданной кривой. В случае принадлежности закрасить данный пиксель цветом объекта, в случае непринадлежности – цветом фона. Основной недостаток данного подхода заключается в том, что геометрическое место точек кривой как правило определено непрерывным образом, а применяется на дискретной растровой матрице. Центры пикселей на растровой решетке в общем случае не попадают на точки кривой. Решение заключается в использовании допусков на сравнение расстояний от центра текущего пикселя до точного положения на кривой ближайшей окрестности. Предложенный подход автоматически решает задачу устранения эффекта ступенчатости, возникающего при растеризации гладких кривых.
- уравнение гиперболы.
-
Алгоритм
-
Закрасить текущий пиксель цветом фона.
-
Если текущий пиксель принадлежит кривой (и ее окрестности) и закрашен цветом фона, то закрасить его цветом данной кривой, иначе если текущий пиксель принадлежит кривой (и ее окрестности) и закрашен каким-либо другим цветом, то сложить соответствующие компоненты цвета кривой с компонентами цвета данного пикселя.
-
Умножить компоненты цвета пикселя на значение функции Гаусса в данной точке растра.
-
Пункты 2 и 3 повторить 10 раз для каждой кривой.
-
Листинг программы
//--------------------------------------------------------
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;
}
-
Контрольный пример