#include #include #define maxsize 3 #define max_pts 3 struct point { float x; float y; }pts[3]; void set_identity_matrix(float a[3][3]); void rotation_matrix(float rm[3][3],float); void set_point_matrix(float pm[3][3], struct point); void multiply_matrix(float[3][3],float[3][3]); void scaling_matrix(float[3][3],float,float); void translation_matrix(float[3][3],float,float); void do_transformation(float,float,float,float,float,struct point*); void main() { struct point* p1;/* This stmt says that p1 can hold the address of a variable of type struct point */ int i;int gd = DETECT; int gm = DETECT; clrscr(); initgraph(&gd,&gm,"c:\\tc\\bgi"); pts[0].x = 150; pts[1].x = 250; pts[2].x = 200; pts[0].y = 150; pts[1].y = 100; pts[2].y = 200; for( i = 0; i < max_pts-1; i++) { line(pts[i].x,pts[i].y,pts[i+1].x,pts[i+1].y); } line(pts[i].x,pts[i].y,pts[0].x,pts[0].y); getch(); for( i = 0; i < max_pts; i++) { p1 = &pts[i]; do_transformation( 180, 0.5, 0.5,-200,-200,p1); do_transformation( 0, 1, 1, 200, 200,p1); } for ( i = 0; i < max_pts-1; i++) { line(pts[i].x,pts[i].y,pts[i+1].x,pts[i+1].y); } line(pts[i].x,pts[i].y,pts[0].x,pts[0].y); getch(); } void do_transformation(float theta, float sx, float sy, float tx, float ty, struct point* p1) { float tm[maxsize][maxsize],sm[maxsize][maxsize],rm[maxsize][maxsize],r[maxsize][maxsize],pm[maxsize][maxsize]; set_identity_matrix(tm); set_identity_matrix(sm); set_identity_matrix(rm); set_identity_matrix(r); set_identity_matrix(pm); rotation_matrix(rm,theta); scaling_matrix(sm,sx,sy); translation_matrix(tm,tx,ty); set_point_matrix(pm,(*p1)); matrixmultiplicationultiply_matrix(pm,r); multiply_matrix(tm,r); multiply_matrix(rm,r); multiply_matrix(sm,r); p1->x = r[0][0]; p1->y = r[1][0]; } void set_identity_matrix(float a[maxsize][maxsize]) { int i,j; for(i = 0; i < maxsize; i++) { for(j = 0; j < maxsize; j++) { a[i][j] = (i==j)? 1:0; } } } void rotation_matrix(float rm[maxsize][maxsize], float theta) { theta = M_PI * theta /180.0; rm[0][0] = cos(theta); rm[0][1] = -sin(theta); rm[1][0] = sin(theta); rm[1][1] = cos(theta); } void set_point_matrix(float pm[maxsize][maxsize],struct point p) { pm[0][0] = p.x; pm[1][0] = p.y; pm[2][0] = 1; } void multiply_matrix(float p[maxsize][maxsize],float q[maxsize][maxsize]) { float sum,temp[maxsize][maxsize]; int i,j,k; for( i = 0; i < maxsize; i++) { for ( j = 0; j < maxsize; j++) { sum = 0; for( k = 0 ; k < maxsize; k++) { sum += (p[i][k]) * (q[k][j]); } temp[i][j] = sum; } } for( i = 0; i < maxsize; i++) { for( j = 0; j < maxsize; j++) { q[i][j] = temp[i][j]; } } } void scaling_matrix(float sm[maxsize][maxsize],float sx, float sy) { sm[0][0] = sx; sm[1][1] = sy; } void translation_matrix(float tm[maxsize][maxsize], float tx, float ty) { tm[0][2] = tx; tm[1][2] = ty; }