#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();
*/
}
图形的几何变换(平移,比例,定点比例)
最新推荐文章于 2023-07-09 21:21:26 发布