Tuesday, May 25, 2010

Rotation of triangle

#include
#include
#include
#include
#include
#include
#include

void render(float,float,float, float,float,float,
float,float,float,float,float,float);
void initialize(void);
void firstpage(void);
void call_first(void);
float intensity,alpha,thita,tempy,tempz,tempx;
char ch='4';
char ch1='1';
char ch2='1';
int pts1[5][3];
float tx,ty,tz,d=.5;
void assign(float,float,float,float,float,float,float,float,float);
void scan_line(float,float,float,float,float,float,float,float,float);
void drawpyramid(float,float,float,float,float,float);
void call_assign(void);
void display(void);
void tranform(void);
void draw(void);
void drawscale(void);
float pts[5][3]={-100,0,0, 0,0,45, 100,0,0, 0,0,-45, 0,130,0};
float pts2[5][3]={228,273,0, 305,295,0, 428,273,0, 350,250,0
,328,143,0};
float pt[5][3]={-100,0,0, 0,0,45,100,0,0,0,0-45,0,130,0};

void main()
{
int i;
float sx,sy,sz=1;
struct palettetype pal;
int gd,gm;
detectgraph(&gd,&gm);
initgraph(&gd,&gm,"c:\tc\bgi");
getpalette(&pal);
firstpage();
for(i=16;i>0;i--)
setrgbpalette(pal.colors[i],0,4*i,0);


L1: display();

while(ch1!='4')
{
ch='2';
L2: call_assign();
clearviewport();
gotoxy(1,2);
cout<<"1. Translation"; cout<<"2. Rotation"; cout<<"3. Scaling "; cout<<"4. Back "; ch1=getch(); if(ch1=='4') { clearviewport(); goto L1; } if(ch1=='1') { clearviewport(); while(ch1!='4') { gotoxy(2,2); cout<<"a. X+"; cout<<" b. X-"; cout<<" c. Y+"; cout<<" d. Y- "; cout<<" e. Z+"; cout<<" f. Z-"; cout<<" g. Back"; call_assign(); ch1=getch(); clearviewport(); if(ch1=='g') goto L2; if(ch1=='a') tx=5; if(ch1=='b') tx=-5; if(ch1=='c') ty=5; if(ch1=='d') ty=-5; if(ch1=='e') tz=10; if(ch1=='f') tz=-10; for(i=0;i<5;i++) { pts[i][0]+=tx; pts[i][1]+=ty; pts[i][1]+=tz; } } } if(ch1=='3') { clearviewport(); cout<<"Enter sx:"; cin>>sx;
cout<<"Enter sy:"; cin>>sy;
for(i=0;i<5;i++) { pts2[i][0]=abs(pts2[i][0]*sx+200*(1-sx)); pts2[i][1]=abs(pts2[i][1]*sy+200*(1-sy)); } drawscale(); getch(); } if(ch1=='2') { while(ch2!='4') { clearviewport(); gotoxy(1,2); cout<<"1.X-axis rotation"; gotoxy(1,3); cout<<"2.Y-axis rotation"; gotoxy(1,4); cout<<"3.Z-axis rotation"; gotoxy(1,5); cout<<"4.Back"; ch2=getch(); if(ch2=='4') break; if(ch2=='1') { alpha=0; while(alpha<360) { alpha=alpha+10; thita=(alpha*3.142)/180; initialize(); for(i=0;i<5;i++) { tempy=(pts1[i][1]*cos(thita)+pts1[i][2]*sin(thita)); pts1[i][2]=(pts1[i][1]*sin(thita)-pts1[i][2]*cos(thita)); pts1[i][1]=tempy; } clearviewport(); draw(); delay(100); } } if(ch2=='2') { alpha=0; while(alpha<360) { alpha=alpha+10; thita=(alpha*3.142)/180; initialize(); for(i=0;i<5;i++) { tempz=(pts1[i][2]*cos(thita)+pts1[i][0]*sin(thita)); pts1[i][0]=(pts1[i][2]*sin(thita)-pts1[i][0]*cos(thita)); pts1[i][2]=tempz; } clearviewport(); draw(); delay(100); } } if(ch2=='3') { alpha=0; while(alpha<360) { alpha=alpha+10; thita=(alpha*3.142)/180; initialize(); for(i=0;i<5;i++) { tempx=(pts1[i][0]*cos(thita)-pts1[i][1]*sin(thita)); pts1[i][1]=(pts1[i][0]*sin(thita)+pts1[i][1]*cos(thita)); pts1[i][0]=tempx; } clearviewport(); draw(); delay(100); clearviewport(); draw(); } } } } } closegraph(); restorecrtmode(); } void initialize() { pts1[0][0]=-100; pts1[0][1]=-65; pts1[0][2]=0; pts1[1][0]=0; pts1[1][1]=-65; pts1[1][2]=-45; pts1[2][0]=100; pts1[2][1]=-65; pts1[2][2]=0; pts1[3][0]=0; pts1[3][1]=-65; pts1[3][2]=45; pts1[4][0]=0; pts1[4][1]=65; pts1[4][2]=0; } void firstpage() { clearviewport(); setcolor(WHITE); settextstyle(2,HORIZ_DIR,5); outtextxy(250,15,"A Project on"); setcolor(GREEN); settextstyle(3,HORIZ_DIR,4); outtextxy(170,25,"PYRAMID MODELING"); rectangle(300,120,580,320); rectangle(295,115,585,325); setcolor(6); settextstyle(4,HORIZ_DIR,3); outtextxy(50,100, "OPTIONS"); settextstyle(3,HORIZ_DIR,1); setcolor(11); outtextxy(20,150,"1. VISIBLE SURFACE DETECTION"); outtextxy(20,190,"2. SURFACE RENDERING"); outtextxy(20,230,"3. TRANSFORMATIONS"); outtextxy(20,270,"4. WIREFRAME DISPLAY"); outtextxy(20,310,"5. EXIT"); call_first(); //display(); setcolor(WHITE); getch(); cleardevice(); clearviewport(); } void display(void) { while(ch!='3') { clearviewport(); gotoxy(2,2); cout<<"1. Visible Surface Detection "; gotoxy(2,3); cout<<"2. Surface Rendering"; gotoxy(2,4); cout<<"3. Transformations"; gotoxy(2,5); cout<<"4. Wireframe Display"; gotoxy(2,6); cout<<"5. Exit "; call_assign(); ch=getch(); if(ch=='5') exit(0); clearviewport(); if(ch=='3') break; } } void call_assign(void) { assign(pts[0][0],pts[0][1],pts[0][2],pts[1][0],pts[1][1],pts[1][2],pts[4][ 0],pts[4][1],pts[4][2]); assign(pts[1][0],pts[1][1],pts[1][2],pts[2][0],pts[2][1],pts[2][2],pts[4][ 0],pts[4][1],pts[4][2]); assign(pts[2][0],pts[2][1],pts[2][2],pts[3][0],pts[3][1],pts[3][2],pts[4][ 0],pts[4][1],pts[4][2]); assign(pts[0][0],pts[0][1],pts[0][2],pts[4][0],pts[4][1],pts[4][2],pts[3][ 0],pts[3][1],pts[3][2]); } void call_first(void) { assign(pt[0][0],pt[0][1],pt[0][2],pt[1][0],pt[1][1],pt[1][2],pt[4][0],pt[4 ][1],pt[4][2]); assign(pt[1][0],pt[1][1],pt[1][2],pt[2][0],pt[2][1],pt[2][2],pt[4][0],pt[4 ][1],pt[4][2]); assign(pt[2][0],pt[2][1],pt[2][2],pt[3][0],pt[3][1],pt[3][2],pt[4][0],pt[4 ][1],pt[4][2]); assign(pt[0][0],pt[0][1],pt[0][2],pt[4][0],pt[4][1],pt[4][2],pt[3][0],pt[3 ][1],pt[3][2]); } void drawpyramid(float x1,float y1,float x2,float y2,float x3,float y3) { line(x1,y1,x2,y2); line(x2,y2,x3,y3); line(x3,y3,x1,y1); } void assign(float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3) { float A,B,C; float temp,An,Bn,Cn,X,Y,Z; float Xl=-6,Yl=10,Zl=50; float templ; A=y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2); B=z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2); C=x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2); temp=sqrt(A*A+B*B+C*C); templ=sqrt(Xl*Xl+Yl*Yl+Zl*Zl); X=(float)Xl/templ; Y=(float)Yl/templ; Z=(float)Zl/templ; An=(A/temp); Bn=(float)B/temp; Cn=(float)C/temp; intensity=15*(An*X+Bn*Y+Cn*Z); if (intensity<0) intensity=0; if (intensity>15)
intensity=15;

z1=55-z1;
x1=x1+300+(d*z1); y1=300-y1-(d*z1);
z2=55-z2;
x2=x2+300+(d*z2); y2=300-y2-(d*z2);
z3=55-z3;
x3=x3+300+(d*z3); y3=300-y3-(d*z3);

if(ch=='1')
{ if(intensity==0) return;
drawpyramid(x1,y1,x2,y2,x3,y3);
return;
}
if(ch=='3')
exit(0);

if(ch=='4')
drawpyramid(x1,y1,x2,y2,x3,y3);

if(ch=='2')
{
if(intensity==0) return;
if ((y1>y2) && (y1>y3) && (y2>y3))
scan_line(x1,y1,z1,x2,y2,z2,x3,y3,z3);

if ((y1>y2) && (y1>y3) && (y3>y2))
scan_line(x1,y1,z1,x3,y3,z3,x2,y2,z2);

if ((y2>y1) && (y2>y3) && (y1>y3))
scan_line(x2,y2,z2,x1,y1,z1,x3,y3,z3);

if ((y2>y1) && (y2>y3) && (y3>y1))
scan_line(x2,y2,z2,x3,y3,z3,x1,y1,z1);

if ((y3>y1) && (y3>y2) && (y1>y2))
scan_line(x3,y3,z3,x1,y1,z1,x2,y2,z2);

if ((y3>y1) && (y3>y2) && (y2>y1))
scan_line(x3,y3,z3,x2,y2,z2,x1,y1,z1);
}
}

void scan_line(float x1,float y1,float z1,float x2,float y2,float
z2,float
x3,float y3,float z3)
{
int i;
float tempx,tempx1,tempy;
float m1,m2,thita,alpha;
alpha=0;

tempx=x1; tempx1=x1; tempy=y1;
m1=(y2-y1)/(x2-x1);
m2=(y3-y1)/(x3-x1);

while((int)tempy!=(int)y2)
{ alpha=alpha+5;
thita=(alpha*3.14/180);
tempx=tempx-1/m1;
tempx1=tempx1-1/m2;
if(tempx {
for(i=0;i+tempx<=tempx1;i++)
{
putpixel(tempx+i,tempy,intensity);
}
}
else
if (tempx1 { for(i=0;i+tempx1<=tempx;i++)
{
putpixel(tempx1+i,tempy,intensity);
}
}
tempy--;
}

m1=(float)(y3-y2)/(x3-x2);

while((int)tempy!=(int)y3)
{
tempx=tempx-1/m1;
tempx1=tempx1-1/m2;
if(tempx {
for(i=0;i+tempx<=tempx1;i++)
putpixel(tempx+i,tempy,intensity);
}
else
{
for(i=0;i+tempx1<=tempx;i++)
putpixel(tempx1+i,tempy,intensity);
}
tempy--;
}
}
void draw()
{ int i;
for(i=0;i<5;i++)
{
pts1[i][2]=50+pts1[i][2]+50;
pts1[i][0]=pts1[i][0]+300+.5*pts1[i][2];
pts1[i][1]=200+65-pts1[i][1]-.5*pts1[i][2];
}
line(pts1[0][0],pts1[0][1],pts1[1][0],pts1[1][1]);
line(pts1[1][0],pts1[1][1],pts1[2][0],pts1[2][1]);
line(pts1[2][0],pts1[2][1],pts1[3][0],pts1[3][1]);
line(pts1[3][0],pts1[3][1],pts1[0][0],pts1[0][1]);
line(pts1[0][0],pts1[0][1],pts1[4][0],pts1[4][1]);
line(pts1[1][0],pts1[1][1],pts1[4][0],pts1[4][1]);
line(pts1[2][0],pts1[2][1],pts1[4][0],pts1[4][1]);
line(pts1[3][0],pts1[3][1],pts1[4][0],pts1[4][1]);
}
void drawscale()
{
line(pts2[0][0],pts2[0][1],pts2[1][0],pts2[1][1]);
line(pts2[1][0],pts2[1][1],pts2[2][0],pts2[2][1]);
line(pts2[2][0],pts2[2][1],pts2[3][0],pts2[3][1]);
line(pts2[3][0],pts2[3][1],pts2[0][0],pts2[0][1]);
line(pts2[0][0],pts2[0][1],pts2[4][0],pts2[4][1]);
line(pts2[1][0],pts2[1][1],pts2[4][0],pts2[4][1]);
line(pts2[2][0],pts2[2][1],pts2[4][0],pts2[4][1]);
line(pts2[3][0],pts2[3][1],pts2[4][0],pts2[4][1]);
}

No comments:

Post a Comment