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]);
}
}
}