请各位关心此源码的朋友帮助将其完善.docx
- 文档编号:12036243
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:20
- 大小:20.22KB
请各位关心此源码的朋友帮助将其完善.docx
《请各位关心此源码的朋友帮助将其完善.docx》由会员分享,可在线阅读,更多相关《请各位关心此源码的朋友帮助将其完善.docx(20页珍藏版)》请在冰豆网上搜索。
请各位关心此源码的朋友帮助将其完善
请各位关心此源码的朋友帮助将其完善,谢谢,希望大家共同进步。
等值线源码如下:
#defineMAXX50
#defineMAXY50
#include
#include
#include
#include
#include
#include
/*==================用趋势面加权最小二乘法计算网点高程制===================================*/
#include
#include
#include
intCN1,CN2,NP1;/*-----CN1,CN2为网点间距,NP1为测量点个数------*/
intX0,Y0;/*-----X0,Y0为网格起点坐标------*/
voidwzjs(intn,intm,float *x,float*y,float*z,float**bb)
{
inti,j,k,k0,k1,n0,hh=0;
doublecnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c;
doublee[10][10]={0},u[10]={0};
for(i=0;i<=n;i++)/*-----列网(X向)------*/
{
A=X0+i*CN1;
for(j=0;j<=m;j++)/*------横网(y向)------*/
{
B=Y0+j*CN2;
for(k=0;k<10;k++)
{
u[k]=0;
for(k0=0;k0<10;k0++)e[k][k0]=0;
}
for(k=0;k { hh=0; if(A==*(x+k)&&B==*(y+k)) { *(*(bb+i)+j)=*(z+k); hh=1;break; } x1=*(x+k);y1=*(y+k); x2=x1*x1;y2=y1*y1; cnum=(x1-A)*(x1-A)+(y1-B)*(y1-B); cnum=1/cnum; xt=cnum*x1;yt=cnum*y1; xxt=x2*cnum;yyt=y2*cnum;xyt=x1*yt; e[1][1]=e[1][1]+cnum;e[1][2]=e[1][2]+xt; e[1][3]=e[1][3]+yt;e[1][4]=e[1][4]+xyt; e[1][5]=e[1][5]+xxt;e[1][6]=e[1][6]+yyt; e[2][4]=e[2][4]+x2*yt;e[2][5]=e[2][5]+x2*xt; e[2][6]=e[2][6]+y2*xt;e[3][6]=e[3][6]+y2*yt; e[4][4]=e[4][4]+x2*yyt;e[4][5]=e[4][5]+x2*xyt; e[4][6]=e[4][6]+y2*xyt;e[5][5]=e[5][5]+x2*xxt; e[6][6]=e[6][6]+y2*yyt; zt=*(z+k)*cnum; u[1]=u[1]+zt;u[2]=u[2]+x1*zt; u[3]=u[3]+y1*zt;u[4]=u[4]+x1*y1*zt; u[5]=u[5]+x2*zt;u[6]=u[6]+y2*zt; } if(hh==1)continue; e[2][2]=e[1][5];e[2][3]=e[1][4];e[3][3]=e[1][6]; e[3][4]=e[2][6];e[3][5]=e[2][4];e[5][6]=e[4][4]; for(k=1;k<6;k++) for(k0=k+1;k0<7;k0++) e[k0][k]=e[k][k0]; for(k=1;k<7;k++)e[k][7]=u[k]; n0=6; for(k=1;k for(k0=k+1;k0 for(k1=k+1;k1 e[k0][k1]=e[k0][k1]-e[k0][k]*e[k][k1]/e[k][k]; u[n0]=e[n0][n0+1]/e[n0][n0]; for(k=n0-1;k>0;k--) { c=0; for(k0=k+1;k0 c=c+e[k][k0]*u[k0]; u[k]=(e[k][n0+1]-c)/e[k][k]; } *(*(bb+i)+j)=u[1]+A*(u[2]+B*u[4]+A*u[5])+B*(u[3]+B*u[6]); } } } /*=============================================*/ /* 绘制等值线 / /*=============================================*/ #include"hmain.h" floatflagx[MAXX][MAXY],flagy[MAXX][MAXY]; inti1,i2,j1,j2; intzdzz(float*a1,float*b1,float*a2,float*b2); voiddrawln(floata0,floatb0,intn,intm,floatratox,floatratoy,char*item) { floata1,b1,a2,b2,sin,xa[1000]={0},yb[1000]={0}; intk=1; a2=a0;b2=b0;a1=a0+5;b1=b0+5; xa[0]=a0;yb[0]=b0; do{/*-------画线-------*/ if(zdzz(&a1,&b1,&a2,&b2)==1) { line(a2/ratox,getmaxy()-b2/ratoy,a0/ratox,getmaxy()-b0/ratoy); break; } line(a1/ratox,getmaxy()-b1/ratoy,a2/ratox,getmaxy()-b2/ratoy); xa[k]=a2/ratox;yb[k]=getmaxy()-b2/ratoy; k++; }while(a2>0&&b2>0&&i2 k=k/2; if((xa[k+1]-xa[k-1])<0.3)sin=VERT_DIR;/*-----书写等值数字------*/ elseif((yb[k+1]-yb[k-1])<0.3)sin=VERT_DIR; elsesin=(yb[k+1]-yb[k-1])/(xa[k+1]-xa[k-1]); settextstyle(TRIPLEX_FONT,sin,3); setcolor(WHITE); settextjustify(CENTER_TEXT,CENTER_TEXT); outtextxy(xa[k],yb[k],item); setcolor(GREEN); } #include"hmain.h" /*读入数据*/ voidrcvda(char*flname,float*x,float*y,float*z,int*n0); /*划分网格并计算网点*/ voidwzjs(intn,intm,float *x,float*y,float*z,float**bb); /*计算等值点*/ voidbzdzd(intw,int*n,int*m,float**bb); /*绘制等值线*/ voidxcln(intn,intm,floatratox,floatratoy,char*item); /*-----------全局变量-------------------*/ intCN1,CN2,NP1; intX0,Y0,kk,kk1; floatflagx[MAXX][MAXY],flagy[MAXX][MAXY]; /*voidmapmode();---------图形模式---------*/ /*==============================设置图形模式=======================================*/ voidmapmode() { intgdriver=DETECT,gmode,errorcode;/*----自动探测------*/ errorcode=registerbgidriver(EGAVGA_driver); if(errorcode<0) { printf("Graphicserror: n%s",grapherrormsg(errorcode));/*----报告注册错误-----*/ printf("nPressanykeytohalt: "); getch(); exit (1); } initgraph(&gdriver,&gmode,"");/*----初始化图形模式----*/ errorcode=graphresult(); if(errorcode! =grOK) { printf("Graphicserror: n%s",grapherrormsg(errorcode)); printf("nPressanykeytohalt: "); getch(); exit (1); } } /*=======================================主函数=========================================*/ main() { inti,j,n,m,w,pn1,pn2,pn3,n0=0,ccc; floatx[MAXX],x0[MAXX],y[MAXY],y0[MAXY],z[MAXX],ratox,ratoy; floatmx,my,mz,nx,ny,nz; charflname[12],item[10],ch; floatbb1[MAXX][MAXY]={0}; float*bb[MAXX]; for(i=0;i { bb[i]=&bb1[i][0];/*---------将数组清零----------*/ } clrscr(); mapmode();/*---------设置图形模式-------*/ printf("请输入数据文件名: "); scanf("%s",flname); rcvda(flname,x,y,z,&n0);/*--------从文件读入数据--------*/ mx=nx=x[0]; my=ny=y[0]; mz=nz=z[0]; for(i=0;i { if(x[i]>mx)mx=x[i]; elseif(x[i] if(y[i]>my)my=x[i]; elseif(y[i] if(z[i]>mz)mz=z[i]; elseif(z[i] } NP1=n0; printf("nmaxx=%.lf minx=%.lfn",mx,nx); printf("nmaxy=%.lf miny=%.lfn",my,ny); printf("nmaxz=%.lf minz=%.lfn",mz,nz); printf("n请输入网格间距: "); scanf("%d",&CN1); CN2=CN1; n=(int)(mx-nx)/CN1;/*------计算网格数-------*/ m=(int)(my-ny)/CN2; X0=(int)(nx/CN1);X0=X0*CN1;/*------计算起始点的坐标-----*/ Y0=(int)(ny/CN2);Y0=Y0*CN2; ratox=n*CN1/640.0;ratoy=m*CN2/480.0;/*-------x,y方向系数------*/ wzjs(n,m,x,y,z,bb);/*-----计算等值点-------*/ printf("n请输入最小等值线值: "); scanf("%d",&pn1); printf("n请输入最大等值线值: "); scanf("%d",&pn2); printf("n请输入等值线间距: "); scanf("%d",&pn3); cleardevice(); for(i=0;i { x0[i]=(x[i]-X0)/ratox;/*------计算各点的屏幕坐标-----*/ y0[i]=(y[i]-Y0)/ratoy; setcolor(RED); circle(x0[i],getmaxy()-y0[i],3);/*------画一圆示型值点--------*/ } for(w=pn1;w<=pn2;w+=pn3)/*-------逐条等值线形成--------*/ { bzdzd(w,&n,&m,bb);/*--------计算等值点--------*/ itoa(w,item,10);/*-------将整数W转换成字符用于标注----*/ xcln(n,m,ratox,ratoy,item);/*-------绘制等值线----*/ } getch(); closegraph(); } /*==================从文件读入数据======================================*/ #include"hmain.h' voidrcvda(char*flname,float*x,float*y,float*z,int*n0) { FILE*stream; if((stream=fopen(flname,"rt"))==NULL)/*------打开文件-------*/ { printf("nCan'topen%s: ",flname); getch(); exit(0); } while(! feof(stream))/*------读文件直到结束-------*/ { fscanf(stream,"%f,",(x+*n0)); fscanf(stream,"%f,",(y+*n0)); fscanf(stream,"%f,",(z+*n0)); *n0=*n0+1;/*-----指定区域变动--------*/ } fclose(stream); } /*==================用趋势面加权最小二乘法计算网点高程制===================================*/ #include #include #include intCN1,CN2,NP1;/*-----CN1,CN2为网点间距,NP1为测量点个数------*/ intX0,Y0;/*-----X0,Y0为网格起点坐标------*/ voidwzjs(intn,intm,float *x,float*y,float*z,float**bb) { inti,j,k,k0,k1,n0,hh=0; doublecnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c; doublee[10][10]={0},u[10]={0}; for(i=0;i<=n;i++)/*-----列网(X向)------*/ { A=X0+i*CN1; for(j=0;j<=m;j++)/*------横网(y向)------*/ { B=Y0+j*CN2; for(k=0;k<10;k++) { u[k]=0; for(k0=0;k0<10;k0++)e[k][k0]=0; } for(k=0;k { hh=0; if(A==*(x+k)&&B==*(y+k)) { *(*(bb+i)+j)=*(z+k); hh=1;break; } x1=*(x+k);y1=*(y+k); x2=x1*x1;y2=y1*y1; cnum=(x1-A)*(x1-A)+(y1-B)*(y1-B); cnum=1/cnum; xt=cnum*x1;yt=cnum*y1; xxt=x2*cnum;yyt=y2*cnum;xyt=x1*yt; e[1][1]=e[1][1]+cnum;e[1][2]=e[1][2]+xt; e[1][3]=e[1][3]+yt;e[1][4]=e[1][4]+xyt; e[1][5]=e[1][5]+xxt;e[1][6]=e[1][6]+yyt; e[2][4]=e[2][4]+x2*yt;e[2][5]=e[2][5]+x2*xt; e[2][6]=e[2][6]+y2*xt;e[3][6]=e[3][6]+y2*yt; e[4][4]=e[4][4]+x2*yyt;e[4][5]=e[4][5]+x2*xyt; e[4][6]=e[4][6]+y2*xyt;e[5][5]=e[5][5]+x2*xxt; e[6][6]=e[6][6]+y2*yyt; zt=*(z+k)*cnum; u[1]=u[1]+zt;u[2]=u[2]+x1*zt; u[3]=u[3]+y1*zt;u[4]=u[4]+x1*y1*zt; u[5]=u[5]+x2*zt;u[6]=u[6]+y2*zt; } if(hh==1)continue; e[2][2]=e[1][5];e[2][3]=e[1][4];e[3][3]=e[1][6]; e[3][4]=e[2][6];e[3][5]=e[2][4];e[5][6]=e[4][4]; for(k=1;k<6;k++) for(k0=k+1;k0<7;k0++) e[k0][k]=e[k][k0]; for(k=1;k<7;k++)e[k][7]=u[k]; n0=6; for(k=1;k for(k0=k+1;k0 for(k1=k+1;k1 e[k0][k1]=e[k0][k1]-e[k0][k]*e[k][k1]/e[k][k]; u[n0]=e[n0][n0+1]/e[n0][n0]; for(k=n0-1;k>0;k--) { c=0; for(k0=k+1;k0 c=c+e[k][k0]*u[k0]; u[k]=(e[k][n0+1]-c)/e[k][k]; } *(*(bb+i)+j)=u[1]+A*(u[2]+B*u[4]+A*u[5])+B*(u[3]+B*u[6]); } } } /*=======================标记出网格每边上是否有一高程的等值点===============================*/ #include"hmain.h" floatflagx[MAXX][MAXY],flagy[MAXX][MAXY];/*------等值点标志-----*/ voidbzdzd(intw,int*n,int*m,float**bb) { inti,j; floatm1,m2; for(i=0;i<*n+1;i++)/*-----列网(X向)------*/ for(j=0;j<*m;j++) { m1=w-*(*(bb+i)+j);if(m1==0)m1=-0.01; m2=w-*(*(bb+i)+j+1);if(m2==0)m2=-0.01; if(m1*m2<0)flagy[i][j]=m1/(m1-m2); elseflagy[i][j]=-2; } for(i=0;i<*n;i++)/*------横网(y向)------*/ for(j=0;j<*m+1;j++) { m1=w-*(*(bb+i)+j);if(m1==0)m1=-0.01; m2=w-*(*(bb+i+1)+j);if(m2==0)m2=-0.01; if(m1*m2<0)flagx[i][j]=m1/(m1-m2); elseflagx[i][j]=-2; } } /*===============等值线追踪=================*/ #include"hmain.h" floatflagx[MAXX][MAXY],flagy[MAXX][MAXY]; intCN1,CN2,i1,i2,j1,j2; intzdzz(float*a1,float*b1,float*a2,float*b2) { intflag,i0,j0,s1; if(j2>j1)flag=1; else if(i2>i1)flag=2; else if(*b2==j2*CN2)flag=3; else flag=4; switch(flag) { case1: if(flagy[i2][j2]>0)/*----判断向左走----*/ { i0=i2;j0=j2;s1=0; } elseif(flagy[i2+1][j2]>0) { i0=i2+1;j0=j2;s1=0; } elseif(flagx[i2][j2+1]>0) { i0=i2;j0=j2+1;s1=1; } elsereturn1; break; case
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 各位 关心 源码 朋友 帮助 完善