资源简介
根据提供的10个数据点的坐标(Xn,Yn,Zn)和待求点的平面坐标(Xp,Yp),利用移动二次曲面拟合法,由格网点P(Xp,Yp)周围的10个已知点内插出待求格网点P的高程
代码片段和文件信息
#include
#include
#include
#define N 10
templatevoid transpose(T1 *NMT2 *MNint aint b);
templatevoid multi(T1 *AT2 *MT2 *AMint aint bint c);
void main()
{
FILE *fp;
fp=fopen(“input.txt““r“);
int ijkh;
float n[N][3]xyzn_t[N][3]M[N][6]P[N][N]Mt[6][N]MtP[6][N]MtPM[6][6]MPtM[6][6]Z[N][1]MtPZ[6][1]Q[6][1];
for(i=0;i {
for(j=0;j<3;j++)
{
fscanf(fp“%f“&n[i][j]);
}
}//读取已知数据结束。。
for(i=0;i {
Z[i][0]=n[i][2];
}
printf(“请输入待定点的XY坐标(格式为****,****):“);
scanf(“%f%f“&x&y);//待定点XY坐标输入结束。。
getchar();
//计算改正后的坐标。。
for(i=0;i {
for(j=0;j<3;j++)
{
if(j==0)
{
n_t[i][j]=n[i][j]-x;
}
else if(j==1)
{
n_t[i][j]=n[i][j]-y;
}
}
}
//计算系数矩阵M。。
for (int i = 0; i < N; i++)
{
M[i][0]=n_t[i][0]*n_t[i][0];
M[i][1]=n_t[i][0]*n_t[i][1];
M[i][2]=n_t[i][1]*n_t[i][1];
M[i][3]=n_t[i][0];
M[i][4]=n_t[i][1];
M[i][5]=1;
}//计算系数矩阵M结束。。
//计算权矩阵P。。
for(int i=0;i {
for(int j=0;j {
if(i==j)
{
if((n_t[i][0]*n_t[i][0]+n_t[i][1]*n_t[i][1])!=0)
P[i][i]=1/(n_t[i][0]*n_t[i][0]+n_t[i][1]*n_t[i][1]);
else
{
printf(“无法得到权矩阵!“);
exit(0);
}
}
else
P[i][j]=0;
}
}//权矩阵计算结束。。
transpose(MMtN6);
multi(MtPMtP6NN);
multi(MtPMMtPM6N6);
multi(MtPZMtPZ6N1);
//计算MtPM的逆阵MPtM。。
float p;
float tem[6][12];
for(i=0;i<6;i++)
for(j=0;j<6;j++)
tem[i][j]=MtPM[i][j];
for(i=0;i<6;i++)
for(j=6;j<12;j++)
{
if(i+6==j)
tem[i][j]=1;
else
tem[i][j]=0;
}
for(h=k=0;k<6-1;k++h++)
for(i=k+1;i<6;i++)
{
if(tem[i][h]==0)
continue;
p=tem[k][h]/tem[i][h];
for(j=0;j<12;j++)
{
tem[i][j]*=p;
tem[i][j]-=tem[k][j];
}
}
for(h=k=6-1;k>0;k--h--)
for(i=k-1;i>=0;i--)
{
if(tem[i][h]==0)
continue;
p=tem[k][h]/tem[i][h];
for(j=0;j<12;j++)
{
tem[i][j]*=p;
tem[i][j]-=tem[k][j];
}
}
for(i=0;i<6;i++)
{
p=1.0/tem[i][i];
for(j=0;j<12;j++)
tem[i][j]*=p;
}
for(i=0;i<6;i++)
for(j=0;j<6;j++)
MPtM[i][j]=tem[i][j+6];
//逆阵计算结束。。
multi(MPtMMtPZQ661);
z=Q[5][0];
printf(“待定点的高程为:%.3f“z);
getchar();
}
templatevoid transpose(T1 *NMT2 *MNint aint b)//矩阵求转置函数。。
{
int ij;
for(i=0;i {
for(j=0;j {
MN[j][i]=NM[i][j];
}
}
}//矩阵求转置函数结束。。
templatevoid multi(T1 *AT2 *MT2 *AMint aint bint c)//矩阵求积函数。。
{
int ijk;
for(i=0;i {
for(j=0;j {
AM[i][j]=0;
for(k=0;k {
AM[i][j]+=A[i][k]*M[k][j];
}
}
}
return;
}//矩阵求积函数结束。。
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 45056 2010-11-09 11:06 test07\debug\test07.exe
文件 312304 2010-11-09 11:06 test07\debug\test07.ilk
文件 314368 2010-11-09 11:06 test07\debug\test07.pdb
文件 150 2010-11-08 09:53 test07\input.txt
文件 8284 2010-11-09 11:06 test07\test07\Debug\BuildLog.htm
文件 67 2010-11-09 11:06 test07\test07\Debug\mt.dep
文件 403 2010-11-08 09:53 test07\test07\Debug\test07.exe.em
文件 468 2010-11-08 09:53 test07\test07\Debug\test07.exe.em
文件 385 2010-11-09 11:06 test07\test07\Debug\test07.exe.intermediate.manifest
文件 15950 2010-11-09 11:06 test07\test07\Debug\test07_1.obj
文件 44032 2010-11-09 11:06 test07\test07\Debug\vc80.idb
文件 61440 2010-11-09 11:06 test07\test07\Debug\vc80.pdb
文件 150 2010-11-08 09:53 test07\test07\input.txt
文件 3970 2010-11-08 09:53 test07\test07\test07.vcproj
文件 1415 2010-11-09 11:08 test07\test07\test07.vcproj.GISLAB-37.student-37.user
文件 2988 2010-11-09 11:06 test07\test07\test07_1.cpp
文件 412672 2010-11-09 11:08 test07\test07.ncb
文件 883 2010-11-08 09:48 test07\test07.sln
..A..H. 7680 2010-11-09 11:08 test07\test07.suo
目录 0 2010-11-09 11:06 test07\test07\Debug
目录 0 2010-11-09 11:06 test07\debug
目录 0 2010-11-09 11:06 test07\test07
目录 0 2010-11-08 09:54 test07
----------- --------- ---------- ----- ----
1232665 23
- 上一篇:逆波兰表达式 c语言实现
- 下一篇:图形学实验 二维图形的几何变换
评论
共有 条评论