Thursday, October 28, 2010

Computer graphics lab// Transformation

// TRANSFORMATION

#include"stdio.h"
#include"math.h"
#include"graphics.h"

#define ROUND(a) ((int) (a+0.5))
void putpixelby(int x, int y, int col,int);
void paracircle(int xcen, int ycen, int r,int);
void circle1(int x, int y, int xcen, int ycen,int);
void rotation(int sx, int sy, float ang);
void translate(int tx, int ty);
void scaling(int sx, int sy, int px, int py);
void ddaline(int xa, int ya, int xb, int yb);
float transfm[3][3] = { {1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0} } ;
float translt[3][3] = { {1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0} } ;
float rotate[3][3] = { {1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0} } ;
float scale[3][3] = { {1.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0} } ;
///////////////////////////////////////////////////////////////////////////
void main()
{
int cho1,cho2,xc,yc,r,n,i,x[10],y[10],u[10],v[10],tx,ty,sx,sy,px,py,temp;
float ang;
int gd = DETECT,gm;
initgraph(&gd,&gm,"C:\\TC\\BGI");
printf("\n ******");
printf("\n*********************** MENU *************************");
printf("\n ******");
printf("\n1.CIRCLE\n2.POLYGON\nENTER YOUR CHOICE: ");
scanf("%d",&cho1);
switch(cho1)
{
case 1:
printf("\nENTER X & Y COORD. OF CENTER & RADIUS: ");
scanf("%d %d %d",&xc,&yc,&r);
break;
case 2:
printf("\nENTER NO. OF SIDES OF THE POLYGON: ");
scanf("%d",&n);
for(i = 0; i < n ; i++)
{
printf("\nENTER X & Y COORD. OF SIDE %d : ",i+1);
scanf("%d %d",&x[i],&y[i]);
u[i] = x[i]; v[i] = y[i];
}
x[n] = x[0]; y[n] = y[0];
u[n] = x[0]; v[n] = y[0];

for(i = 0; i < n ; i++)
{ ddaline(x[i],y[i],x[i+1],y[i+1]); delay(500); }
break;
default:
printf("\nINVALID CHOICE.....");
}
//////////////////////////////////////////////////////
do{
printf("\n ******");
printf("\n*********************** MENU *************************");
printf("\n ******");
printf("\n1.TRANSLATE\n2.ROTATE\n3.SACLE\n4.EXIT\n\nENTER YOUR CHOICE: ");
scanf("%d",&cho2);
switch(cho2)
{
case 1:
printf("\nENTER X & Y COORD OF POINT OF TRANSLATION: ");
scanf("%d %d",&tx,&ty);
translate(tx,ty);
break;
case 2:
printf("\nENTER ANGLES IN DEGREE: ");
scanf("%f",&ang);
printf("\nENTER COORD. X & Y OF PIVOT POINT: ");
scanf("%d %d",&px,&py);
rotation(px,py,(ang*3.14)/180);
break;
case 3:
printf("\nENTER SCALING FACTOR X & Y: ");
scanf("%d %d",&sx,&sy);
printf("\nENTER COORD. X & Y OF PIVOT POINT: ");
scanf("%d %d",&px,&py);
scaling(sx,sy,px,py);
break;
case 4:
break;
default:
printf("\nINVALID CHOICE.....");
}
}while(cho2 == 1 || cho2 == 2 || cho2 == 3);
///////////////////////////////////////////////
cleardevice();
getch();
ddaline( (getmaxx()/2),0,(getmaxx()/2),(getmaxy()) );
ddaline( 0,(getmaxy()/2),(getmaxx()),(getmaxy()/2) );
if(cho1 == 2)
{
for(i = 0; i < n; i++)
{ //TO SVAE THE VALUE OF x[i]
temp = transfm[0][0]*x[i] + transfm[0][1]*y[i] + transfm[0][2] ;
y[i] = transfm[1][0]*x[i] + transfm[1][1]*y[i] + transfm[1][2] ;

x[i] = temp; //RESTORE THE VALUE OF x[i]
}
x[n] = x[0]; y[n] = y[0];
for(i = 0; i < n; i++)
{
v[i] = (-1) * v[i];
y[i] = (-1) * y[i];
}
x[n] = x[0]; y[n] = y[0];
u[n] = u[0]; v[n] = v[0];
for(i = 0; i < n; i++)
{
u[i] = (getmaxx()/2) + u[i];
v[i] = (getmaxy()/2) + v[i];
x[i] = (getmaxx()/2) + x[i];
y[i] = (getmaxy()/2) + y[i];
}
x[n] = x[0]; y[n] = y[0];
u[n] = u[0]; v[n] = v[0];
for(i = 0; i < n ; i++)
{ ddaline(u[i],v[i],u[i+1],v[i+1]); delay(500); }
for(i = 0; i < n ; i++)
{ ddaline(x[i],y[i],x[i+1],y[i+1]); delay(500); }
}
///////////////////////////////////////////////////////////////////
else if(cho1 == 1)
{
paracircle(xc,yc,r,1);
paracircle(xc,yc,r,2);
}
getch();
closegraph();
}
///////////////////////////////////////////////////////////////////////////
void translate(int tx, int ty)
{
float temp[3][3];
int i,j;
translt[0][2] = tx;
translt[1][2] = ty;
for(i = 0; i < 3; i++)
for(j = 0; j < 3 ; j++)
temp[i][j] = transfm[i][0]*translt[0][j] + transfm[i][1]*translt[1][j] + transfm[i][2]*translt[2][j];
for(i = 0; i < 3; i++)
for(j = 0; j < 3 ; j++)
transfm[i][j] = temp[i][j];
}
///////////////////////////////////////////////////////////////////////////
void rotation(int px, int py, float ang)
{
float temp[3][3];
int i,j;
float c,s,p,q;
c = cos(ang); s = sin(ang);
p = px*(1 - c) + py * s;
q = py*(1 - c) - px * s;
rotate[0][0] = c;
rotate[0][1] = (-1) * s;
rotate[0][2] = p;
rotate[1][0] = s;
rotate[1][1] = c;
rotate[1][2] = q;
for(i = 0; i < 3; i++)
for(j = 0; j < 3 ; j++)
temp[i][j] = transfm[i][0]*rotate[0][j] + transfm[i][1]*rotate[1][j] + transfm[i][2]*rotate[2][j];
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
transfm[i][j] = temp[i][j];
}
///////////////////////////////////////////////////////////////////////////
void scaling(int sx, int sy, int px, int py)
{
float temp[3][3];
int i,j;
scale[0][0] = sx;
scale[0][2] = px*(1 - sx);
scale[1][1] = sy;
scale[1][2] = py*(1 - sy);
for(i = 0; i < 3; i++)
for(j = 0; j < 3 ; j++)
temp[i][j] = transfm[i][0]*scale[0][j] + transfm[i][1]*scale[1][j] + transfm[i][2]*scale[2][j];
for(i = 0; i < 3; i++)
for(j = 0; j < 3 ; j++)
transfm[i][j] = temp[i][j];
}
///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
void ddaline(int xa, int ya, int xb, int yb)
{
int dx = xb - xa, dy = yb - ya, steps, k ;
float xinc,yinc,x = xa,y = ya;
if (abs (dx) > abs (dy) )
steps = abs(dx);
else
steps = abs(dy);
xinc = dx/(float) steps;
yinc = dy/(float) steps;
putpixel( ROUND(x), ROUND(y),RED);
for(k = 0; k < steps ; k++)
{
x += xinc;
y += yinc;
putpixel( ROUND(x), ROUND(y),BROWN);
}
}
////////////////////////////////////////////////////////////////////////////
void paracircle(int xcen, int ycen, int r, int position)
{
float x = 0;
float y;
int theta = 0;
//circle1((int)x,(int)y,xcen,ycen,position);
for(; theta <= 45; theta++)
{
x = r * cos( (theta * 3.14) / 180);
y = r * sin( (theta * 3.14) / 180);
circle1(x, y, xcen, ycen,position);
}
putpixel(xcen,ycen,RED);
}
///////////////////////////////////////////////////////////////////////////
void circle1(int x, int y, int xcen, int ycen,int position)
{
putpixelby(xcen + x, ycen + y, BROWN,position);
putpixelby(xcen - x, ycen + y, BROWN,position);
putpixelby(xcen + x, ycen - y, BROWN,position);
putpixelby(xcen - x, ycen - y, BROWN,position);
putpixelby(xcen + y, ycen + x, BROWN,position);
putpixelby(xcen - y, ycen + x, BROWN,position);
putpixelby(xcen + y, ycen - x, BROWN,position);
putpixelby(xcen - y, ycen - x, BROWN,position);
}
//////////////////////////////////////////////////////////////////////////
void putpixelby(int x, int y, int col,int position)
{
float temp;
if(position == 2)
{
temp = transfm[0][0]*x + transfm[0][1]*y + transfm[0][2] ;
y = transfm[1][0]*x + transfm[1][1]*y + transfm[1][2] ;
x = temp;
}
y = (-1) * y;
x = (getmaxx()/2) + x;
y = (getmaxy()/2) + y;
putpixel(x,y,col);
}
///////////////////////////////////////////////////////////////////////////

No comments: