Graphics Lab File - After Mid Sem

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Graphics Lab File - After Mid Sem as PDF for free.

More details

  • Words: 2,285
  • Pages: 21
After Midsemester Examinati ons 1

Table of Contents

After ........................................................................................................................... 1 Mid-semester Examinations........................................................................................1 Table of Contents....................................................................................................... 2 Program 1: Three-Dimensional Transformations........................................................3 Program 2: Point Clipping Algorithm...........................................................................8 Program 3: Cohen Sutherland Line Clipping Algorithm...............................................9 Program 4: Liang Barsky Line Clipping Algorithm.....................................................11 Program 5: Sutherland Hodgeman Polygon Clipping Algorithm................................13 Program 6: Perspective Projections..........................................................................17 Program 7: Parallel Projections.................................................................................19

2

Program 1: Three-Dimensional Transformations /********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: 3D-Transformations *********************************************************************/ #include<stdio.h> #include #include #include<math.h> #include<stdlib.h> int xp[2],yp[2],z; void display(); void translate(); void scaling(); void rotation(); void matrixmul(int [4][4]); void main() { int gd=DETECT,gm; int ch,i; initgraph(&gd,&gm,"c:\\tc\\bgi"); for(i=0;i<2;i++) { printf("\nEnter X-coordinate of vertex %d : ",i+1); scanf("%d",&xp[i]); printf("\nEnter Y-coordinate of vertex %d : ",i+1); scanf("%d",&yp[i]); } printf("\nEnter The Z-axis For 3d Figure : "); scanf("%d",&z); clrscr(); cleardevice(); display(xp,yp); getche(); do { printf("----- MENU -----"); printf("\n1.TRANSLATION."); printf("\t2.SCALING."); printf("\n3.ROTATION."); printf("\t4.EXIT."); printf("\nEnter Your Choice : "); scanf("%d",&ch); 3

clrscr(); cleardevice(); display(xp,yp); switch(ch) { case 1 : translate(); break; case 2 : scaling(); break; case 3 : rotation(); break; case 4 : exit(0); default: outtextxy(1,66,"-PLEASE SELECT THE RIGHT OPTION-"); } } while(ch!=4); getch(); closegraph(); } void translate() { int p[4][4]; int tx,ty,tz,i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) p[i][j]=(i==j); printf("\nEnter The Translating Factor tx : "); scanf("%d",&tx); printf("\nEnter The Translating Factor ty : "); scanf("%d",&ty); printf("\nEnter The Translating Factor tz : "); scanf("%d",&tz); clrscr(); cleardevice(); display(); p[0][3]=tx; p[1][3]=ty; p[2][3]=tz; matrixmul(p); } void scaling() { int p[4][4]; int sx,sy,sz,i,j; 4

for(i=0;i<4;i++) for(j=0;j<4;j++) p[i][j]=(i==j); printf("\nEnter The Scaling Factor sx : "); scanf("%d",&sx); printf("\nEnter The Scaling Factor sy : "); scanf("%d",&sy); printf("\nEnter The Scaling Factor sz : "); scanf("%d",&sz); if(sx==0) sx=1; if(sy==0) sy=1; if(sz==0) sz=1; clrscr(); cleardevice(); p[0][0]=sx; p[1][1]=sy; p[2][2]=sz; p[3][3]=1; matrixmul(p); } void rotation() { float res[4][1],p[4][4],t[4][1]; int ang,i,j,k,l,rch; float rad; for(i=0;i<4;i++) for(j=0;j<4;j++) p[i][j]=(i==j); printf("\nEnter The Rotating Angle : "); scanf("%d",?); rad=ang*0.0174; printf("\nChoose the axis of roration "); printf("\n1.X-axis"); printf("\n2.Y-axis"); printf("\n3.Z-axis"); printf("\nEnter Your Choice : "); scanf("%d",&rch); switch(rch) { case 1 : p[1][1]=cos(rad); p[1][2]=(-1)*sin(rad); p[2][1]=sin(rad); p[2][2]=cos(rad); break; case 2 : p[0][0]=cos(rad); 5

p[2][0]=(-1)*sin(rad); p[0][2]=sin(rad); p[2][2]=cos(rad); break; case 3 : p[0][0]=cos(rad); p[0][1]=(-1)*sin(rad); p[1][0]=sin(rad); p[1][1]=cos(rad); break; default : printf("\nInvalid Choice !"); } clrscr(); cleardevice(); for(i=0;i<2;i++) { t[0][0]=xp[i]; t[1][0]=yp[i]; t[2][0]=z; t[3][0]=1; for(j=0;j<4;j++) { for(k=0;k<1;k++) { res[j][k]=0; for(l=0;l<4;l++) { res[j][k]=res[j][k]+(p[j][l]*t[l][k]); } } } xp[i]=res[0][0]; yp[i]=res[1][0]; z=res[2][0]; } display(xp,yp); } void display(int xp[2],int yp[2]) { int x3,y3,x4,y4; line(getmaxx()/2,0,getmaxx()/2,getmaxy()); line(0,getmaxy()/2,getmaxx(),getmaxy()/2); outtextxy(getmaxx()/2+5,getmaxy()/2+5,"(0,0)"); outtextxy(getmaxx()-50,getmaxy()/2+10,"X-Axis"); outtextxy(getmaxx()/2+10,20,"Y-Axis"); outtextxy(10,getmaxy()/2+10,"X'-Axis"); outtextxy(getmaxx()/2+10,getmaxy()-20,"Y'-Axis"); 6

rectangle(getmaxx()/2+xp[0],getmaxy()/2-yp[0],getmaxx()/2+xp[1],getmaxy()/2-yp[1]); if(z>=xp[0]) { x3=z+xp[0]; y3=z+yp[0]; x4=z+xp[1]; y4=z+yp[1]; rectangle(getmaxx()/2+x3,getmaxy()/2-y3,getmaxx()/2+x4,getmaxy()/2-y4); line(getmaxx()/2+xp[0],getmaxy()/2-yp[0],getmaxx()/2+x3,getmaxy()/2-y3); line(getmaxx()/2+xp[1],getmaxy()/2-yp[1],getmaxx()/2+x4,getmaxy()/2-y4); line(getmaxx()/2+xp[0],getmaxy()/2-yp[1],getmaxx()/2+x3,getmaxy()/2-y4); line(getmaxx()/2+xp[1],getmaxy()/2-yp[0],getmaxx()/2+x4,getmaxy()/2-y3); } else { x3=xp[0]-z; y3=yp[0]-z; x4=xp[1]-z; y4=yp[1]-z; rectangle(getmaxx()/2+x3,getmaxy()/2-y3,getmaxx()/2+x4,getmaxy()/2-y4); line(getmaxx()/2+xp[0],getmaxy()/2-yp[0],getmaxx()/2+x3,getmaxy()/2-y3); line(getmaxx()/2+xp[1],getmaxy()/2-yp[1],getmaxx()/2+x4,getmaxy()/2-y4); line(getmaxx()/2+xp[0],getmaxy()/2-yp[1],getmaxx()/2+x3,getmaxy()/2-y4); line(getmaxx()/2+xp[1],getmaxy()/2-yp[0],getmaxx()/2+x4,getmaxy()/2-y3); } } void matrixmul(int a[4][4]) { float res[4][1],b[4][1]; int i,j,k,l; for(i=0;i<2;i++) { b[0][0]=xp[i]; b[1][0]=yp[i]; b[2][0]=z; b[3][0]=1; for(j=0;j<4;j++) { for(k=0;k<1;k++) { res[j][k]=0; for(l=0;l<4;l++) { res[j][k]=res[j][k]+(a[j][l]*b[l][k]); } } } xp[i]=res[0][0]; yp[i]=res[1][0]; } 7

z=res[2][0]; display(xp,yp); }

Program 2: Point Clipping Algorithm /********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: Point Clipping *********************************************************************/ #include #include #include class pointclip { private: int x[10],y[10],a[10],b[10],c[10],d[10],n; public: void drawrect(); void getpixeldata(); void result(); }clip; void pointclip::drawrect() { int gd=DETECT,gm; initgraph(&gd,&gm,”c:\\tc\\bgi”); cout<<”Enter the coordinates of rectangle”; cin>>x[1]>>y[1]>>x[2]>>y[2]; rectangle(x[1],y[1],x[2],y[2]); getch(); } void pointclip::getpixeldata() { cout<<”Enter the total nymber of pixels want to plot:\n:”; cin>>n; for(int i=1;i<=n;i++) { cout<<”Enter the pixel position(x,y)”<<<”;”; cin>>a[i]>>b[i]; putpixel(a[i],b[i],15); } } void pointclip::result() { cleardevice(); cout<<”Result for the point clipping program:”; 8

rectangle(x[1],y[1],x[2],y[2]); for(int i=1;i<=n;i++) if((a[i]<=x[2]&&a[i]>=x[i]&&b[i]<=y[2]&&b[i]>=y[i])) putpixel(a[i],b[i],15); getch(); closegraph(); } void main() { clip.drawrect(); clip.getpixeldata(); clip.result(); }

Program 3: Cohen Sutherland Line Clipping Algorithm /********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: Cohen-Sutherland *********************************************************************/ #include<stdio.h> #include #include typedef unsigned int outcode; enum { TOP=0x1, BOTTOM=0x2, RIGHT=0x4, LEFT=0x8 }; void lineclip(x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax ) float x0,y0,x1,y1,xwmin,ywmin,xwmax,ywmax; { int gd,gm; outcode code0,code1,codeout; int accept = 0, done=0; code0 = calcode(x0,y0,xwmin,ywmin,xwmax,ywmax); code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax); do{ if(!(code0 | code1)) { accept =1 ; done =1; } else if(code0 & code1) done = 1; else { float x,y; codeout = code0 ? code0 : code1; if(codeout & TOP) 9

{ x = x0 + (x1-x0)*(ywmax-y0)/(y1-y0); y = ywmax; } else if( codeout & BOTTOM) { x = x0 + (x1-x0)*(ywmin-y0)/(y1-y0); y = ywmin; } else if ( codeout & RIGHT) { y = y0+(y1-y0)*(xwmax-x0)/(x1-x0); x = xwmax; } else { y = y0 + (y1-y0)*(xwmin-x0)/(x1-x0); x = xwmin; } if( codeout == code0) { x0 = x; y0 = y; code0=calcode(x0,y0,xwmin,ywmin,xwmax,ywmax); } else { x1 = x; y1 = y; code1 = calcode(x1,y1,xwmin,ywmin,xwmax,ywmax); } } } while( done == 0); if(accept) line(x0,y0,x1,y1); rectangle(xwmin,ywmin,xwmax,ywmax); getch(); } int calcode (x,y,xwmin,ywmin,xwmax,ywmax) float x,y,xwmin,ywmin,xwmax,ywmax; { int code =0; if(y> ywmax) code |=TOP; else if( y xwmax) code |= RIGHT; else if ( x< xwmin) code |= LEFT; 10

return(code); } main() { float x2,y2,x1,y1,xwmin,ywmin,xwmax,ywmax; int gd=DETECT,gm; clrscr(); initgraph(&gd,&gm,"c:\\tc\\bgi"); printf("\n\n\tEnter the co-ordinates of Line :"); printf("\n\n\tX1 Y1 : "); scanf("%f %f",&x1,&y1); printf("\n\n\tX2 Y2 : "); scanf("%f %f",&x2,&y2); printf("\n\tEnter the co_ordinates of window :\n "); printf("\n\txwmin , ywmin : "); scanf("%f %f",&xwmin,&ywmin); printf("\n\txwmax , ywmax : "); scanf("%f %f",&xwmax,&ywmax); clrscr(); line(x1,y1,x2,y2); rectangle(xwmin,ywmin,xwmax,ywmax); getch(); clrscr(); lineclip(x1,y1,x2,y2,xwmin,ywmin,xwmax,ywmax ); getch(); closegraph(); }

Program 4: Liang Barsky Line Clipping Algorithm /********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: Liang-Barsky Line Clipping Algorithm *********************************************************************/ #include #include<dos.h> #include #include<stdlib.h> void main() { int gd, gm ; int x1 , y1 , x2 , y2 ; int wxmin,wymin,wxmax, wymax ; float u1 = 0.0,u2 = 1.0 ; int p1 , q1 , p2 , q2 , p3 , q3 , p4 ,q4 ; float r1 , r2 , r3 , r4 ; int x11 , y11 , x22 , y22 ; 11

clrscr(); printf("Enter the windows left xmin , top boundry ymin\n"); scanf("%d%d",&wxmin,&wymin); printf("Enter the windows right xmax ,bottom boundry ymax\n"); scanf("%d%d",&wxmax,&wymax); printf("Enter line x1 , y1 co-ordinate\n"); scanf("%d%d",&x1,&y1); printf("Enter line x2 , y2 co-ordinate\n"); scanf("%d%d",&x2,&y2); printf("liang barsky express these 4 inequalities using lpk<=qpk\n"); p1 = -(x2 - x1 ); q1 = x1 - wxmin ; p2 = ( x2 - x1 ) ; q2 = wxmax - x1 ; p3 = - ( y2 - y1 ) ; q3 = y1 - wymin ; p4 = ( y2 - y1 ) ; q4 = wymax - y1 ; printf("p1=0 line is parallel to left clipping\n"); printf("p2=0 line is parallel to right clipping\n"); printf("p3=0 line is parallel to bottom clipping\n"); printf("p4=0 line is parallel to top clipping\n"); if( ( ( p1 == 0.0 ) && ( q1 < 0.0 ) ) || ( ( p2 == 0.0 ) && ( q2 < 0.0 ) ) || ( ( p3 == 0.0 ) && ( q3 < 0.0 ) ) || ( ( p4 == 0.0 ) && ( q4 < 0.0 ) ) ) { printf("Line is rejected\n"); getch(); detectgraph(&gd,&gm); initgraph(&gd,&gm,"c:\\tc\\bgi"); setcolor(RED); rectangle(wxmin,wymax,wxmax,wymin); setcolor(BLUE); line(x1,y1,x2,y2); getch(); setcolor(WHITE); line(x1,y1,x2,y2); getch(); } else { if( p1 != 0.0 ) { r1 =(float) q1 /p1 ; if( p1 < 0 ) u1 = max(r1 , u1 ); else u2 = min(r1 , u2 ); } if( p2 != 0.0 ) { r2 = (float ) q2 /p2 ; if( p2 < 0 ) u1 = max(r2 , u1 ); else u2 = min(r2 , u2 ); 12

} if( p3 != 0.0 ) { r3 = (float )q3 /p3 ; if( p3 < 0 ) u1 = max(r3 , u1 ); else u2 = min(r3 , u2 ); } if( p4 != 0.0 ) { r4 = (float )q4 /p4 ; if( p4 < 0 ) u1 = max(r4 , u1 ); else u2 = min(r4 , u2 ); } if( u1 > u2 ) printf("line rejected\n"); else { x11 = x1 + u1 * ( x2 - x1 ) ; y11 = y1 + u1 * ( y2 - y1 ) ; x22 = x1 + u2 * ( x2 - x1 ); y22 = y1 + u2 * ( y2 - y1 ); printf("Original line cordinates\n"); printf("x1 = %d , y1 = %d, x2 = %d, y2 = %d\n",x1,y1,x2,y2); printf("Windows coordiante are \n"); printf("wxmin = %d, wymin = %d,wxmax = %d , wymax = %d ",wxmin,wymin,wxmax,wymax); printf("New coordinates are \n"); printf("x1 = %d, y1 = %d,x2 = %d , y2 = %d\n",x11,y11,x22,y22); detectgraph(&gd,&gm); initgraph(&gd,&gm,"C:\\TC\\BGI"); setcolor(2); rectangle(wxmin,wymax,wxmax,wymin); setcolor(1); line(x1,y1,x2,y2); getch(); setcolor(0); line(x1,y1,x2,y2); setcolor(3); line(x11,y11,x22,y22); getch(); }}}

Program 5: Sutherland Hodgeman Polygon Clipping Algorithm 13

/********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: Sutherland Hodgeman *********************************************************************/ #include #include #include #define MAXVERTICES 11 #define MAXCORDINATES ((MAXVERTICES * 2) + 1) int corArray[MAXCORDINATES],nVertices=0; int corArray2[MAXCORDINATES],nVertices2=0; int wx_min,wx_max,wy_min,wy_max; enum boundry {left=0,right,bottom,top}; void initialize() { int gDriver = DETECT,gMode; initgraph(&gDriver,&gMode,"C:\\tc\\bgi"); cleardevice(); } void inputPolygon() { cout<<"\nEnter No of Vertices (Min. 3,Max. "<<MAXVERTICES<<"): "; cin>>nVertices; if(nVertices < 3 || nVertices > MAXVERTICES) nVertices = 3; for(int i=0;i>corArray[2*i]>>corArray[(2*i)+1]; } corArray[2*(nVertices)] = corArray[0]; corArray[(2*(nVertices))+1] = corArray[1]; } void samplePolygon() { int midx = getmaxx()/2; int midy = getmaxy()/2; int polygon_vertices[]={ midx,midy-125, midx-200,midy-50, midx-75,midy-50, midx-75,midy+200, midx+75,midy+200, midx+75,midy-50, midx+200,midy-50, midx,midy-125}; nVertices = 8; 14

for(int i = 0;i wx_min); case right: return (x < wx_max); case bottom: return (y < wy_min); case top: return (y > wy_max); } return 0; } int calcCondition(int x1,int y1,int x2,int y2,boundry b) { int stat1 = insideWindow(x1,y1,b); int stat2 = insideWindow(x2,y2,b); if(!stat1 && stat2) return 1; if(stat1 && stat2) return 2; if(stat1 && !stat2) return 3; if(!stat1 && !stat2) return 4; return 0; //never executed } void solveIntersection(boundry b,int x1,int y1,int x2,int y2,int &x,int &y) { float m = 0; if(x2 != x1) m = ((float)(y2-y1)/(float)(x2-x1)); switch(b) { case left: x = wx_min; y = y1 + m * (x - x1); break; case right: x = wx_max; y = y1 + m * (x - x1); break; case bottom: y = wy_min; if(x1 != x2) x = x1 + (float)(1/m) * (y - y1); else x = x1; 15

break; case top: y = wy_max; if(x1 != x2) x = x1 + (float)(1/m) * (y - y1); else x = x1; break; } } void addNewPoint(int x,int y) { corArray2[(2 * nVertices2)] = x; corArray2[(2 * nVertices2)+1] = y; nVertices2++; } void clipPolygon() { int j,k; boundry i; for(i=left;i<=top;i++) { nVertices2 = 0; for(j=0;j
} addNewPoint(corArray2[0],corArray2[1]); //update corArray and nvertices... nVertices = nVertices2; for(j=0;j>wx_min>>wx_max>>wy_min>>wy_max; rectangle(wx_min,wy_max,wx_max,wy_min); drawpoly(nVertices+1,corArray); getch(); clipPolygon(); clrscr(); cleardevice(); rectangle(wx_min,wy_max,wx_max,wy_min); drawpoly(nVertices+1,corArray); getch(); }

Program 6: Perspective Projections /********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: Perspective Projection *********************************************************************/ #include<stdio.h> #include<math.h> #include main() { int x1,y1,x2,y2,gd,gm; int ymax,a[4][8]; float par[4][4],b[4][8]; 17

int i,j,k,m,n,p; int xp, yp, zp, x, y, z; a[0][0] = 100; a[1][0] = 100; a[2][0] = -100; a[0][1] = 200; a[1][1] = 100; a[2][1] = -100; a[0][2] = 200; a[1][2] = 200; a[2][2] = -100; a[0][3] = 100; a[1][3] = 200; a[2][3] = -100; a[0][4] = 100; a[1][4] = 100; a[2][4] = -200; a[0][5] = 200; a[1][5] = 100; a[2][5] = -200; a[0][6] = 200; a[1][6] = 200; a[2][6] = -200; a[0][7] = 100; a[1][7] = 200; a[2][7] = -200; detectgraph(&gd,&gm); initgraph(&gd,&gm, "c:\\tc\\bgi"); ymax = getmaxy(); xp = 300; yp = 320; zp = 100; for(j=0; j<8; j++) { x = a[0][j]; y = a[1][j]; z = a[2][j]; b[0][j] = xp - ( (float)( x - xp )/(z - zp)) * (zp); b[1][j] = yp - ( (float)( y - yp )/(z - zp)) * (zp); } /*- front plane display -*/ for(j=0;j<3;j++) { x1=(int) b[0][j]; y1=(int) b[1][j]; x2=(int) b[0][j+1]; y2=(int) b[1][j+1]; line( x1,ymax-y1,x2,ymax-y2); } x1=(int) b[0][3]; y1=(int) b[1][3]; x2=(int) b[0][0]; y2=(int) b[1][0]; line( x1, ymax-y1, x2, ymax-y2); /*- back plane display -*/ setcolor(11); for(j=4;j<7;j++) { x1=(int) b[0][j]; y1=(int) b[1][j]; x2=(int) b[0][j+1]; y2=(int) b[1][j+1]; line( x1, ymax-y1, x2, ymax-y2); } x1=(int) b[0][7]; y1=(int) b[1][7]; x2=(int) b[0][4]; y2=(int) b[1][4]; line( x1, ymax-y1, x2, ymax-y2); setcolor(7); for(i=0;i<4;i++) { 18

x1=(int) b[0][i]; y1=(int) b[1][i]; x2=(int) b[0][4+i]; y2=(int) b[1][4+i]; line( x1, ymax-y1, x2, ymax-y2); } getch(); }

Program 7: Parallel Projections /********************************************************************* Name: Atishay Jain Subject: Computer Graphics Roll No: 10783017 Program: Oblique Projection *********************************************************************/ #include<stdio.h> #include<math.h> #include main() { int x1,y1,x2,y2,gd,gm; int ymax,a[4][8]; float par[4][4],b[4][8]; int i,j,k,m,n,p; double L1,phi; a[0][0] = 100; a[1][0] = 100; a[2][0] = 100; a[0][1] = 200; a[1][1] = 100; a[2][1] = 100; a[0][2] = 200; a[1][2] = 200; a[2][2] = 100; a[0][3] = 100; a[1][3] = 200; a[2][3] = 100; a[0][4] = 100; a[1][4] = 100; a[2][4] = 200; a[0][5] = 200; a[1][5] = 100; a[2][5] = 200; a[0][6] = 200; a[1][6] = 200; a[2][6] = 200; a[0][7] = 100; a[1][7] = 200; a[2][7] = 200; phi = (double) (3.14*45.0)/180 ; L1 = 0.5; par[0][0] = 1; par[0][1] = 0; par[0][2] = L1*cos(phi); par[0][3] = 0; par[1][0] = 0; par[1][1] = 1; par[1][2] = L1*sin(phi); par[1][3] = 0; par[2][0] = 0; par[2][1] = 0; par[2][2] = 0; par[2][3] = 0; par[3][0] = 0; par[3][1] = 0; 19

par[3][2] = 0; par[3][3] = 1; m=4; n=4; p=8; for(i=0; i<m; i++) for(k=0; k
}

21

Related Documents

Graphics File
June 2020 6
Sem Lab
December 2019 25
Graphics Lab Bca35l
November 2019 1
Lab 4 - Graphics
May 2020 1