图形的几何变换(平移,比例,定点比例)

#include <graphics.h>
#include <stdio.h>
typedef struct
{
  int data[20][3];
  int m,n;
}Matrix;

typedef struct
{
 int x;
 int y;
}POINT;

typedef struct
{
   POINT point[100];
   int num;
}Polygon;

Matrix multimatrix(Matrix a, Matrix b)
{
   Matrix c;
   int i,j,k;
   c.m=a.m;
   c.n=b.n;
   for(i=0;i<c.m;i++)
     for(j=0;j<c.n;j++)
      {
         c.data[i][j]=0;
         for(k=0;k<a.n;k++)
            c.data[i][j]+=a.data[i][k]*b.data[k][j];
      }  
  return c;
}

Polygon polymultimatrix(Polygon a, Matrix b)
{
  Matrix c,e;
  Polygon d;
  int i,j;
  /*   先将多边形转换为矩形   */
  c.m=a.num;
  c.n=3;
  for(i=0;i<c.m;i++)
  {
     c.data[i][0]=a.point[i].x;
     c.data[i][1]=a.point[i].y;
     c.data[i][2]=1;
   }
 /*   计算多边形表示的矩形和变换矩阵的乘积      */
  e=multimatrix(c,b);
  
 /*   将矩阵转换为多边形            */
  d.num=e.m;
  for(i=0;i<d.num;i++)
  {
    d.point[i].x=e.data[i][0];
    d.point[i].y=e.data[i][1];
  }


 return d;
}

void printmatrix(Matrix a)
{
    int i,j;
    for(i=0;i<a.m;i++)
     { 
       for(j=0;j<a.n;j++)
         printf("%d  ",a.data[i][j]);
       printf("\n");
     }
}

void draw(Polygon a)
{
  int i=0;
/*  
cleardevice();
 for(i=0;i<a.num;i++)
    printf("%d,%d",a.point[i].x,a.point[i].y);
getch();
printf("ok");
i=0;
*/
 while(i<=a.num-2)
{
 line(a.point[i].x,a.point[i].y,a.point[i+1].x,a.point[i+1].y);

 i=i+1;
}

line(a.point[a.num-1].x,a.point[a.num-1].y,a.point[0].x,a.point[0].y);

}

void initmatrix(Matrix * m1)
{
 int i,j;
 m1->m=3;m1->n=3;
 for(i=0;i<m1->m;i++)
    for(j=0;j<m1->n;j++)
      if(i==j)
       m1->data[i][j]=1;
      else
       m1->data[i][j]=0;
}

void pingyi(Polygon a, int tx, int ty)
{
 Matrix m1; Polygon p1;
 initmatrix(&m1);
 m1.data[2][0]=tx;
 m1.data[2][1]=ty;

 p1=polymultimatrix(a, m1);

 draw(p1);

}

void bili(Polygon a, int sx, int sy)
{

  Matrix m1; Polygon p1;
 initmatrix(&m1);
 m1.data[0][0]=sx;
 m1.data[1][1]=sy;

 p1=polymultimatrix(a, m1);

 draw(p1);


}

void gubili(Polygon a, int gx, int gy, int sx, int sy)
{
  Matrix m1,m2,m3,m4,m;Polygon p1;
 /*  m=m1*m2*m3         */
 initmatrix(&m1);
 m1.data[2][0]=-gx;
 m1.data[2][1]=-gy;
 
 initmatrix(&m2);
 m2.data[0][0]=sx;
 m2.data[1][1]=sy;

 initmatrix(&m3);
 m3.data[2][0]=gx;
 m3.data[2][1]=gy;

 m4=multimatrix(m1, m2);
 m4 =multimatrix(m4, m3);

 p1=polymultimatrix(a, m4);

 draw(p1);



}

void main()
{
  int i,j,gdriver=DETECT,gmode;
  Matrix m1,m2,m3;
  Polygon b;

initgraph(&gdriver,&gmode,"");
  b.num=4;
  for(i=0;i<b.num;i++)
    scanf("%d%d",&b.point[i].x,&b.point[i].y);
 
   draw(b);
   getch();
 pingyi(b,100,200);    

bili(b,2,3);gubili(b, 50, 50, 2, 3);

  getch();
    /*

getch();

closegraph();
*/

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值