«Интерактивное создание кривых и поверхностей с использованием сплайнов»



Скачать 114.79 Kb.
Дата04.12.2012
Размер114.79 Kb.
ТипДокументы


Министерство образования Российской Федерации

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

Расчетно-графическое задание

по курсу «Компьютерная графика »
«Интерактивное создание кривых и поверхностей с использованием сплайнов».

Факультет: ПМИ

Группа: ПМ-44

Студенты: К.С. Сиденко

Вариант: 7

Преподаватель: А.В. Чернышев

Новосибирск, 2007

Вариант

7. Квадратичный В-сплайн.

Уравнение В-сплайн функции:

, где по заданию m = 3 – порядок В-сплайна,

L + 1 – количество контрольных точек

В программе реализованы следующие возможности:

  1. построение В-сплайна по последовательности контрольных точек;

  2. изменения порядка В-сплайна – m;

  3. установленные контрольные точки можно передвигать, при этом пересчет происходит на “лету”;

  4. полученный контур можно замкнуть, тем самым завершить построение В-сплайна, далее можно только передвигать контрольные точки либо начать построение заново.



Результат
B-сплайн 3 порядка - узор


B-сплайн 7 порядка - спираль


B-сплайн 3 порядка - просто яйцо (МТС)



Текст программы
#include
#include

#include

#include
#include

#include

#include
#include "common.h"

#include "CVector2d.h"

#include "BSpline.h"

#include "Text.
h"
CBSpline B_Spline;

double Width,

Height;

enum

{

eNotSelect = 0,

eSelectCtrPoint,

}

eActiveMode;
CVector2d vCurr;

int iNumSelectPoint = 0;
void CALLBACK resize(int width,int height)

{

Width = width;

Height = height;
glViewport(0,0,width,height);

glMatrixMode( GL_MODELVIEW );

glLoadIdentity();

glMatrixMode( GL_PROJECTION );

glLoadIdentity();

gluOrtho2D(-width/2,width/2, -height/2,height/2);

glMatrixMode( GL_MODELVIEW );

}
void CalculateAxisText()

{

int i;

COpenGlText text;

glNewList(0, GL_COMPILE);
glColor3ub(0,170,172);
glLineWidth(1.0);
for(i = 0; i < Width/2; i = i + 50)

{

text.printw(i,-15,0,"%d\0", i);

}

for(i = - 50; i > -Width/2; i = i - 50)

{

text.printw(i,-15,0,"%d\0", i);

}

for(i = 50; i < Height/2; i = i + 50)

{

text.printw(0,i,0,"%d\0", i);

}

for(i = -50; i > -Height/2; i = i - 50)

{

text.printw(0,i,0,"%d\0", i);

}
glEndList();

}

void CalculateAxisLine()

{

int i;

double w = 2000;

double h = 2000;
glNewList(2, GL_COMPILE);
glLineWidth(1.0);

glColor3ub(192,192,192);
glBegin(GL_LINES);

for(i = 0; i < w; i += 50)

{

glVertex2f(i,-h);

glVertex2f(i,h);

}

for(i = 0; i > -w; i -= 50)

{

glVertex2f(i,-h);

glVertex2f(i,h);

}

for(i = 0; i < h; i += 50)

{

glVertex2f(-w,i);

glVertex2f(w,i);

}

for(i = 0; i > -h; i -= 50)

{

glVertex2f(-w,i);

glVertex2f(w,i);

}
glEnd();

glLineWidth(2.0);

glColor3ub(0,44,57);
glBegin(GL_LINES);

glVertex2f(0,-h);

glVertex2f(0,h);
glVertex2f(-w,0);

glVertex2f(w,0);

glEnd();
glEndList();

}
void CALLBACK display(void)

{

glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); // Сброс просмотра
//glTranslatef(0.0f,0.0f,-1.0f); // Передвижение на одну единицу вглубь
glColor3f(1.0,0.0,0.0);
glClearColor(1,1,1,1.0);
glCallList(1);

glCallList(2);
CalculateAxisText();
COpenGlText text;

text.SetFontStyle(GLUT_BITMAP_8_BY_13);
for(int i = 0; i < B_Spline.m_L; i++)

{

//text.printVector(*(B_Spline.GetAtControlPoint(i)));

}
auxSwapBuffers();

}
void CALLBACK OnMouseDown(AUX_EVENTREC* event)

{

vCurr.Set(event->data[AUX_MOUSEX]-Width/2.0, Height/2.0 - event->data[AUX_MOUSEY]);
// Проверка: перемещаем ли мы контрольную точку?

for(int i= 0; i < B_Spline.m_L && eActiveMode != eSelectCtrPoint; i++)

{

if(B_Spline.GetAtControlPoint(i)->DistanceTo(vCurr) < DEFAULTDISTANCE)

{

eActiveMode = eSelectCtrPoint;

iNumSelectPoint = i;

}

}
// если 1-я и последняя точки совпадают

if(!B_Spline.m_bIsClosed && B_Spline.m_L > 2 && vCurr.DistanceTo(*(B_Spline.GetAtControlPoint(0))) < DEFAULTDISTANCE)

{

B_Spline.AddControlPoint(B_Spline.GetAtControlPoint(0));
B_Spline.m_bIsClosed = true;
B_Spline.CreateOpenGlList();

eActiveMode = eNotSelect;

}

// Если контрольную точку не перемещаем, то все пересчитываем

else if(!B_Spline.m_bIsClosed && eActiveMode != eSelectCtrPoint)

{

B_Spline.AddControlPoint(vCurr);

B_Spline.CreateOpenGlList();

}

}
void CALLBACK OnMouseMove(AUX_EVENTREC* event)

{

if(eActiveMode == eSelectCtrPoint)

{

vCurr.Set(event->data[AUX_MOUSEX]-Width/2.0, Height/2.0 - event->data[AUX_MOUSEY]);

CVector2d *v = B_Spline.GetAtControlPoint(iNumSelectPoint);

*v = vCurr;

B_Spline.CreateOpenGlList();

}

}
void CALLBACK OnMouseUp(AUX_EVENTREC* event)

{

eActiveMode = eNotSelect;

}
void CALLBACK OnLeft()

{

}

void CALLBACK OnRight()

{

}
void CALLBACK OnUp()

{

if(B_Spline.m_m < B_Spline.m_L - 1)

{

B_Spline.m_m++;

B_Spline.CreateOpenGlList();

}

}

void CALLBACK OnDown()

{

if(B_Spline.m_m > 2)

{

B_Spline.m_m--;

B_Spline.CreateOpenGlList();

}

}
void CALLBACK onRemoveBSpline()

{

B_Spline.m_bIsClosed = false;

eActiveMode = eNotSelect;

B_Spline.RemoveAll();

}
void main()

{

Width = 500;

Height = 500;
auxInitPosition( 100, 100, Width, Height);

auxInitDisplayMode( AUX_RGB | AUX_DOUBLE );

auxInitWindow( "B-Spline" );

//auxIdleFunc(display);

auxReshapeFunc(resize);

auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEDOWN, OnMouseDown);

auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSELOC, OnMouseMove);

auxMouseFunc(AUX_LEFTBUTTON, AUX_MOUSEUP, OnMouseUp);

auxKeyFunc(AUX_UP, OnUp);

auxKeyFunc(AUX_DOWN, OnDown);
auxKeyFunc(AUX_LEFT, OnLeft);

auxKeyFunc(AUX_RIGHT, OnRight);
auxKeyFunc(AUX_SPACE, onRemoveBSpline);
glColor3f(1.0,0.0,0.0);

glClearColor(1,1,1,1.0);
B_Spline.CreateOpenGlList();
CalculateAxisLine();

auxMainLoop(display);

}

class CBSpline

{

public:

CBSpline(int _m = 3, int _L = 0);

~CBSpline(void);
double N(int k, int m, double t);

int BuiltKnots(int L);

void AddControlPoint(CVector2d v);

void AddControlPoint(CVector2d *v);

CVector2d* GetAtControlPoint(int iNumSelectPoint);

CVector2d* GetTailControlPoint(int iNumSelectPoint);
void CreateOpenGlList();

void RemoveAll();
private:

CAtlArray< CVector2d *> m_arrCtrPoints; // массив контрольных точек

public:

bool m_bIsClosed; // замкнут ли контур

double m_knot[100]; // узловой вектор

int m_m; // порядок B-spline

int m_L; // кол-во контрольных точек

};
#include ".\bspline.h"

#include "math.h"

#include "CVector2d.h"

#include "Text.h"

#include "common.h"
class COpenGlText;
CBSpline::CBSpline(int m, int L)

{

m_bIsClosed = false;

m_m = m;

m_L = (int)m_arrCtrPoints.GetCount();

}

CBSpline::~CBSpline(void){}
double CBSpline::N( int k, int m, double t)

{

double d1, d2, sum = 0.0;
if(m == 1)

return m_knot[k] <= t && t < m_knot[k+1];
d1 = m_knot[k+m-1] - m_knot[k];
if(fabs(d1) > DEFAULTTOLERANCE)

sum += (t - m_knot[k]) / d1 * N(k, m-1, t);
d2 = m_knot[k+m] - m_knot[k+1];

if(fabs(d2) > DEFAULTTOLERANCE)

sum += (m_knot[k+m] - t) / d2 * N(k+1, m-1, t);
return sum;

}
int CBSpline::BuiltKnots(int L)

{

int i;

if( L < m_m-1)

return 0;
for (i = 0; i <= L + m_m ; i++)

{

if(i < m_m)

m_knot[i] = 0.0;

else if(i <= L)

m_knot[i] = i - m_m + 1 ;

else

m_knot[i] = L - m_m + 2 ;

}

return 1;

}
void CBSpline::AddControlPoint( CVector2d v )

{

m_arrCtrPoints.Add(new CVector2d(v));

m_L++;

}
void CBSpline::AddControlPoint( CVector2d *v )

{

m_arrCtrPoints.Add(v);

m_L++;

}

void CBSpline::CreateOpenGlList()

{

int i, L;

CVector2d v;

double t;
glNewList(1, GL_COMPILE_AND_EXECUTE);

{

L = (int)m_arrCtrPoints.GetCount();
glColor3d(1,1,0);
// Соединяем контрольные точки линиями

L--;
if(m_bIsClosed)

L -= 2;
// Рисуем контрольные точки

glPointSize(5);

glColor3ub(196,0,0);
L = (int)m_arrCtrPoints.GetCount();
glBegin(GL_POINTS);

for(i = 1; i < L ; i++)

{

v = *m_arrCtrPoints[i];

glVertex3d(v.m_x, v.m_y, 0);

}

glEnd();
if(!m_bIsClosed)

{

if(L > 0)

{

glPointSize(6);

glColor3ub(44,32,41);
glBegin(GL_POINTS);

glVertex3d(m_arrCtrPoints[0]->m_x, m_arrCtrPoints[0]->m_y, 0);

glEnd();
if(L > 1)

{

glPointSize(6);

glColor3ub(37,158,47);
glBegin(GL_POINTS);

glVertex3d(m_arrCtrPoints[L-1]->m_x, m_arrCtrPoints[L-1]->m_y, 0);

glEnd();

}

}

}
// отрисовка В-сплайна
glColor3ub(255,112,112); // красный цвет
CVector2d vPrev;

//glBegin(GL_POINTS);

glBegin(GL_LINES);
glLineWidth(2.0);

BuiltKnots(L-1);
if(L > m_m)

{

vPrev = *m_arrCtrPoints[0];

for( t = 0 ; t <= m_L - m_m + 1; t += 0.01)

{

v.Set(0,0);
for(i = 0; i < L; i++)

{

v += (*m_arrCtrPoints[i]) * N(i, m_m, t);

}

glVertex3d(vPrev.m_x, vPrev.m_y, 0);

glVertex3d(v.m_x, v.m_y, 0);

vPrev = v;

}

}

glEnd();

m_L = (int)m_arrCtrPoints.GetCount();

}

glEndList();
}
CVector2d* CBSpline::GetAtControlPoint( int iNumSelectPoint )

{

return m_arrCtrPoints.GetAt(iNumSelectPoint);

}

CVector2d* CBSpline::GetTailControlPoint(int iNumSelectPoint)

{

return m_arrCtrPoints.GetAt(m_L-1);

}

void CBSpline::RemoveAll()

{

m_arrCtrPoints.RemoveAll();

m_L = 0;

m_m = 3;

CreateOpenGlList();

}


Похожие:

«Интерактивное создание кривых и поверхностей с использованием сплайнов» icon«Интерактивное создание кривых с использованием сплайнов»
Кусочно-квадратичный интерполяционный сплайн по 2-м точкам (в каждой точке задается значение функции и значение производной)
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconЛабораторная работа Создание сплайновых кривых и поверхностей
Появление компьютеров позволило перейти от этого механического метода к более эффективному математическому способу задания поверхности...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconПрименение s-сплайнов для решения краевых задач д. А. Силаев, Д. О. Коротаев
Ритца (или метод Галеркина), результатом которого является система линейных уравнений на коэффициенты в линейной комбинации, замыкаемая...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconЭлементы топологии и симплектической геометрии
Теорема классификации двумерных поверхностей. Две серии поверхностей. Поверхности с краем и без края. Связная сумма. Ориентируемость...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconИсследование поверхностей вращения в трехмерном евклидовом пространстве
Для формирования четкого представления о поверхностях вращения необходимо систематизировать способы получения поверхностей вращения,...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconМетодические рекомендации к выполнению контрольных работ для студентов 2 курса вечерне-заочного факультета по дисциплине «Математика»
Дифференциальное и интегральное исчисления функций нескольких переменных. Дифференциальная геометрия кривых и поверхностей. Функции...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconКурсовая работа по линейной алгебре и аналитической геометрии студентки I курса 1033 группы Ярмак Елены Владимировны
Целью курсовой работы является закрепление и углубление полученных студентом знаний и технических навыков по изучению и анализу свойств...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconЛабораторная работа №9 компас-3D. Ломаные линии и сплайновые кривые
Цель работы: Изучение приемов работы с ломаными линиями и сплайновыми кривыми: кривая Безье, nurbs-кривая. Редактирование сплайновых...
«Интерактивное создание кривых и поверхностей с использованием сплайнов» iconИнтерактивное управление алгоритмами перевода в системах мп
Ключевые слова: машинный перевод (МП), интерактивное управление алгоритмами перевода, тип текста
«Интерактивное создание кривых и поверхностей с использованием сплайнов» icon«Роль мастер-класса в процессе обучения специальных дисциплин дизайнеров»
Интерактивное обучение (понятие). Интерактивное обучение происходит от слов «интер» вместе и «акт» действие. Это значит взаимодействие...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org