hexiaoming
路人甲
路人甲
  • 注册日期2003-11-10
  • 发帖数57
  • QQ
  • 铜币160枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1840回复:2

哪位大侠有绘等值线的源码?

楼主#
更多 发布于:2004-09-11 18:12
喜欢0 评分0
hexiaoming
路人甲
路人甲
  • 注册日期2003-11-10
  • 发帖数57
  • QQ
  • 铜币160枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-09-17 11:38
<img src="images/post/smile/dvbbs/em08.gif" />
举报 回复(0) 喜欢(0)     评分
echo2003
点子王
点子王
  • 注册日期2003-07-28
  • 发帖数2453
  • QQ76947571
  • 铜币5473枚
  • 威望1点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
2楼#
发布于:2004-09-19 09:53
<P>下面的代码也是我在论坛内找的!</P><P>可能会对你有帮助 !</P><P><b>等值线源码
</b>#define MAXX 50
#define MAXY 50
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <graphics.h>
#include <string.h>



/*==================用趋势面加权最小二乘法计算网点高程制===================================*/
#include <conio.h>
#include <stdio.h>
#include <math.h>
int CN1,CN2,NP1; /*-----CN1,CN2为网点间距,NP1为测量点个数------*/
int X0,Y0; /*-----X0,Y0为网格起点坐标------*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)
{
int i,j,k,k0,k1,n0,hh=0;
double cnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c;
double e[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<NP1;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<n0;k++)
for(k0=k+1;k0<n0+1;k0++)
for(k1=k+1;k1<n0+2;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<n0+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"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2);
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)
{
float a1,b1,a2,b2,sin,xa[1000]={0},yb[1000]={0};
int k=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<n;;j2<m);
k=k/2;
if((xa[k+1]-xa[k-1])<0.3) sin=VERT_DIR; /*-----书写等值数字------*/
else if((yb[k+1]-yb[k-1])<0.3) sin=VERT_DIR;
else sin=(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"
/*读入数据*/
void rcvda(char *flname,float *x,float *y,float *z,int *n0);
/*划分网格并计算网点*/
void wzjs(int n,int m,float *x,float *y,float *z,float **bb);
/*计算等值点*/
void bzdzd(int w,int *n,int *m,float **bb);
/*绘制等值线*/
void xcln(int n,int m,float ratox,float ratoy,char *item);

/*-----------全局变量-------------------*/
int CN1,CN2,NP1;
int X0,Y0,kk,kk1;
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];

/*void mapmode();---------图形模式---------*/
/*==============================设置图形模式=======================================*/
void mapmode()
{
int gdriver=DETECT,gmode,errorcode; /*----自动探测------*/
errorcode=registerbgidriver(EGAVGA_driver);
if(errorcode<0)
{
printf("Graphics error:n%s",grapherrormsg(errorcode)); /*----报告注册错误-----*/
printf("nPress any key to halt:");
getch();
exit(1);
}
initgraph(;gdriver,;gmode,""); /*----初始化图形模式----*/
errorcode=graphresult();
if(errorcode!=grOK)
{
printf("Graphics error:n%s",grapherrormsg(errorcode));
printf("nPress any key to halt:");
getch();
exit(1);
}
}

/*=======================================主函数=========================================*/
main()
{
int i,j,n,m,w,pn1,pn2,pn3,n0=0,ccc;
float x[MAXX],x0[MAXX],y[MAXY],y0[MAXY],z[MAXX],ratox,ratoy;
float mx,my,mz,nx,ny,nz;
char flname[12],item[10],ch;
float bb1[MAXX][MAXY]={0};
float *bb[MAXX];
for(i=0;i<MAXX;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<n0;i++) /*--------确定数据范围-----*/

{
if(x<I>>mx) mx=x<I>;
else if(x<I><nx) nx=x<I>;
if(y<I>>my) my=x<I>;
else if(y<I><ny) ny=y<I>;
if(z<I>>mz) mz=z<I>;
else if(z<I><nz) nz=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<n0;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'
void rcvda(char *flname,float *x,float *y,float *z,int *n0)
{
FILE *stream;
if((stream=fopen(flname,"rt"))==NULL) /*------打开文件-------*/
{
printf("nCan't open %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 <conio.h>
#include <stdio.h>
#include <math.h>
int CN1,CN2,NP1; /*-----CN1,CN2为网点间距,NP1为测量点个数------*/
int X0,Y0; /*-----X0,Y0为网格起点坐标------*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)
{
int i,j,k,k0,k1,n0,hh=0;
double cnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c;
double e[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<NP1;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<n0;k++)
for(k0=k+1;k0<n0+1;k0++)
for(k1=k+1;k1<n0+2;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<n0+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"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];/*------等值点标志-----*/
void bzdzd(int w,int *n,int *m,float **bb)
{
int i,j;
float m1,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);
else flagy<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);
else flagx<I>[j]=-2;
}
}
/*===============等值线追踪=================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int CN1,CN2,i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2)
{
int flag,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)
{
case 1:
if(flagy[i2][j2]>0) /*----判断向左走----*/
{
i0=i2; j0=j2; s1=0;
}
else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;
}
else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;
}
else return 1;
break;
case 2:
if(flagx[i2][j2]>0) /*----判断向上走------*/
{
i0=i2; j0=j2; s1=1;
}
else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;
}
else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;
}
else return 1;
break;
case 3:
if(flagy[i2][j2-1]>0) /*----判断向右走----*/
{
i0=i2; j0=j2-1; s1=0;
}
else if(flagy[i2+1][j2-1]>0)
{
i0=i2+1; j0=j2-1; s1=0;
}
else if(flagx[i2][j2-1]>0)
{
i0=i2; j0=j2-1; s1=1;
}
else return 1;
break;
case 4:
if(flagx[i2-1][j2]>0) /*------判断向下走-----*/
{
i0=i2-1; j0=j2; s1=1;
}
else if(flagx[i2-1][j2+1]>0)
{
i0=i2-1; j0=j2+1; s1=1;
}
else if(flagy[i2-1][j2]>0)
{
i0=i2-1; j0=j2; s1=0;
}
else return 1;
break;
}
i1=i2; j1=j2; i2=i0; j2=j0;
*a1=*a2; *b1=*b2;
*a2=(i2+s1*flagx[i2][j2])*CN1;
*b2=(j2+(1-s1)*flagy[i2][j2])*CN2;
if(s1==0) flagy[i2][j2]=-2; /*----用过标志----*/
else flagx[i2][j2]=-2;
return 0;
}
/*=============================================*/
/*         绘制等值线          /
/*=============================================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2);
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)
{
float a1,b1,a2,b2,sin,xa[1000]={0},yb[1000]={0};
int k=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<n;;j2<m);
k=k/2;
if((xa[k+1]-xa[k-1])<0.3) sin=VERT_DIR; /*-----书写等值数字------*/
else if((yb[k+1]-yb[k-1])<0.3) sin=VERT_DIR;
else sin=(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"
int CN1,CN2;
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item);
int i1,i2,j1,j2;
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
void xcln(int n,int m,float ratox,float ratoy,char *item)
{
int w,w1;
float a0,b0;
for(w=0;w<n;w++) /*-------从下找起始点-------*/
if(flagx[w][0]>0)
{
i1=w; i2=w; j1=-1; j2=0;
a0=(i2+flagx[w][0])*CN1;
flagx[w][0]=-2; b0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=0;w<m;w++) /*---------从左找起始点---------*/
if(flagy[0][w]>0)
{
i1=-1; i2=0; j1=w; j2=w;
b0=(j2+flagy[0][w])*CN2;
flagy[0][w]=-2; a0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=0;w<n;w++) /*---------从上找起始点---------*/
if(flagx[w][m]>0)
{
i1=w; i2=w; j1=m; j2=m;
a0=(i2+flagx[i2][j2])*CN1;
b0=m*CN2; flagx[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=0;w<m;w++) /*---------从右找起始点---------*/
if(flagy[n][w]>0)
{
i1=n; i2=n; j1=w; j2=w;
b0=(j2+flagy[i2][j2])*CN2;
a0=n*CN1; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=1;w<n;w++) /*---------从网格内找起始点---------*/
for(w1=0;w1<m;w1++)
if(flagy[w][w1]>0)
{
i1=-1; i2=w; j1=w1; j2=w1;
a0=i2*CN1;
b0=(j2+flagy[i2][j2])*CN2; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
}





/*=======================标记出网格每边上是否有一高程的等值点===============================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];/*------等值点标志-----*/
void bzdzd(int w,int *n,int *m,float **bb)
{
int i,j;
float m1,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);
else flagy<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);
else flagx<I>[j]=-2;
}
}



/*==================从文件读入数据======================================*/
#include "hmain.h"
void rcvda(char *flname,float *x,float *y,float *z,int *n0)
{
FILE *stream;
if((stream=fopen(flname,"rt"))==NULL) /*------打开文件-------*/
{
printf("nCan't open %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 "hmain.h"
int CN1,CN2;
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item);
int i1,i2,j1,j2;
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
void xcln(int n,int m,float ratox,float ratoy,char *item)
{
int w,w1;
float a0,b0;
for(w=0;w<n;w++) /*-------从下找起始点-------*/
if(flagx[w][0]>0)
{
i1=w; i2=w; j1=-1; j2=0;
a0=(i2+flagx[w][0])*CN1;
flagx[w][0]=-2; b0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=0;w<m;w++) /*---------从左找起始点---------*/
if(flagy[0][w]>0)
{
i1=-1; i2=0; j1=w; j2=w;
b0=(j2+flagy[0][w])*CN2;
flagy[0][w]=-2; a0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=0;w<n;w++) /*---------从上找起始点---------*/
if(flagx[w][m]>0)
{
i1=w; i2=w; j1=m; j2=m;
a0=(i2+flagx[i2][j2])*CN1;
b0=m*CN2; flagx[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=0;w<m;w++) /*---------从右找起始点---------*/
if(flagy[n][w]>0)
{
i1=n; i2=n; j1=w; j2=w;
b0=(j2+flagy[i2][j2])*CN2;
a0=n*CN1; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
for(w=1;w<n;w++) /*---------从网格内找起始点---------*/
for(w1=0;w1<m;w1++)
if(flagy[w][w1]>0)
{
i1=-1; i2=w; j1=w1; j2=w1;
a0=i2*CN1;
b0=(j2+flagy[i2][j2])*CN2; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);
}
}




/*===============等值线追踪=================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int CN1,CN2,i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2)
{
int flag,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)
{
case 1:
if(flagy[i2][j2]>0) /*----判断向左走----*/
{
i0=i2; j0=j2; s1=0;
}
else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;
}
else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;
}
else return 1;
break;
case 2:
if(flagx[i2][j2]>0) /*----判断向上走------*/
{
i0=i2; j0=j2; s1=1;
}
else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;
}
else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;
}
else return 1;
break;
case 3:
if(flagy[i2][j2-1]>0) /*----判断向右走----*/
{
i0=i2; j0=j2-1; s1=0;
}
else if(flagy[i2+1][j2-1]>0)
{
i0=i2+1; j0=j2-1; s1=0;
}
else if(flagx[i2][j2-1]>0)
{
i0=i2; j0=j2-1; s1=1;
}
else return 1;
break;
case 4:
if(flagx[i2-1][j2]>0) /*------判断向下走-----*/
{
i0=i2-1; j0=j2; s1=1;
}
else if(flagx[i2-1][j2+1]>0)
{
i0=i2-1; j0=j2+1; s1=1;
}
else if(flagy[i2-1][j2]>0)
{
i0=i2-1; j0=j2; s1=0;
}
else return 1;
break;
}
i1=i2; j1=j2; i2=i0; j2=j0;
*a1=*a2; *b1=*b2;
*a2=(i2+s1*flagx[i2][j2])*CN1;
*b2=(j2+(1-s1)*flagy[i2][j2])*CN2;
if(s1==0) flagy[i2][j2]=-2; /*----用过标志----*/
else flagx[i2][j2]=-2;
return 0;
}
</I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></I></P>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部