Основы компьютерной графики. Программа построения сплайна

Страницы работы

Содержание работы

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

Новосибирский Государственный Технический Университет

Кафедра прикладной математики и информатики

Расчетно-Графическая Работа

по курсу «Основы компьютерной графики»

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

Группа: ПМ-17

Студент: Трофимов Л.С.

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

Новосибирск 2004


Описание программы

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

Для того чтобы очистить область вывода надо нажать пробел, после этого можно снова строить кривую. Если точки буду стоять слишком близко друг от друга (по ), то область также будет очищена, поскольку в этом случае дальнейшее построение будет невозможно. Клавишами ‘1’,’2’,’3’ можно разрешить/запретить отображение самого сплайна, его первой или второй производной соответственно.

Вавод конечных формул

На входе вычислительного процесса имеется  точек , образующих на отрезке  n интервалов.

Требования к сплайну:

Эти  линейных уравнения дополняются ещё двумя  Теперь можно непосредственно приступать к вычислению коэффициентов сплайна.

Примеры выполнения

Рисунок 1

Рисунок 2

Рисунок 3

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

#include<windows.h>

#include <gl/gl.h>

#include <gl/glu.h>

#include <gl/glaux.h>

#include <stdio.h>

#include <math.h>

#define maxpoint 300

HWND hWnd;

HGLRC hGLRC;

HDC hDC;

int          scrx=400,scry=400;

int n=-1;

double *X;

double *Y;

//double *a;

double *b;

double *c;

double *d;

//double *gld;

double gx,gy,tx,ty;

int f1=1, f2=0, f3=0;

//////////////////////////////

int SetWindowPixelFormat()

{int m_GLPixelIndex;

PIXELFORMATDESCRIPTOR pfd;

pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);

pfd.nVersion=1;

pfd.dwFlags=PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

pfd.iPixelType=PFD_TYPE_RGBA;

pfd.cColorBits=32;

pfd.cRedBits=8;

pfd.cRedShift=16;

pfd.cGreenBits=8;

pfd.cGreenShift=8;

pfd.cBlueBits=8;

pfd.cBlueShift=0;

pfd.cAlphaBits=0;

pfd.cAlphaShift=0;

pfd.cAccumBits=64;   

pfd.cAccumRedBits=16;

pfd.cAccumGreenBits=16;

pfd.cAccumBlueBits=16;

pfd.cAccumAlphaBits=0;

pfd.cDepthBits=32;

pfd.cStencilBits=8;

pfd.cAuxBuffers=0;

pfd.iLayerType=PFD_MAIN_PLANE;

pfd.bReserved=0;

pfd.dwLayerMask=0;

pfd.dwVisibleMask=0;

pfd.dwDamageMask=0;

m_GLPixelIndex=ChoosePixelFormat(hDC,&pfd);

if (m_GLPixelIndex==0)

{m_GLPixelIndex=1;   

if (DescribePixelFormat

(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0)

return 0;

};

if (SetPixelFormat(hDC,m_GLPixelIndex,&pfd)==FALSE)

return 0;

return 1;

};

void resize(int width,int height)

{scry=height;

scrx=width;

glViewport(0,0,width,height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-5,5,-5,5,2,12);   

gluLookAt(0,0,5,0,0,0,0,1,0);

glMatrixMode(GL_MODELVIEW);

};

void SStGaussSSt(int n, double *d, double *d1, double *f)

{int i;

d[0]=sqrt(d[0]);

n--;

for(i=0; i<n; i++)

{d1[i]/=d[i];

d[i+1]-=d1[i]*d1[i];

d[i+1]=sqrt(d[i+1]);

}

f[0]/=d[0];

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

{f[i]-=f[i-1]*d1[i-1];

f[i]/=d[i];

}

for(i=n; i>0; i--)

{f[i]/=d[i];

f[i-1]-=f[i]*d1[i-1];

}

f[0]/=d[0];

}

inline double f(double a, double b, double c, double d, double x_x0)

{return a + b*x_x0 + 0.5*c*x_x0*x_x0 + 0.16666*d*x_x0*x_x0*x_x0;}

inline double f_(double b, double c, double d, double x_x0)

{return b + c*x_x0 + 0.5*d*x_x0*x_x0;}

inline double f__(double c, double d, double x_x0)

{return c + d*x_x0;}

void count()

{int i;

double h;

c[1]=c[n+1]=0;

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

{c[i+1]=6.0*( (Y[i+1]-Y[i])/(X[i+1]-X[i]) - (Y[i]-Y[i-1])/(X[i]-X[i-1]) );

d[i]=2.0*( X[i+1] - X[i-1] );

}

for(i=2; i<n; i++) b[i]= X[i]-X[i-1];

if(n-1) SStGaussSSt(n-1,d+1,b+2,c+2);

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

{h=X[i]-X[i-1];

d[i]=(c[i+1]-c[i])/h;

b[i]=(Y[i]-Y[i-1])/h - 0.5*c[i]*h - 0.16666*d[i]*h*h;

}

};

//чтение точек по которым строится сплайн

void build_point()

{int i;

glColor3d(1,1,1);

Информация о работе