《网格序列法实现等值线生成》实验报告.docx

上传人:b****3 文档编号:10465206 上传时间:2023-05-26 格式:DOCX 页数:13 大小:138.57KB
下载 相关 举报
《网格序列法实现等值线生成》实验报告.docx_第1页
第1页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第2页
第2页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第3页
第3页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第4页
第4页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第5页
第5页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第6页
第6页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第7页
第7页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第8页
第8页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第9页
第9页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第10页
第10页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第11页
第11页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第12页
第12页 / 共13页
《网格序列法实现等值线生成》实验报告.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《网格序列法实现等值线生成》实验报告.docx

《《网格序列法实现等值线生成》实验报告.docx》由会员分享,可在线阅读,更多相关《《网格序列法实现等值线生成》实验报告.docx(13页珍藏版)》请在冰点文库上搜索。

《网格序列法实现等值线生成》实验报告.docx

《网格序列法实现等值线生成》实验报告

《科学计算可视化》实验报告

 

实验题目:

采用网格序列法实现等值线生成

 

姓名

学号

专业

班级

 

计算机科学与技术学院

2015年10月29日

一、实验内容

第一问:

首先生成4*4的网格,在网格顶点进行数组赋值,

利用网格序列法实现等值线生成,等值为4.5,结果用红色标记。

第二问:

三角剖分法生成上述等值线

二、主要技术及实现

(1)利用网格序列法生成等值线,算法如下:

1.逐行处理网格中的每一单元,对每一单元执行下述操作;

2.求出单元顶点的Fmin和Fmax,

Fmin=min(F00,F01,F10,F11)

Fmax=max(F00,F01,F10,F11)

3.对于在Fmin和Fmax之间的每一等线值Ft,执行下列操作求出等值线段;

1将单元每一顶点与Ft比较,生成记录“+”结点和“-”结点的两个集合{F+}和{F-}

2如|F+|=1或|F-|=1,求出该点附近的交点P,Q,连接PQ,成为等值线段。

3如|F+|=2:

如果两个“+”点相邻,求出两个相对的交点,生成等值线PQ;如果两个“+”点相对,求出四个交点P,Q,R,S,求出中点值Fmid,如果F00与Fmid状态相同,则连接PS,QR,否则,连接PQ,RS。

(2)利用三角剖分法生成上述等值线

1.逐行处理网格中的每一个单元,对每个单元cell执行下述操作。

2.求出中心点函数Fmid的值,用平均值方法。

3.计算cell四个顶点的Fmax和Fmin.

4.For每个在Fmin和Fmax之间的FtDo

①IfF00<=Ft

(AXt,AYt)=lint(F00,F01)/lint为线性插值函数

等值线从(AXt,AYt)开始;

IfFmid

(BXt,BYt)=lint(F01,Fmid)

连接(BXt,BYt)到等值线上;

IfF11<=FtThen

(BXt,BYt)=lint(F01,F11)

连接(BXt,BYt)到等值线上;

Else

(BXt,BYt)=lint(Fmid,F11)

IfF01<=FtThen

(BXt,BYt)=lint(F10,F11)

连接(BXt,BYt)到等值线上;

Else

(BXt,BYt)=lint(Fmid,F10)

连接(BXt,BYt)到等值线上;

(BXt,BYt)=lint(F00,F10)

连接(BXt,BYt)到等值线上;

ENDIf

Else

(BXt,BYt)=lint(F00,Fmid)

连接(BXt,BYt)到等值线上;

②ElseIfF01<=Ft

③ElseIfF11<=Ft

④ElseIfF10<=Ft

ElseIf

三、实验结果

在4*4的网格中生成了红色(等线值为4.5)的等值线,网格法生成

三角剖析法生成

四、实验分析和总结

实验过程中,出现了许多问题,有粗心的原因,比如少写了取余符号,导致结果不对,也有知识欠缺导致的没有思路,经过认真地学习,解决了以上问题。

实验过程中,耐心和细心是很重要的。

在算法方面,要注意等值点坐标的公式,很容易出错,还要考虑情况全面一些,以及考虑马鞍点的思路,这是我在实验中的体会。

五、核心源代码

首先将各个点以数组的形式存储

value[0][0]=0;value[0][1]=1;value[0][2]=3;value[0][3]=2;value[0][4]=1;

value[1][0]=1;value[1][1]=3;value[1][2]=7;value[1][3]=7;value[1][4]=2;

value[2][0]=1;value[2][1]=6;value[2][2]=9;value[2][3]=8;value[2][4]=3;

value[3][0]=3;value[3][1]=6;value[3][2]=7;value[3][3]=6;value[3][4]=4;

value[4][0]=2;value[4][1]=3;value[4][2]=3;value[4][3]=2;value[4][4]=3;

网格法

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

{

vertex[0]=value[i][j];//将网格顶点的值先存入vertex[]中

vertex[1]=value[i][j+1];

vertex[2]=value[i+1][j+1];

vertex[3]=value[i+1][j];

count=0;

if((vertex[0]-4.5)*(vertex[1]-4.5)<=0)

{

a=x+dis*j+dis*(vertex[0]-4.5)/(vertex[0]-vertex[1]);//横边从左顶点计算4.5位置

b=y+dis*i;

count++;

pointx[count]=a;

pointy[count]=b;

}

if((vertex[1]-4.5)*(vertex[2]-4.5)<=0)

{

a=x+dis*(j+1);

b=y+dis*i+dis*(vertex[1]-4.5)/(vertex[1]-vertex[2]);//竖边从上顶点计算4.5位置

count++;

pointx[count]=a;

pointy[count]=b;

}

if((vertex[2]-4.5)*(vertex[3]-4.5)<=0)

{

a=x+dis*j+dis*(vertex[3]-4.5)/(vertex[3]-vertex[2]);//横边从又顶点计算4.5位置,要用v[3]-v[2]

b=y+dis*(i+1);

count++;

pointx[count]=a;

pointy[count]=b;

}

if((vertex[3]-4.5)*(vertex[0]-4.5)<=0)

{

a=x+dis*j;

b=y+dis*i+dis*(vertex[0]-4.5)/(vertex[0]-vertex[3]);//竖边从上顶点计算4.5位置,用v[0]-v[3]

count++;

pointx[count]=a;

pointy[count]=b;

}

if(count==0)continue;

if(count==1)//当等值点只有一个的时候标记出该点

{

pDC->MoveTo(int(pointx[1]),int(pointy[1]));

pDC->LineTo(int(pointx[1]),int(pointy[1]));

}

if(count==2)//当等值点有两个时的情况

{

pDC->MoveTo(int(pointx[1]),int(pointy[1]));

pDC->LineTo(int(pointx[2]),int(pointy[2]));

}

if(count==3)//当等值点有三个时的情况

{

pDC->MoveTo(int(pointx[1]),int(pointy[1]));

pDC->LineTo(int(pointx[2]),int(pointy[2]));

pDC->MoveTo(int(pointx[2]),int(pointy[2]));

pDC->LineTo(int(pointx[3]),int(pointy[3]));

}

if(count==4)//当等值点有四个时的情况

{

doublecenter=(vertex[0]+vertex[1]+vertex[2]+vertex[3])/4;//求出网格中心点的值

intflag;

for(intt=0;t<2;t++)

if(vertex[t]>center)//判断哪个顶点的值比中心点大

{

flag=t;

break;

}

if(flag==0)//flag为0表示左上顶点值比中心点大,则分别连接左上顶点两侧等值点和右下顶点两侧等值点

{

pDC->MoveTo(int(pointx[1]),int(pointy[1]));

pDC->LineTo(int(pointx[4]),int(pointy[4]));

pDC->MoveTo(int(pointx[2]),int(pointy[2]));

pDC->LineTo(int(pointx[3]),int(pointy[3]));

}

if(flag==1)//flag为1表示右上顶点值比中心点大,则分别连接右上顶点两侧等值点和左下顶点两侧等值点

{

pDC->MoveTo(int(pointx[1]),int(pointy[1]));

pDC->LineTo(int(pointx[2]),int(pointy[2]));

pDC->MoveTo(int(pointx[3]),int(pointy[3]));

pDC->LineTo(int(pointx[4]),int(pointy[4]));

}

}

}

}

 

三角剖分法:

for(inti=0;i<4;i++){

for(intj=0;j<4;j++){

m[i][j]=0.25*(value[i][j]+value[i][j+1]+value[i+1][j+1]+value[i+1][j]);

count=0;//第一个

/*

计算坐标太麻烦,所以我把5个点的坐标先求了出来,下面用的时候比较方便

*/

doublex1=x+dis*i,y1=y+dis*j;

doublex2=x+dis*(i+1),y2=y+dis*j;

doublex3=x+dis*(i+1),y3=y+dis*(j+1);

doublex4=x+dis*i,y4=y+dis*(j+1);

doublemx=(x1+x2)/2,my=(y1+y4)/2;

if((value[i][j]-4.5)*(value[i][j+1]-4.5)<0){//1,左边

count++;

pointx[count]=calx(x1,x4,value[i][j],value[i][j+1],4.5);

pointy[count]=calx(y1,y4,value[i][j],value[i][j+1],4.5);

}

if((value[i][j]-4.5)*(m[i][j]-4.5)<0){//1,右边

count++;

pointx[count]=calx(x1,mx,value[i][j],m[i][j],4.5);

pointy[count]=calx(y1,my,value[i][j],m[i][j],4.5);

}

if((value[i][j+1]-4.5)*(m[i][j]-4.5)<0){//1,下

count++;

pointx[count]=calx(x4,mx,value[i][j+1],m[i][j],4.5);

pointy[count]=calx(y4,my,value[i][j+1],m[i][j],4.5);

}

if(m[i][j]-4.5==0){

count++;

pointx[count]=mx;

pointy[count]=my;

}

//if(count==0)continue;//划线~~

if(count==2){

pDC->MoveTo(pointx[1],pointy[1]);

pDC->LineTo(pointx[2],pointy[2]);

}

count=0;//计算第二个,count重新赋值

if((value[i][j]-4.5)*(value[i+1][j]-4.5)<0){//2,上边

count++;

pointx[count]=calx(x1,x2,value[i][j],value[i+1][j],4.5);

pointy[count]=calx(y1,y2,value[i][j],value[i+1][j],4.5);

}

if((value[i][j]-4.5)*(m[i][j]-4.5)<0){//2,左边

count++;

pointx[count]=calx(x1,mx,value[i][j],m[i][j],4.5);

pointy[count]=calx(y1,my,value[i][j],m[i][j],4.5);

}

if((value[i+1][j]-4.5)*(m[i][j]-4.5)<0){//2,右

count++;

pointx[count]=calx(x2,mx,value[i+1][j],m[i][j],4.5);

pointy[count]=calx(y2,my,value[i+1][j],m[i][j],4.5);

}

if(m[i][j]-4.5==0){

count++;

pointx[count]=mx;

pointy[count]=my;

}

//if(count==0)continue;//划线~~

if(count==2){

pDC->MoveTo(pointx[2],pointy[2]);

pDC->LineTo(pointx[1],pointy[1]);

}

count=0;//3

if((value[i+1][j]-4.5)*(m[i][j]-4.5)<0){//3,上

count++;

pointx[count]=calx(x2,mx,value[i+1][j],m[i][j],4.5);

pointy[count]=calx(y2,my,value[i+1][j],m[i][j],4.5);

}

if((value[i+1][j]-4.5)*(value[i+1][j+1]-4.5)<0){//3,右边

count++;

pointx[count]=calx(x2,x3,value[i+1][j],value[i+1][j+1],4.5);

pointy[count]=calx(y2,y3,value[i+1][j],value[i+1][j+1],4.5);

}

if((value[i+1][j+1]-4.5)*(m[i][j]-4.5)<0){//3,下边

count++;

pointx[count]=calx(x3,mx,value[i+1][j+1],m[i][j],4.5);

pointy[count]=calx(y3,my,value[i+1][j+1],m[i][j],4.5);

}

if(m[i][j]-4.5==0){

count++;

pointx[count]=mx;

pointy[count]=my;

}

//if(count==0)continue;//划线~~

if(count==2){

pDC->MoveTo(pointx[1],pointy[1]);

pDC->LineTo(pointx[2],pointy[2]);

}

count=0;//4

if((value[i][j+1]-4.5)*(m[i][j]-4.5)<0){//4zuo

count++;

pointx[count]=calx(x4,mx,value[i][j+1],m[i][j],4.5);

pointy[count]=calx(y4,my,value[i][j+1],m[i][j],4.5);

}

if((value[i+1][j+1]-4.5)*(m[i][j]-4.5)<0){//4,右边

count++;

pointx[count]=calx(x3,mx,value[i+1][j+1],m[i][j],4.5);

pointy[count]=calx(y3,my,value[i+1][j+1],m[i][j],4.5);

}

if((value[i][j+1]-4.5)*(value[i+1][j+1]-4.5)<0){//4,下边

count++;

pointx[count]=calx(x3,x4,value[i+1][j+1],value[i][j+1],4.5);

pointy[count]=calx(y3,y4,value[i+1][j+1],value[i][j+1],4.5);

}

if(m[i][j]-4.5==0){

count++;

pointx[count]=mx;

pointy[count]=my;

}

//if(count==0)continue;//划线~~

if(count==2){

pDC->MoveTo(pointx[2],pointy[2]);

pDC->LineTo(pointx[1],pointy[1]);

}

}

}

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

当前位置:首页 > 经管营销 > 经济市场

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

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