请各位关心此源码的朋友帮助将其完善.docx

上传人:b****1 文档编号:2650003 上传时间:2023-05-04 格式:DOCX 页数:20 大小:20.22KB
下载 相关 举报
请各位关心此源码的朋友帮助将其完善.docx_第1页
第1页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第2页
第2页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第3页
第3页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第4页
第4页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第5页
第5页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第6页
第6页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第7页
第7页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第8页
第8页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第9页
第9页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第10页
第10页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第11页
第11页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第12页
第12页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第13页
第13页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第14页
第14页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第15页
第15页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第16页
第16页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第17页
第17页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第18页
第18页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第19页
第19页 / 共20页
请各位关心此源码的朋友帮助将其完善.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

请各位关心此源码的朋友帮助将其完善.docx

《请各位关心此源码的朋友帮助将其完善.docx》由会员分享,可在线阅读,更多相关《请各位关心此源码的朋友帮助将其完善.docx(20页珍藏版)》请在冰点文库上搜索。

请各位关心此源码的朋友帮助将其完善.docx

请各位关心此源码的朋友帮助将其完善

请各位关心此源码的朋友帮助将其完善,谢谢,希望大家共同进步。

等值线源码如下:

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2