例程1

#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;

  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();

}

例程2

#include <graphics.h>

#include "affine.c"

main()

{

  int graphdriver=DETECT,graphmode;

  static double x1[]={0.0,10.0,100.0,110.0,0.0};

  static double y1[]={0.0,50.0,50.0,0.0,0.0};

  static double x2[5],y2[5];

  int i;

  double r,xx,yy;

  initgraph(&graphdriver,&graphmode,"");

  for (r=0;r<=360;r+=10)

  {

    rotate(r);

    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();

}

例程3

#include <graphics.h>

#include <math.h>

#include "affine.c"

main()

{

  int driver=DETECT,mode;

  static double x1[]={-20.0,0.0,30.0,10.0,-20.0};

  static double y1[]={0.0,17.0,-10.0,-20.0,0.0};

  static double x2[5],y2[5];

  int i;

  double r;

  initgraph(&driver,&mode,"");

  axis();

  for (r=0;r<=360;r+=10)

  {

    rotate(r);

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

    {

      x2[i]=affinex(x1[i],y1[i],1.0);

      y2[i]=affiney(x1[i],y1[i],1.0);

    }

    parallel(cos(r/180*3.1415926)*150.0,sin(r/180*3.1415926)*100.0);

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

    {

      x2[i]=affinex(x2[i],y2[i],1.0);

      y2[i]=affiney(x2[i],y2[i],1.0);

      line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));

    }

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

    {

      line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));

    }

  }

  getch();

  closegraph();

}

其中用到的affine.c

double sin(),cos();

double xmax=639.0,ymax=399.0;

double f[3][3],xx,yy;

scx(xj)      //将实际的x坐标转换为屏幕坐标

double xj;

{

  int x;

  x=(int)(xj+xmax/2);

  return x;

}

scy(yi)     //将实际的y坐标转换为屏幕坐标

double yi;

{

  int y;

  y=ymax-(int)(yi+(ymax/2));

  return y;

}

parallel(dx,dy)   //完成平移变换,dx,dy分别为x轴方向和y轴方向的平移量

double dx,dy;

{

  f[0][0]=1.0;  f[0][1]=0.0;   f[0][2]=0.0;

  f[1][0]=0.0;  f[0][1]=1.0;   f[1][2]=0.0;

  f[2][0]=dx;   f[2][1]=dy;    f[2][2]=1.0;

}

rotate(theta)    //以原点为中心的旋转变换,旋转角度为theta

double theta;

{

  double th;

  th=theta/180*3.1415926;

  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[1][2]=0.0;

  f[2][0]=0.0;  f[2][1]=0.0;  f[2][2]=1.0;

}

scale(s)

double s;   //比例变换,比例系数为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()   //对称变换,对称轴为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.0;   f[1][2]=0.0;

  f[2][0]=0.0;   f[2][1]=0.0;   f[2][2]=1.0;

}

taisho_y()    //对称变换,对称轴为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]=1.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()    //对称变换,对称轴为x=y

{

  f[0][0]=0.0;  f[0][1]=1.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)    //对称变换,对称轴为任意直线

{

  float y,p;

  y=bb*bb-aa*aa;

  p=aa*aa+bb*bb;

  f[0][0]=-y/p; f[0][1]=-2*aa*bb/p;    f[0][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()     //坐标变换为屏幕中心为原点,座和上分别为x轴和y轴的正方向

{

  line(scx(0),scy(-ymax/2),scx(0),scy(ymax/2));

  line(scx(-xmax),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]=0.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);

}