Em[i][j]=Em[i][j]-Em[k][j]*p1;
}
}
coefficient[exp]=Em[exp][exp+1]/Em[exp][exp];
for(intl=exp-1;l>=1;l--)//回代求解
coefficient[l]=(Em[l][exp+1]-F(coefficient,l+1,exp))/Em[l][l];
}
doubleF(doublec[],intl,intm)//供CalEquation函数调用
{
doublesum=0;
for(inti=l;i<=m;i++)
sum+=Em[l-1][i]*c[i];
returnsum;
}
(3)程序运行界面截图:
(4)调试中出现的问题及解决方法:
通过网上资料查找首先了解什么是最小二乘法的多项式拟合。
拟合过程中随着高阶逐渐增加拟合的曲线也会存在病态,所以有时候对比较高的高阶需要压缩后在拟合。
这里是没有经过压缩的拟合,我会继续深入研究更高阶的曲线拟合。
EMatrix这个函数的ex要加1,就是说如果要求四次就要ex要写5。
二.用OpenGL的图形库设计长方体。
1.长方体的六个面对应六张不同的图像,可以通过键盘进行上下左右旋转。
(1)程序设计流程图:
(2)(部分)源程序:
#include//Windows的头文件
#include//OpenGL32库的头文件
#include
#include
#pragmacomment(lib,"glaux.lib")//GLaux连接库
#include//GLaux库的头文件
staticGLfloatxRot=0.0f;//建立x轴的坐标
staticGLfloatyRot=0.0f;//建立y轴的坐标
GLuinttexture[6];//纹理填充
AUX_RGBImageRec*LoadBMP(char*FileName)//加载.bmp图像,返回该图像的指针
{
FILE*File=NULL;
if(!
FileName)
returnNULL;
File=fopen(FileName,"r");
if(File)
{
fclose(File);
returnauxDIBImageLoad(FileName);
}
returnNULL;
}
//载入.bmp格式的贴图纹理
intLoadGLTextures()//载入位图(调用上面的代码)并转换成纹理
{
intStatus=FALSE;
char*bmpFile[6]={"1.bmp","2.bmp","3.bmp",//创建纹理的存储空间
"4.bmp","5.bmp","6.bmp"};
AUX_RGBImageRec*TextureImage[6]={NULL,NULL,NULL,NULL,NULL,NULL};
for(inti=0;i<6;++i)
{
//memset(TextureImage[i],0,sizeof(void*)*1);//setthepointtoNULL
if(TextureImage[i]=LoadBMP(bmpFile[i]))
{
Status=TRUE;
glGenTextures(1,&texture[i]);//命名纹理对象
glBindTexture(GL_TEXTURE_2D,texture[i]);//绑定纹理
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,TextureImage[i]->sizeX,
TextureImage[i]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,
TextureImage[i]->data);//指定纹理
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//指定过滤模式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if(TextureImage[i])
{
if(TextureImage[i]->data)
free(TextureImage[i]->data);
free(TextureImage[i]);
}
}
returnStatus;
}
voidRenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
if(!
LoadGLTextures());
glEnable(GL_TEXTURE_2D);
LoadGLTextures();//载入纹理贴图
glPushMatrix();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
glBindTexture(GL_TEXTURE_2D,texture[0]);
glBegin(GL_QUADS);
//glColor3f(1.0,0.0,0.0);//红色
glTexCoord2f(0.0f,0.0f);glVertex3f(10.0f,10.0f,20.0f);//上面
glTexCoord2f(1.0f,0.0f);glVertex3f(-10.0f,10.0f,20.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(-10.0f,-10.0f,20.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(10.0f,-10.0f,20.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[1]);
glBegin(GL_POLYGON);
//glColor3f(0.0,1.0,0.0);//绿色
glTexCoord2f(0.0f,1.0f);glVertex3f(10.0,10.0,-10.0);//右面
glTexCoord2f(0.0f,0.0f);glVertex3f(10.0,10.0,20.0);
glTexCoord2f(1.0f,0.0f);glVertex3f(10.0,-10.0,20.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(10.0,-10.0,-10.0);
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[2]);
glBegin(GL_POLYGON);
//glColor3f(0.0,0.0,1.0);//蓝色
glTexCoord2f(1.0f,0.0f);glVertex3f(10.0,-10.0,-10.0);//下面
glTexCoord2f(1.0f,1.0f);glVertex3f(-10.0,-10.0,-10.0);
glTexCoord2f(0.0f,1.0f);glVertex3f(-10.0,10.0,-10.0);
glTexCoord2f(0.0f,0.0f);glVertex3f(10.0,10.0,-10.0);
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[3]);
glBegin(GL_POLYGON);
//glColor3f(1.0,1.0,0.0);//黄色
glTexCoord2f(1.0f,0.0f);glVertex3f(-10.0,10.0,20.0);//左面
glTexCoord2f(1.0f,1.0f);glVertex3f(-10.0,10.0,-10.0);
glTexCoord2f(0.0f,1.0f);glVertex3f(-10.0,-10.0,-10.0);
glTexCoord2f(0.0f,0.0f);glVertex3f(-10.0,-10.0,20.0);
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[4]);
glBegin(GL_POLYGON);
//glColor3f(0.0,1.0,1.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(10.0,10.0,-10.0);//后面
glTexCoord2f(0.0f,1.0f);glVertex3f(-10.0,10.0,-10.0);
glTexCoord2f(0.0f,0.0f);glVertex3f(-10.0,10.0,20.0);
glTexCoord2f(1.0f,0.0f);glVertex3f(10.0,10.0,20.0);
glEnd();
glBindTexture(GL_TEXTURE_2D,texture[5]);
glBegin(GL_POLYGON);
//glColor3f(1.0,0.0,1.0);
glTexCoord2f(0.0f,0.0f);glVertex3f(10.0,-10.0,20.0);//前面
glTexCoord2f(1.0f,0.0f);glVertex3f(-10.0,-10.0,20.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(-10.0,-10.0,-10.0);
glTexCoord2f(0.0f,1.0f);glVertex3f(10.0,-10.0,-10.0);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
/*voidSetupRC()
{
//glClearColor(0.0f,0.0f,0.0f,1.0f);
glColor3f(0.0f,1.0f,0.0f);
glShadeModel(GL_FLAT);
//glFrontFace(GL_CW);
}*/
voidSpecialKeys(intkey,intx,inty)//设置键盘控制
{
if(key==GLUT_KEY_UP)
xRot-=5.0f;
if(key==GLUT_KEY_DOWN)
xRot+=5.0f;
if(key==GLUT_KEY_LEFT)
yRot-=5.0f;
if(key==GLUT_KEY_RIGHT)
yRot+=5.0f;
if(key>356.0f)
xRot=0.0f;
if(key<-1.0f)
xRot=355.0f;
if(key>356.0f)
yRot=0.0f;
if(key<-1.0f)
yRot=355.0f;
glutPostRedisplay();
}
voidChangeSize(intw,inth)
{
GLfloatnRange=25.0f;
if(h==0)
{
h=1;
}
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);//设置下面的操作矩阵为GL_MODELVIEW
glLoadIdentity();
if(w<=h)
{
glOrtho(-nRange,nRange,-nRange*h/w,nRan