資源簡介
根據提供的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? {
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語言實現
- 下一篇:圖形學實驗 二維圖形的幾何變換
評論
共有 條評論