Министерство Образования Российской Федерации
Новосибирский Государственный Технический Университет
Группа: ПМ-17
Студент: Трофимов Л.С.
Преподаватель: Ратаев М. Ю., Чернышев А.В.
При запуске программы появляется область для ввода точек. Необходимо переместить указатель мыши в нужную точку экрана и нажать на левую кнопку мыши. При появлении каждой новой точки будет построен очередной сплайн (конечно за исключением того случая, когда на экране появляется первая точка)
Для того чтобы очистить область вывода надо нажать пробел, после
этого можно снова строить кривую. Если точки буду стоять слишком близко друг от
друга (по ), то область также будет очищена,
поскольку в этом случае дальнейшее построение будет невозможно. Клавишами ‘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);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.