#include "graphics.h"
#include "math.h"
#define PIN 3.1415926
double c[17][3];/* 为变换后的顶点矩阵 */
int x0=200,y0=240;
void multiply(double a[17][3],double b[3][3]);/* 矩阵乘法 */
void proportion(double m[17][3],double T[3][3],double c,double f);/* 比例变换函数 */
void move(double m[17][3],double T[3][3],int c,int f);/* 平移函数 */
void emove(double m[17][3],double T[3][3],double b,double d);/* 错切变换函数 */
void cirmove(double m[17][3],double T[3][3],double deg); /* 旋转变换函数 */
void smove(double m[17][3],double T[3][3],int a,int b,int d,int e);/* 对称变换函数 */
/************ main函数 **************/
main()
{
double a=2,e=2,b=0.1,d=0,deg=PIN;/*a,e用于比例变换
b,d用于错切变换 deg用于旋转变换*/
int x=100,y=0;/* c,f用于平移变换 */
double t;
float tt;int x1,y1;
double T[3][3]={{1,0,0},{0,1,0},{0,0,1}};/* 为变换矩阵 */
double m[17][3];/* 为变换前的顶点矩阵 */
int i,j;
int q[8];/* 画多变形所用数组 */
int r[17]={40,20,60,30,80,30,60,20,40,20,60,30,80,30,60,20,40};/*数组元素
表示顶点离中心距离*/
int gdriver=VGA,gmode=VGAHI;
initgraph(&gdriver,&gmode,"c:\\tc20\\bgi");
cleardevice();
setcolor(2);
setbkcolor(WHITE);
setfillstyle(9,2);
/* 给原始图形顶点矩阵赋值 */
t=2*PIN/16;
for(i=0;i<=16;i++){
m[i][0]=cos(t*i)*r[i]+x0;
m[i][1]=sin(t*i)*r[i]+y0;
m[i][2]=1;}
multiply(m,T);
draw(q,x0,y0);
/* 平移 */
for(i=0;i<=100;i++){
tt=x/100;
cleardevice();
move(m,T,tt,y);
draw(q,x0,y0);
delay(5000);}
/* 旋转变换 */
for(j=0;j<=100;j++){
tt=deg/100;
cleardevice();
cirmove(m,T,tt);
draw(q,x0,y0);
delay(5000);}
/* 比例变换 */
j=1;
while(j<=10){
cleardevice();
proportion(m,T,1.05,1.05);
draw(q,x0,y0);
delay(5000);
j++;
}
/* 错切变换 */
for(j=0;j<=10;j++){
cleardevice();
emove(m,T,0.03,0);
draw(q,x0,y0);
delay(10000);}
/* 对称变换 */
for(j=0;j<=100;j++){delay(2000);}
cleardevice();
a=e=0,b=d=1;/* 对a,e,d,b赋值作对于y=x的对称 */
smove(m,T,a,b,d,e);
draw(q,x0,y0);
for(j=0;j<=100;j++){delay(2000);}
/* 对称变换 */
for(j=0;j<=100;j++){delay(2000);}
cleardevice();
a=e=0,b=d=1;/* 对a,e,d,b赋值作对于y=x的对称 */
smove(m,T,a,b,d,e);
draw(q,x0,y0);
for(j=0;j<=100;j++){delay(2000);}
/* 错切变换 */
for(j=0;j<=10;j++){
cleardevice();
emove(m,T,-0.03,0);
draw(q,x0,y0);
delay(10000);}
/* 比例变换 */
a=2;
j=1;
while(j<=10){
cleardevice();
proportion(m,T,1/1.05,1/1.05);
draw(q,x0,y0);
delay(5000);
j++;
}
/* 平移 */
for(i=0;i<=100;i++){
tt=x/100;
cleardevice();
move(m,T,-tt,y);
draw(q,x0,y0);
delay(5000);}
/* 给原始图形顶点矩阵赋值 */
t=2*PIN/16;
for(i=0;i<=16;i++){
m[i][0]=cos(t*i)*r[i]+x0;
m[i][1]=sin(t*i)*r[i]+y0;
m[i][2]=1;}
multiply(m,T);
draw(q,x0,y0);
getch();/* 暂停 */
closegraph();/* 关闭图形模式 */
}
/************ end main **************/
/* 矩阵乘法 */
void multiply(double a[17][3],double b[3][3]){
int i,j,k;
for(i=0;i<17;i++)
for(j=0;j<3;j++)
{ c[i][j]=0;
for(k=0;k<3;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
}
/* 依据变换后的顶点矩阵画出变化后的图形 */
draw(int q[8],int x0,int y0){
int i;
for(i=0;i<=15;i++){
q[0]=x0,q[1]=y0,q[2]=c[i][0],q[3]=c[i][1];
q[4]=c[i+1][0],q[5]=c[i+1][1],q[6]=x0,q[7]=y0;
if (i%2==0) fillpoly(4,q);
else drawpoly(4,q);
}
}
/* 比例变换函数 */
void proportion(double m[17][3],double T[3][3],double a,double e){
int i,j;
T[0][0]=a,T[0][1]=0,T[0][2]=0;
T[1][0]=0,T[1][1]=e,T[1][2]=0;
T[2][0]=(1-a)*x0,T[2][1]=(1-e)*y0,T[2][2]=1;
multiply(m,T);
/* 顶点矩阵变换后将T赋给m矩阵,以便下次连续变换 */
for(i=0;i<=16;i++)
for(j=0;j<=2;j++)
{m[i][j]=c[i][j];}
}
/* 平移函数 */
void move(double m[17][3],double T[3][3],int x,int y){
double d[17][3]; int i,j;
T[0][0]=1,T[0][1]=0,T[0][2]=0;
T[1][0]=0,T[1][1]=1,T[1][2]=0;
T[2][0]=x,T[2][1]=y,T[2][2]=1;
multiply(m,T); x0=x0+x;y0=y0+y;
/* 顶点矩阵变换后将T赋给m矩阵,以便下次连续变换 */
for(i=0;i<=16;i++)
for(j=0;j<=2;j++)
{m[i][j]=c[i][j];}
}
/* 错切变换函数 */
void emove(double m[17][3],double T[3][3],double b,double d){
int i,j,t;
T[0][0]=1,T[0][1]=d,T[0][2]=0;
T[1][0]=b,T[1][1]=1,T[1][2]=0;
T[2][0]=0,T[2][1]=0,T[2][2]=1;
multiply(m,T);
t=x0+b*y0;
y0=d*x0+y0;
x0=t;
/* 顶点矩阵变换后将T赋给m矩阵,以便下次连续变换 */
for(i=0;i<=16;i++)
for(j=0;j<=2;j++)
{m[i][j]=c[i][j];}
}
/* 旋转变换函数 */
void cirmove(double m[17][3],double T[3][3],double deg){
int i,j;
T[0][0]=cos(deg),T[0][1]=sin(deg),T[0][2]=0;
T[1][0]=-sin(deg),T[1][1]=cos(deg),T[1][2]=0;
T[2][0]=(1-cos(deg))*x0+y0*sin(deg);
T[2][1]=(1-cos(deg))*y0-x0*sin(deg),T[2][2]=1;
multiply(m,T);
/* 顶点矩阵变换后将T赋给m矩阵,以便下次连续变换 */
for(i=0;i<=16;i++)
for(j=0;j<=2;j++)
{m[i][j]=c[i][j];}
}
/* 对称变换函数 */
void smove(double m[17][3],double T[3][3],int a,int b,int d,int e){
int i,j,t;
T[0][0]=a,T[0][1]=d,T[0][2]=0;
T[1][0]=b,T[1][1]=e,T[1][2]=0;
T[2][0]=0;T[2][1]=0,T[2][2]=1;
multiply(m,T);t=a*x0+b*y0,y0=d*x0+e*y0,x0=t;
/* 顶点矩阵变换后将T赋给m矩阵,以便下次连续变换 */
for(i=0;i<=16;i++)
for(j=0;j<=2;j++)
{m[i][j]=c[i][j];}
}