正文

C图形学中的错切演示程序2007-12-14 22:15:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tld5yj/31426.html

分享到:

此程序用到两个文件,一个是被调用程序affine.c,另一个是主程序cuoqie.c,在运行前请注意自己设置好图形驱动程序的路径。

affine.c如下:

double sin(),cos();
double xmax=639.0,ymax=399.0;
double f[3][3],xx,yy;

scx(xj)
double xj;
{int x;
 x=(int)(xj+xmax/2);
 return(x);
}

scy(yj)
double yj;
{int y;
 y=(int)(ymax-(yj+(ymax/2)));
 return(y);
}

parallel(dx,dy)
double dx,dy;
{f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;
 f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;
 f[2][0]=dx;f[2][1]=dy;f[2][2]=1.0;
}

rotate(theta)
double theta;
{double th;
 th=theta/180*3.1415927;
 f[0][0]=cos(th);f[0][1]=sin(th);f[0][2]=0.0;f[1][0]=-sin(th);
 f[1][1]=cos(th);f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

scale(s)
double s;
{f[0][0]=s;f[0][1]=0.0;f[0][2]=0.0;
 f[1][0]=0.0;f[1][1]=s;f[1][2]=0.0;
 f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

taisho_x()
{f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;
 f[1][0]=0.0;f[1][1]=-1;f[1][2]=0.0;
 f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

taisho_y()
{f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;
 f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;
 f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

taisho_o()
{f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;
 f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;
 f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

taisho_xy()
{f[0][0]=0.0;f[0][1]=0.0;f[0][2]=0.0;
 f[1][0]=1.0;f[1][1]=0.0;f[1][2]=0.0;
 f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

taishl(aa,bb,cc)
double aa,bb,cc;
{float y,p;
 y=bb*bb-aa*aa;
 p=aa*aa+bb*bb;
 f[0][0]=-y/p;f[2][1]=-2*aa*bb/p;f[2][2]=0.0;
 f[1][0]=-2*aa*bb/p;f[1][1]=-y/p;f[1][2]=0.0;
 f[2][0]=-2*aa*cc/p;f[2][1]=-2*bb*cc/p;f[2][2]=1.0;
}

axis()
{line(scx(0),scy(-ymax/2),scx(0),scy(ymax/2));
 line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0));
}

tuoq(a,b)
double a,b;
{f[0][0]=1.0;f[0][1]=b;f[0][2]=1.0;
 f[1][0]=a;f[1][1]=1.0;f[1][2]=0.0;
 f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;
}

affinex(x,y,d)
double x,y,d;
{xx=x*f[0][0]+y*f[1][0]+d*f[2][0];
 return(xx);
}

affiney(x,y,d)
double x,y,d;
{yy=x*f[0][1]+y*f[1][1]+d*f[2][1];
 return(yy);
}

cuoqie.c如下:

#include<graphics.h>
#include"affine.c"

main()
{int driver=DETECT,mode;
 static double x1[]={0.0,10.0,100.0,110.0,0.0};
 static double y1[]={0.0,50.0,50.0,-10.0,0.0};
 static double x2[5],y2[5];
 int i;
 double x,xx,yy;
 registerbgidriver(EGAVGA_driver);
 initgraph(&driver,&mode,"");
 axis();
 for(x=-300;x<=200;x=x+10)
 {parallel(x,x/2);
  for(i=0;i<=4;i++)
  {x2[i]=affinex(x1[i],y1[i],1.0);
   y2[i]=affiney(x1[i],y1[i],1.0)/2;
  }
  for(i=0;i<=3;i++)
  {line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));
  }
 }
 getch();
 closegraph();
}

运行后将出现坐标系和一系列错切的四边形。

阅读(2780) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册