您的位置:首页 > 其它

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

2015-10-20 19:49 411 查看
#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();
*/

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: