cg lab manual (new)
DESCRIPTION
Cg Lab ManualTRANSCRIPT
COMPUTER GRAPHICS LAB
CS2405Lab Report
2014-2015VII Semester
Submitted By,NAME
311011104XXX
DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING
K.C.G COLLEGE OF TECHNOLOGY
KARAPAKKAM
CHENNAI 600 097
KCG COLLEGE OF TECHNOLOGYKARAPAKKAM
REG. NO. ___________________
LABORATORY RECORD
Name of the Lab ____COMPUTER GRAPHICS LAB -
(CS2405)_____
Department of ___COMPUTER SCIENCE AND ENGINEERING___
Certified that this is a bonafide record of the work
done by ____________________________ of ____CSE VII
___ Class
in the __COMPUTER ______ Laboratory during the year
2014-2015.
____________________ ____________________
Staff Member in charge H.O.D
____________________ _______________________
INT. Examiner EXT. Examiner
Date of the Examination _______________
3110111040XXXXXXXXX
EX NO :1A DRAWING A LINE USING DDADATE :
AIM:
To write a C Program for Line Drawing using Digital Differential Analyzer (DDA) Method.
ALGORITHM:
1. Start
2. Read the two end points of a line (x1, y1) & (x2, y2).
3. ∆x = x2-x1 &∆y = y2-y1
4. Initialize (x, y) with (x1,y1)
x = x1
y = y1
5. if abs(∆ x) > abs(∆y) then
steps =∆x
else
steps=∆y
6. xincrement =∆x / steps.
7. yincrement =∆y /steps
8. Plot the rounded coordinate (x, y)
9. Initialize counter k=1
10. Start the loop
x = x + xincrement
y = y+ yincrement
11. Plot the rounded coordinate(x, y)
12. Continue the loop till the counter k= steps
13. Stop.
PROGRAM:
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<math.h>void main(){
int gd = DETECT, gm;
1
3110111040XXXXXXXXX
int x1, y1, x2, y2,dx,dy,steps,k;float xincrement,yincrement,x,y;initgraph(&gd, &gm, "..\\bgi");
printf("Enter the Starting Point of x axis : ");scanf("%d", &x1);
printf("Enter the Starting of y axis : ");scanf("%d", &y1);
printf("Enter the End Point of x axis : ");scanf("%d", &x2);
printf("Enter the End Point of y axis : ");scanf("%d", &y2);clrscr();dx = x2 – x1;dy = y2 – y1;x=x1;y=y1;if(abs(dx) > abs(dy))
steps=abs(dx);else
steps=abs(dy);xincrement=dx/(float)steps;yincrement=dy/(float)steps;putpixel(ceil(x), ceil(y), RED);for(k=1;k<=steps;k++){
x=x+xincrement;y=y+yincrement;putpixel(ceil(x),ceil(y), RED);
}getch();closegraph();
}
2
3110111040XXXXXXXXX
INPUT:
Enter the Starting Point of x axis : 100Enter the Starting Point of y axis : 100Enter the End Point of x axis : 200Enter the End Point of y axis : 200
OUTPUT:
RESULT:
Thus the program was successfully created and executed.
3
3110111040XXXXXXXXX
EX NO :1B BRESENHAM'S LINE DRAWING METHODDATE:
AIM:
To write a C Program for Line Drawing using Bresenham’s Line drawing Method.
ALGORITHM:
1. Start
2. Read the two end points of a line (x1, y1) & (x2, y2).
3. Determine the Points which is used as start and end then store it in x and y
4. Plot the co-ordinate (x,y)
5. Calculate the constants ∆x, ∆y, 2∆y, 2∆y-2∆x and also obtain the starting value for the
decision parameter as p=2∆y-∆x
6. At each xk along the line, starting at k=0, Perform the following :
a. if pk<0, the next point to plot is (xk+1,yk) and pk+1=pk+2∆y
otherwise
b. the next point to plot is (xk+1,yk+1) and pk+1=pk+2∆y-2∆x
7. Repeat the Step 6 for ∆x times
8. Stop.
PROGRAM:
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<math.h>void main(){
int gd = DETECT, gm;int x,y,x1,y1,x2,y2,p,dx,dy,twody,twodydx,xend;initgraph(&gd,&gm,"..\\BGI:");printf("\nEnter the x-coordinate of the starting point :");scanf("%d",&x1);printf("\nEnter the y-coordinate of the starting point :");scanf("%d",&y1);printf("\nEnter the x-coordinate of the Ending point :");scanf("%d",&x2);printf("\nEnter the y-coordinate of the ending point :");scanf("%d",&y2);
4
3110111040XXXXXXXXX
clrscr();dx=x2-x1;dy=y2-y1;p=2*dy-dx;twody=2*dy;twodydx=2*(dy-dx);if (x1>x2){
x=x2;y=y2;xend=x1;
}else{
x=x1;y=y1;xend=x2;
}putpixel(x,y,RED);while(x<xend){
x++;if (p<0)
p=p+twody;else{
y=y+1;p=p+twodydx;
}putpixel(x,y,RED);
}getch();closegraph();
}
5
3110111040XXXXXXXXX
INPUT:
Enter the x-coordinate of the starting point : 100Enter the y-coordinate of the starting point : 100Enter the x-coordinate of the Ending point : 200Enter the y-coordinate of the ending point : 200
OUTPUT:
RESULT:
Thus the program was successfully created and executed.
6
3110111040XXXXXXXXX
EX NO :2A MIDPOINT ELLIPSE DRAWING ALGORITHMDATE:
AIM:
To write a C Program for Ellipse Drawing using Midpoint Ellipse drawing Method.
ALGORITHM:
Step 1 : Start
Step 2 : Input rx ,ry, and ellipse center (xc, yc,) and obtain the first point on an ellipse
centered on the origin as (x,y)=(0,ry)
Step 3: Calculate the initial value of the decision parameter in region 1
p=ry2-(rx2*ry)+(0.25*rx2);
Step 4: At each position xk position in region1 perform the following
a) if pk<0 then pk+1 = pk+2ry2xk+1+ry2
else
b) pk+1 = pk+2ry2xk+1 – 2rx2yk+1+ry2
c) continue until 2ry2x >=2rx2y.
Step 5: Calculate the initial value of the decision parameter in region 2
p= ry2*(x+0.5)*(x+0.5)+rx2*(y-1)*(y-1)-rx2*ry2
Step 6: At each position yk position in region2 perform the following
a) if pk<0 then pk+1 = pk-2rx2yk+1+rx2
else
b) pk+1 = pk+2ry2xk+1 – 2rx2yk+1+ry2
c) continue until 2rx2y>=2ry2x.
Step 7: Move each calculated pixel position onto the elliptical path and plot the co-ordinates.
Step 8: Stop
PROGRAM:
#include<graphics.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>#define round(a) ((int)(a+0.5))void ellipseplot(int,int,int,int);int xcenter,yc,rx,ry;void main(){
7
3110111040XXXXXXXXX
int gd=DETECT,gm;int xcenter,ycenter,rx,ry;long rx2,ry2,tworx2,twory2,p,x,y,px,py;initgraph(&gd,&gm,"..\\BGI:");printf("\nEnter the x-coordinate of the centre point :");scanf("%d",&xcenter);printf("\nEnter the y-coordinate of the centre point :");scanf("%d",&ycenter);printf("\nEnter the x-coordinate of the radius :");scanf("%d",&rx);printf("\nEnter the y-coordinate of the radius :");scanf("%d",&ry);rx2=rx*rx;ry2=ry*ry;twory2=2*ry2;tworx2=2*rx2;x=0;y=ry;py=tworx2*y;px=0;ellipseplot(xcenter,ycenter,x,y);p=round(ry2-(rx2*ry)+(0.25*rx2));while(px<py){
x++;px=px+twory2;if(p<0)
p=p+ry2+px;else{
y--;py=py-tworx2;p=p+ry2+px-py;
}ellipseplot(xcenter,ycenter,x,y);
}p=round(ry2*(x+0.5)*(x+0.5)+rx2*(y-1)*(y-1)-rx2*ry2);while(y>0){
y--;py=py-tworx2;if(p>0)
p=p+rx2-py;else{
x++;px=px+twory2;p=p+rx2-py+px;
}ellipseplot(xcenter,ycenter,x,y);
8
3110111040XXXXXXXXX
}getch();closegraph();
}void ellipseplot(int xcenter,int ycenter,int x,int y){
putpixel(xcenter +x,ycenter +y,20);putpixel(xcenter -x,ycenter +y,20);putpixel(xcenter +x,ycenter -y,20);putpixel(xcenter -x,ycenter -y,20);
}
INPUT:
Enter the x-coordinate of the centre point : 100Enter the y-coordinate of the centre point : 200Enter the x-coordinate of the radius : 50Enter the y-coordinate of the radius : 60
OUTPUT:
RESULT:
Thus the program was successfully created and executed.
9
3110111040XXXXXXXXX
EX NO :2B MIDPOINT CIRCLE DRAWING ALGORITHMDATE:
AIM:
To write a C Program for Circle Drawing using Midpoint Circle Method.
ALGORITHM:
1. Start2. Get the center point (xcenter, ycenter) and radius(r) of a circle.3. Initialize the variables
i. x=0; y=r; p=1-r;4. If (p<0) then
i. p=p+(2*x)+1 else
i. y--;ii. p=p+2* (x-y)+1
5. Repeat step 4 until x<y and Increment x by 1 each time.6. Plot the pixel to display the circle.7. Display the circle8. Stop.
PROGRAM:
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<math.h>int x,y,r,p,xcenter, ycenter;void circleplot(int,int,int,int);void main(){
int gd = DETECT, gm;initgraph(&gd,&gm,"..\\BGI:");printf("\nEnter the x-coordinate of the centre point :");scanf("%d",&xcenter);printf("\nEnter the y-coordinate of the centre point :");scanf("%d",&ycenter);printf("\nEnter the radius :");scanf("%d",&r);x=0;y=r;p=1-r;while (x<y){
x++;if (p<0)
p=p+2*x+1;
10
3110111040XXXXXXXXX
else{
y--;p=p+2*(x-y)+1;
}circleplot(xcenter,ycenter,x,y);
}getch();closegraph();
}void circleplot(int xcenter, int ycenter,int x, int y){
putpixel(xcenter+x,ycenter+y,10);putpixel(xcenter-x,ycenter+y,10);putpixel(xcenter+x,ycenter-y,10);putpixel(xcenter-x,ycenter-y,10);putpixel(xcenter+y,ycenter+x,10);putpixel(xcenter-y,ycenter+x,10);putpixel(xcenter+y,ycenter-x,10);putpixel(xcenter-y,ycenter-x,10);
}
OUTPUT:Enter the x-coordinate of the centre point :200Enter the y-coordinate of the centre point :200Enter the radius :50
RESULT:
Thus the program was successfully created and executed
11
3110111040XXXXXXXXX
EX NO :3A LINE ATTRIBUTESDATE:
AIM:To study and Implement line attributes
ALGORITHM:
1. Start the program for line type
2. Include the necessary package
3. Declare the line type
4. Using setline style and line function to draw the different line function
5. Terminate the function
PROGRAM:
#include <graphics.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <conio.h>void main(){
int gd=DETECT,gm;int ch;clrscr();while(1){
printf("******Line Styles*******\n");printf("\n1.Solid Line");printf("\n2.Dotted Line");printf("\n3.Center Line");printf("\n4.Dashed Line");printf("\n5.Userbit Line");printf("\n6.Exit");printf("\n\nEnter your choice:\n");scanf("%d",&ch);switch(ch){
case 1:clrscr();initgraph(&gd,&gm," ");setlinestyle(0,1,3);line(100,30,250,250);getch();cleardevice();closegraph();break;
12
3110111040XXXXXXXXX
case 2:clrscr();initgraph(&gd,&gm," ");clrscr();setlinestyle(1,1,3);line(100,30,250,250);getch();cleardevice();closegraph();break;
case 3:clrscr();initgraph(&gd,&gm," ");setlinestyle(2,1,3);line(100,30,250,250);getch();cleardevice();closegraph();break;
case 4:clrscr();initgraph(&gd,&gm," ");setlinestyle(3,1,3);line(100,30,250,250);getch();cleardevice();closegraph();break;
case 5:clrscr();initgraph(&gd,&gm," ");setlinestyle(4,1,3);line(100,30,250,250);getch();cleardevice();closegraph();break;
case 6:exit(0);
}}
}
13
3110111040XXXXXXXXX
OUTPUT:
******Line Styles*******1.Solid Line2.Dotted Line3.Center Line4.Dashed Line5.Userbit Line6.Exit
Enter your choice:4
RESULT:
Thus the program was successfully created and executed.
14
3110111040XXXXXXXXX
EX NO :3B CIRCLE ATTRIBUTESDATE:
AIM:To study and Implement Circle attributes
ALGORITHM:
1.Initialize the graphics mode2.For circle,set the fill pattern using setfillstyle() command.3.Draw the circle using pieslice() command.4.Perform the clean up procedure.
PROGRAM:
#include <graphics.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <conio.h>void main(){
int gd=DETECT,gm;int ch;clrscr();while(1){
printf("******Circle Attributes*******\n");printf("\n1.Empty Fill");printf("\n2.Soild Fill");printf("\n3.Line Fill");printf("\n4.LTSlash Fill");printf("\n5.Slash Fill");printf("\n6.BKSlash Fill");printf("\n7.LTBKSlash Fill");printf("\n8.Hatch Fill");printf("\n9.Xhatch Fill");printf("\n10.Interleave Fill");printf("\n11.Wide dot Fill");printf("\n12.close dot Fill");printf("\n13.User Fill");printf("\n14.Exit");printf("\n\nEnter your choice:\n");scanf("%d",&ch);
switch(ch){
15
3110111040XXXXXXXXX
case 1:clrscr();initgraph(&gd,&gm," ");setfillstyle(EMPTY_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 2:clrscr();initgraph(&gd,&gm," ");setfillstyle(SOLID_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 3:clrscr();initgraph(&gd,&gm," ");setfillstyle(LINE_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 4:clrscr();initgraph(&gd,&gm," ");setfillstyle(LTSLASH_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 5:clrscr();initgraph(&gd,&gm," ");setfillstyle(SLASH_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
16
3110111040XXXXXXXXX
case 6:clrscr();initgraph(&gd,&gm," ");setfillstyle(BKSLASH_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 7:clrscr();initgraph(&gd,&gm," ");setfillstyle(LTBKSLASH_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 8:clrscr();initgraph(&gd,&gm," ");setfillstyle(HATCH_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 9:clrscr();initgraph(&gd,&gm," ");setfillstyle(XHATCH_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 10:clrscr();initgraph(&gd,&gm," ");setfillstyle(INTERLEAVE_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 11:
17
3110111040XXXXXXXXX
clrscr();initgraph(&gd,&gm," ");setfillstyle(WIDE_DOT_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 12:clrscr();initgraph(&gd,&gm," ");setfillstyle(CLOSE_DOT_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 13:clrscr();initgraph(&gd,&gm," ");setfillstyle(USER_FILL, RED);circle(100, 100, 50);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 14:exit(0);
}}
}
18
3110111040XXXXXXXXX
Output
******Circle Attributes*******
1.Empty Fill2.Soild Fill3.Line Fill4.LTSlash Fill5.Slash Fill6.BKSlash Fill7.LTBKSlash Fill8.Hatch Fill9.Xhatch Fill10.Interleave Fill11.Wide dot Fill12.close dot Fill13.User Fill14.Exit
Enter your choice : 5
RESULT:
Thus the program was successfully created and executed.
19
3110111040XXXXXXXXX
EX NO :3C ELLIPSE ATTRIBUTESDATE:
AIM:To study and Implement ellipse attributes
ALGORITHM:
1.Initialize the graphics mode2.For ellipse,set the fill pattern using setfillstyle() command.3.Draw the ellipse using pieslice() command.4.Perform the clean up procedure.
PROGRAM:
#include <graphics.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <conio.h>void main(){
int gd=DETECT,gm;int ch;clrscr();while(1){
printf("******Ellipse Attributes*******\n");printf("\n1.Empty Fill");printf("\n2.Soild Fill");printf("\n3.Line Fill");printf("\n4.LTSlash Fill");printf("\n5.Slash Fill");printf("\n6.BKSlash Fill");printf("\n7.LTBKSlash Fill");printf("\n8.Hatch Fill");printf("\n9.Xhatch Fill");printf("\n10.Interleave Fill");printf("\n11.Wide dot Fill");printf("\n12.close dot Fill");printf("\n13.User Fill");printf("\n14.Exit");printf("\n\nEnter your choice:\n");scanf("%d",&ch);
switch(ch){
case 1:clrscr();
20
3110111040XXXXXXXXX
initgraph(&gd,&gm," ");setfillstyle(EMPTY_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 2:clrscr();initgraph(&gd,&gm," ");setfillstyle(SOLID_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 3:clrscr();initgraph(&gd,&gm," ");setfillstyle(LINE_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 4:clrscr();initgraph(&gd,&gm," ");setfillstyle(LTSLASH_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 5:clrscr();initgraph(&gd,&gm," ");setfillstyle(SLASH_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 6:clrscr();
21
3110111040XXXXXXXXX
initgraph(&gd,&gm," ");setfillstyle(BKSLASH_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 7:clrscr();initgraph(&gd,&gm," ");setfillstyle(LTBKSLASH_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 8:clrscr();initgraph(&gd,&gm," ");setfillstyle(HATCH_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 9:clrscr();initgraph(&gd,&gm," ");setfillstyle(XHATCH_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 10:clrscr();initgraph(&gd,&gm," ");setfillstyle(INTERLEAVE_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 11:clrscr();
22
3110111040XXXXXXXXX
initgraph(&gd,&gm," ");setfillstyle(WIDE_DOT_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 12:clrscr();initgraph(&gd,&gm," ");setfillstyle(CLOSE_DOT_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 13:clrscr();initgraph(&gd,&gm," ");setfillstyle(USER_FILL, RED);ellipse(100, 100,0,360,50,25);floodfill(100, 100, WHITE);getch();cleardevice();closegraph();break;
case 14:exit(0);
}}
}
23
3110111040XXXXXXXXX
OUTPUT:
******Ellipse Attributes*******1.Empty Fill2.Soild Fill3.Line Fill4.LTSlash Fill5.Slash Fill6.BKSlash Fill7.LTBKSlash Fill8.Hatch Fill9.Xhatch Fill10.Interleave Fill11.Wide dot Fill12.close dot Fill13.User Fill14.ExitEnter your choice : 9
RESULT:
Thus the program was successfully created and executed .
24
3110111040XXXXXXXXX
EX NO :4 2D TRANSFORMATIONS-TRANSLATION,SCALING,ROTATION,SHEAR
DATE : AND SHEAR
AIM:To study and Implement 2D Transformation– Translation, Rotation, Scaling, Shear
and Reflection
ALGORITHM:
Step 1: Declare the variables xa,ya,xa1,ya1 of array type.
Step 2:Declare the variables gd,gm,n,i,op,tx,ty,xf,yf,rx,ry.
Step 3: Initialize the graphics function.
Step 4: Input the number of points.
Step 5: Input the value of co-ordinate according to number of points.
Step 6 : Using switch statement selects the option to perform translation, rotation, scaling,
reflection and shearing.
Step 7: Translation:
a).input the translation vector
b).add the translation vectors with the coordinates
xa1 [i] =xa[i] =tx, ya1[i] =ya[i] =ty,
c).using the function line, display the object before and after translation.
Step 8: Rotation
a). input the rotation angle
b). using formula theta=(theta*3.14)/180
c).input the value of reference point
d). calculate new coordinate point using formula
xa1[i]=xf+(xa[i]-xf)*cos(theta)-(ya[i]-yf)*sin(theta),
ya1[i]=yf+(xa[i]-xf)*sin(theta)-(ya[i]-yf)*cos(theta),
e). using the function line,display the object before and after rotation.
Step 9: Scaling:
a).input the scaling factor and reference point
b).calculate new coordinate point using formula
xa1[i]=(xa[i]*sx+rx*(1-sx),
ya1 [i] = (ya[i]*sy+ry*(1-sy)
c). using the function line, display the object before and after scaling.
25
3110111040XXXXXXXXX
Step 10: Shearing:
a).input the shearing value and reference point.
b). input the shear direction x or y
i).if direction x
xa1[i]=xa[i]+shx*(ya[i]-yref)
ii).otherwise
ya1[i]=ya[i]+shy*(xa[i]-xref)
iii). using the function line, display the object before and after shearing.
Step 11: Reflection:
a).display the object before reflection using the function line
b). display the object after reflection using the function line
Step 12: Stop.
PROGRAM:
a) Translation
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<process.h>#include<math.h>
void RectAngle(int x,int y,int Height,int Width);
void main(){ int gd=DETECT,gm; int x,y,Height,Width,a,b,Newx,Newy; initgraph(&gd,&gm," "); printf("Enter the First point for the Rectangle:"); scanf("%d%d",&x,&y); printf("Enter the Height & Width for the Rectangle:"); scanf("%d%d",&Height,&Width);
printf("Enter the Translation coordinates"); scanf("%d%d",&Newx,&Newy); cleardevice(); printf("\nBefore Translation"); RectAngle(x,y,Height,Width); a=x+Newx; b=y+Newy; printf("\n\nAfter Translation"); RectAngle(a,b,Height,Width); getch();
26
3110111040XXXXXXXXX
}
void RectAngle(int x,int y,int Height,int Width){
line(x,y,x+Width,y); line(x,y,x,y+Height); line(x+Width,y,x+Width,y+Height); line(x,y+Height,x+Width,y+Height);}
b) Scaling
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<process.h>#include<math.h>int x1,y1,x2,y2,x3,y3,mx,my;void draw();void scale();void main(){ int gd=DETECT,gm; int c; initgraph(&gd,&gm," "); printf("Enter the 1st point for the triangle:"); scanf("%d%d",&x1,&y1); printf("Enter the 2nd point for the triangle:"); scanf("%d%d",&x2,&y2); printf("Enter the 3rd point for the triangle:"); scanf("%d%d",&x3,&y3); draw(); scale();}void draw(){ line(x1,y1,x2,y2); line(x2,y2,x3,y3); line(x3,y3,x1,y1);}void scale(){ int x,y,a1,a2,a3,b1,b2,b3; int mx,my;
printf("Enter the scaling factors"); scanf("%d%d",&x,&y); mx=(x1+x2+x3)/3; my=(y1+y2+y3)/3;
27
3110111040XXXXXXXXX
cleardevice(); a1=mx+(x1-mx)*x; b1=my+(y1-my)*y; a2=mx+(x2-mx)*x; b2=my+(y2-my)*y; a3=mx+(x3-mx)*x; b3=my+(y3-my)*y; line(a1,b1,a2,b2); line(a2,b2,a3,b3); line(a3,b3,a1,b1); draw(); getch();}
c) Rotation
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<process.h>#include<math.h>void TriAngle(int x1,int y1,int x2,int y2,int x3,int y3);void Rotate(int x1,int y1,int x2,int y2,int x3,int y3);void main(){
int gd=DETECT,gm;int x1,y1,x2,y2,x3,y3; initgraph(&gd,&gm," ");printf("Enter the 1st point for the triangle:");scanf("%d%d",&x1,&y1);printf("Enter the 2nd point for the triangle:");scanf("%d%d",&x2,&y2);printf("Enter the 3rd point for the triangle:");scanf("%d%d",&x3,&y3);TriAngle(x1,y1,x2,y2,x3,y3);getch();cleardevice();Rotate(x1,y1,x2,y2,x3,y3);setcolor(1);TriAngle(x1,y1,x2,y2,x3,y3);getch();
}void TriAngle(int x1,int y1,int x2,int y2,int x3,int y3){
line(x1,y1,x2,y2);line(x2,y2,x3,y3);line(x3,y3,x1,y1);
}void Rotate(int x1,int y1,int x2,int y2,int x3,int y3){
28
3110111040XXXXXXXXX
int x,y,a1,b1,a2,b2,a3,b3,p=x2,q=y2;float Angle;printf("Enter the angle for rotation:");scanf("%f",&Angle);cleardevice();Angle=(Angle*3.14)/180;a1=p+(x1-p)*cos(Angle)-(y1-q)*sin(Angle);b1=q+(x1-p)*sin(Angle)+(y1-q)*cos(Angle);a2=p+(x2-p)*cos(Angle)-(y2-q)*sin(Angle);b2=q+(x2-p)*sin(Angle)+(y2-q)*cos(Angle);a3=p+(x3-p)*cos(Angle)-(y3-q)*sin(Angle);b3=q+(x3-p)*sin(Angle)+(y3-q)*cos(Angle);printf("Rotate");TriAngle(a1,b1,a2,b2,a3,b3);
}
d) Shearing
#include<stdio.h>#include<process.h>#include<conio.h>#include<graphics.h>#include<math.h>void disp(int n,float c[][3]){
float maxx,maxy;int i;maxx=getmaxx();maxy=getmaxy();maxx=maxx/2;maxy=maxy/2;i=0;while(i<n-1){
line(maxx+c[i][0],maxy-c[i][1],maxx+c[i+1][0],maxy-c[i+1][1]);i++;
}i=n-1;line(maxx+c[i][0],maxy-c[i][1],maxx+c[0][0],maxy-c[0][1]);setcolor(GREEN);line(0,maxy,maxx*2,maxy);line(maxx,0,maxx,maxy*2);setcolor(WHITE);
}void mul(int n,float b[][3],float c[][3],float a[][3]){
int i,j,k;for(i=0;i<n;i++)
for(j=0;j<3;j++)a[i][j]=0;
29
3110111040XXXXXXXXX
for(i=0;i<n;i++)for(j=0;j<3;j++)
for(k=0;k<3;k++){
a[i][j] = a[i][j] + (c[i][k] * b[k][j]);}
}void shearing(int n,float c[][3]){
float b[10][3],sh,a[10][3];int i=0,ch,j;while(1){
clrscr();cleardevice();printf("\n* * * MENU * * *");printf("\n 1) X SHEARING");printf("\n 2) Y SHEARING");printf("\n 3) EXIT ");printf("\n ENTER YOUR CHOICE : ");scanf("%d",&ch);for(i=0;i<3;i++)
for(j=0;j<3;j++)b[i][j]=0;
for(i=0;i<3;i++)b[i][i]=1;
switch(ch){
case 1:printf("\n ENTER THE VALUE for SHEARING: ");scanf("%f",&sh);b[1][0]=sh;break;
case 2:printf("\n ENTER THE VALUE for SHEARING: ");scanf("%f",&sh);b[0][1]=sh;break;
case 3:exit(0);break;
default:printf("\nINVALID CHOICE ! ");break;
}disp(n,c);mul(n,b,c,a);setcolor(RED);disp(n,a);getch();
30
3110111040XXXXXXXXX
}}void main(){
int i,j,k,cho,n,gd=DETECT,gm;float c[10][3],tx,ty,sx,sy,ra;initgraph(&gd,&gm," ");printf("\n Enter the number of vertices : ");scanf("%d",&n);for(i=0;i<n;i++){
printf("\nEnter the co-ordinates of the %d vertex :",i+1);scanf("%f%f",&c[i][0],&c[i][1]);c[i][2]=1;
}shearing(n,c);closegraph();
}
e) Reflection
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<math.h>void disp(int n,float c[][3]){
float maxx,maxy;int i;maxx=getmaxx();maxy=getmaxy();maxx=maxx/2;maxy=maxy/2;i=0;while(i<n-1){
line(maxx+c[i][0],maxy-c[i][1],maxx+c[i+1][0],maxy-c[i+1][1]);i++;
}i=n-1;line(maxx+c[i][0],maxy-c[i][1],maxx+c[0][0],maxy-c[0][1]);setcolor(GREEN);line(0,maxy,maxx*2,maxy);line(maxx,0,maxx,maxy*2);setcolor(WHITE);
}void mul(int n,float b[][3],float c[][3],float a[][3]){
int i,j,k;for(i=0;i<n;i++)
31
3110111040XXXXXXXXX
for(j=0;j<3;j++)a[i][j]=0;
for(i=0;i<n;i++)for(j=0;j<3;j++)
for(k=0;k<3;k++){
a[i][j] = a[i][j] + (c[i][k] * b[k][j]);}
}void reflection(int n,float c[][3]){
float b[10][3],a[10][3];int i=0,ch,j;while(1){
clrscr();cleardevice();printf("\n* * MENU * *");printf("\n 1) ABOUT X-AXIS");printf("\n 2) ABOUT Y-AXIS");printf("\n 3) ABOUT ORIGIN");printf("\n 4) ABOUT X=Y");printf("\n 5) ABOUT -X=Y");printf("\n 6) EXIT");printf("\n ENTER YOUR CHOICE : ");scanf("%d",&ch);for(i=0;i<3;i++)
for(j=0;j<3;j++){
b[i][j]=0;if(i==j)
b[i][j]=1;}
switch(ch){
case 1:b[1][1]=-1;break;
case 2:b[0][0]=-1;break;
case 3:b[0][0]=-1;b[1][1]=-1;break;
case 4:b[0][0]=0;b[1][1]=0;b[0][1]=1;b[1][0]=1;
32
3110111040XXXXXXXXX
break;case 5:
b[0][0]=0;b[1][1]=0;b[0][1]=-1;b[1][0]=-1;break;
case 6:exit(0);break;
default:printf("\nINVALID CHOICE ! ");break;
}mul(n,b,c,a);clrscr();cleardevice();disp(n,c);setcolor(RED);disp(n,a);
getch();}
}void main(){
int i,j,k,cho,n,gd=DETECT,gm;float c[10][3],tx,ty,sx,sy,ra;initgraph(&gd,&gm," ");printf("\n Enter the number of vertices : ");scanf("%d",&n);for(i=0;i<n;i++){
printf("\nEnter the co-ordinates of the %d vertex :",i+1);scanf("%f%f",&c[i][0],&c[i][1]);c[i][2]=1;
}reflection(n,c);closegraph();
}
OUTPUT:a) Translation
Enter the first point of the rectangle : 100 100Enter the height and width of the rectangle : 50 100Enter the translation coordinates : 200 200
33
3110111040XXXXXXXXX
b) ScalingEnter the 1st point for the triangle : 150 150Enter the 2nd point for the triangle : 200 200Enter the 3rd point for the triangle : 200 150Enter the scaling factors : 3 5
c) RotationEnter the 1st point for the triangle: 150 150Enter the 2nd point for the triangle: 200 200Enter the 3rd point for the triangle: 200 150
34
3110111040XXXXXXXXX
Enter the angle for rotation: 60
d) ShearingEnter the number of vertices : 4Enter the coordinates of the 1 vertex: 150 150Enter the coordinates of the 2 vertex: 100 150Enter the coordinates of the 3 vertex: 100 100Enter the coordinates of the 4 vertex: 150 100
35
3110111040XXXXXXXXX
e) ReflectionEnter the number of vertices : 3Enter the coordinates of 1 vertex : 150 150Enter the coordinates of 2 vertex : 100 150Enter the coordinates of 3 vertex : 150 100**MENU**1.ABOUT X-AXIS2.ABOUT Y-AXIS3.ABOUT ORIGIN4.ABOUT X=Y5.ABOUT -X=Y6.EXITEnter your choice : 3
RESULT:
Thus the program was successfully created and executed.
36
3110111040XXXXXXXXX
EX NO :5 COMPOSITE 2D TRANSFORMATIONS
DATE :
AIM: To study and implement composite 2D transformation
ALGORITHM:
Step 1: Initialise the matrix to perform computationsStep 2: Get the values and store it in the matrixStep 3: Perform rotation , scaling and transform the 2D image using matrixStep 4: Display the input and output shape of the object PROGRAM:
#include<stdio.h>#include<conio.h>#include<math.h>#include<graphics.h>struct point{
int x;int y;
};typedef float matrix[3][3];matrix tm;void Identity( matrix m){
int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)m[i][j]=(i==j);
}void multiply(matrix a, matrix b){
int r,c;matrix tmp;for(r=0;r<3;r++)
for(c=0;c<3;c++)tmp[r][c]=a[r][0]*b[0][c]+a[r][1]*b[1][c]+a[r][2]*b[2][c];
for(r=0;r<3;r++)for(c=0;c<3;c++)
b[r][c]=tmp[r][c];}
void translate(int tx,int ty){
matrix m;Identity(m);m[0][2]=tx;m[1][2]=ty;
37
3110111040XXXXXXXXX
multiply(m,tm);}
void scale(float sx,float sy, struct point refpt){
matrix m;Identity(m);m[0][0]=sx;m[0][2]=(1-sx)*refpt.x;m[1][1]=sy;m[1][2]=(1-sy)*refpt.y;multiply(m,tm);
}void rotate(float a , struct point refpt){
matrix m;Identity(m);a=(a*3.14)/180.0;m[0][0]=cos(a);m[0][1]=-sin(a);m[0][2]=refpt.x*(1-cos(a))+refpt.y*sin(a);m[1][0]=sin(a);m[1][1]=-cos(a);m[1][2]=refpt.y*(1-cos(a))+refpt.x*sin(a);multiply(m,tm);
}void transform(int npts, struct point *pts){
int k;float tmp;for(k=0;k<npts;k++){
tmp=tm[0][0]*pts[k].x+tm[0][1]*pts[k].y+tm[0][2];pts[k].y=tm[1][0]*pts[k].x+tm[1][1]*pts[k].y+tm[1][2];pts[k].x=tmp;
}}void main(){
struct point pts[4]={220.0, 50.0, 320.0, 200.0, 150.0, 200.0, 220.0, 50.0};struct point refpt={50.0,50.0};int g=DETECT,d;initgraph(&g,&d,"c:\tc\bgi");setbkcolor(GREEN);setcolor(RED);drawpoly(4,pts);getch();Identity(tm);scale(0.5,0.5,refpt);rotate(90.0,refpt);
38
3110111040XXXXXXXXX
translate(100,100);transform(4,pts);setcolor(WHITE);drawpoly(4,pts);getch();closegraph();
}
OUTPUT:
RESULT:
Thus the program was successfully created and executed
39
3110111040XXXXXXXXX
EX NO :6 3D TRANSFORMATIONS-TRANSLATION,ROTATION AND SCALING
DATE :
AIM:
To perform 3D transformations such as Translation, Rotation and Scaling on 3D object
ALGORITHM:
1. 3 dimensional transformation it has three axis x,y,z.
2. Depending upon the coordinate it will perform the Translation, Rotation, Scaling,
3. The translation can be performed by changing the sign of the translation components Tx, Ty, and Tz.
4. Perform the scaling of 3D object with scaling parameter
5. Increase of rotation, object can be rotated about x or y or z axis.
6. Display the transmitted object in the screen
PROGRAM:
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<math.h>int maxx,maxy,midx,midy;void axis(){ getch(); cleardevice(); line(midx,0,midx,maxy); line(0,midy,maxx,midy);}void main(){ int gd,gm,x,y,z,ang,x1,x2,y1,y2; detectgraph(&gd,&gm); initgraph(&gd,&gm,"C:/TC/BGI"); setfillstyle(3,25); maxx=getmaxx(); maxy=getmaxy(); midx=maxx/2; midy=maxy/2; outtextxy(100,100,"ORIGINAL OBJECT");
40
3110111040XXXXXXXXX
line(midx,0,midx,maxy); line(0,midy,maxx,midy); bar3d(midx+100,midy-20,midx+60,midy-90,20,5); axis(); outtextxy(100,20,"TRANSLATION"); printf("\n\n Enter the Translation vector: "); scanf("%d%d",&x,&y); bar3d(midx+100,midy-20,midx+60,midy-90,20,5); bar3d(midx+(x+100),midy-(y+20),midx+(x+60),midy-(y+90),20,5); axis(); outtextxy(100,20,"SCALING"); printf("\n Enter the Scaling Factor: "); scanf("%d%d%d",&x,&y,&z); bar3d(midx+100,midy-20,midx+60,midy-90,20,5); bar3d(midx+(x*100),midy-(y*20),midx+(x*60),midy-(y*90),20*z,5); axis(); outtextxy(100,20,"ROTATION"); printf("\n Enter the Rotation angle: "); scanf("%d",&ang); x1=100*cos(ang*3.14/180)-20*sin(ang*3.14/180); y1=100*sin(ang*3.14/180)+20*sin(ang*3.14/180); x2=60*cos(ang*3.14/180)-90*sin(ang*3.14/180); y2=60*sin(ang*3.14/180)+90*sin(ang*3.14/180); axis(); printf("\n After rotating about z-axis\n"); bar3d(midx+100,midy-20,midx+60,midy-90,20,5); bar3d(midx+x1,midy-y1,midx+x2,midy-y2,20,5); axis(); printf("\n After rotating about x-axis\n"); bar3d(midx+100,midy-20,midx+60,midy-90,20,5); bar3d(midx+100,midy-x1,midx+60,midy-x2,20,5); axis(); printf("\n After rotating about y-axis\n"); bar3d(midx+100,midy-20,midx+60,midy-90,20,5); bar3d(midx+x1,midy-20,midx+x2,midy-90,20,5); axis(); closegraph();}
INPUT:
41
3110111040XXXXXXXXX
Enter the translation vector : 65 70Enter the scaling factor : 2 2 2Enter the Rotation Angle : 100
Output
42
3110111040XXXXXXXXX
43
3110111040XXXXXXXXX
RESULT:
Thus the program was successfully created and executed
EX NO :7 COMPOSITE 3D TRANSFORMATIONSDATE :
AIM:
To write a C program to perform composite (sequence) of transformations on a 3D
object.
DESCRPTION:
1) Reflection:
Reflection is a transformation that produces a mirror image of an object.
Transformation matrix for reflection about the line y=0, is
44
3110111040XXXXXXXXX
Transformation matrix for reflection about the line x=0, is
2) Shearing
Shearing is a transformation that distorts the shape of an object.
An X-direction shear relative to the x axis is produced by the transformation matrix
A y-direction shear relative to other referencelines is produced by the transformation
matrix
3) Rotation
This is done by three transformation steps: translation of the arbitrary point (xc,yc) to
the origin, rotate about the origin, and then translate the center of rotation back to where it
belongs.
To tranform a point, we would multiply all the transformation matrices together to
form an overall transformation matrix.
1. The translation which moves (xc,yc) to the origin:
2. the rotation is
45
3110111040XXXXXXXXX
=
3. and the translation to move the center point back is
ALGORITHM:1. Start the program.2. Declare the variables.3. Declare the following functions.
transform()rotate()scale()
4. Translate the object one co-ordinate to another using transform() function and rotate the object using rotate function.5. Translate the object one co-ordinate to another using transform() function and change the size of object using scale() function.6. Change the size of object using scale() function and translate the object one co-ordinate to another using transform() function7. Display the object.8. Stop the program.
PROGARM:#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<math.h>#include<graphics.h>float tx,ty,tz,sx,sy,sz,r;float x[15][15],y[15][15],z[15][15];int i,j=2,ch;void transform(){
x[i][j-1]=x[i][j-1]+tx;x[i][j]=x[i][j]+tx;y[i][j-1]=y[i][j-1]+ty;y[i][j]=y[i][j]+ty;z[i][j-1]=z[i][j-1]+tz;z[i][j]=z[i][j]+tz;
}void rotate(){
if(i<=8){
x[i][j-1]=(x[i][j-1]*cos(r))-(y[i][j-1]*sin(r));y[i][j-1]=(x[i][j-1]*sin(r))+(y[i][j-1]*cos(r));
46
3110111040XXXXXXXXX
x[i][j]=(x[i][j]*cos(r))-(y[i][j]*sin(r));y[i][j]=(x[i][j]*sin(r))+(y[i][j]*cos(r));
}else{
z[i][j-1]=(z[i][j-1]*cos(r))-(y[i][j-1]*sin(r));y[i][j-1]=(z[i][j-1]*sin(r))+(y[i][j-1]*cos(r));z[i][j]=(z[i][j]*cos(r))-(y[i][j]*sin(r));y[i][j]=(z[i][j]*sin(r))+(y[i][j]*cos(r));
}}void scale(){
x[i][j-1]=x[i][j-1]*sx;x[i][j]=x[i][j]*sx;y[i][j-1]=y[i][j-1]*sy;y[i][j]=y[i][j]*sy;z[i][j-1]=z[i][j-1]*sz;z[i][j]=z[i][j]*sz;
}int main(){
int gd=DETECT,gm;initgraph(&gd,&gm,"c:\\tc\\bgi");x[1][1]=200,x[1][2]=250,y[1][1]=200,y[1][2]=200;x[2][1]=200,x[2][2]=200,y[2][1]=200,y[2][2]=150;x[3][1]=200,x[3][2]=250,y[3][1]=150,y[3][2]=150;x[4][1]=250,x[4][2]=250,y[4][1]=150,y[4][2]=200;x[5][1]=220,x[5][2]=270,y[5][1]=140,y[5][2]=140;x[6][1]=270,x[6][2]=270,y[6][1]=140,y[6][2]=190;x[7][1]=220,x[7][2]=220,y[7][1]=140,y[7][2]=190;x[8][1]=220,x[8][2]=270,y[8][1]=190,y[8][2]=190;z[9][1]=200,z[9][2]=220,y[9][1]=150,y[9][2]=140;z[10][1]=250,z[10][2]=270,y[10][1]=150,y[10][2]=140;z[11][1]=250,z[11][2]=270,y[11][1]=200,y[11][2]=190;z[12][1]=220,z[12][2]=200,y[12][1]=190,y[12][2]=200;textattr(0);for(i=1;i<=12;i++){
if(i<=8)line(x[i][j-1],y[i][j-1],x[i][j],y[i][j]);
elseline(z[i][j-1],y[i][j-1],z[i][j],y[i][j]);
}while(ch!=4){
printf("\n 3D-COMPOSITE TRANSFORMATION");printf("\n1.TRANSLATION & ROTATION");printf("\n2.TRANSLATION & SCALING");printf("\n3.SCALING & ROTATION");
47
3110111040XXXXXXXXX
printf("\n4.EXIT");printf("\nENTER YOUR CHOICE:");scanf("%d",&ch);switch(ch){
case 1:printf("\nENTER X Y & Z VALUES:");scanf("%f%f%f",&tx,&ty,&tz);printf("\nENTER ROTATION ANGLE:");scanf("%f",&r);clrscr();r=(r*3.14/180);for(i=1;i<=12;i++){
transform();rotate();if(i<=8)
line(x[i][j-1],y[i][j-1],x[i][j],y[i][j]);else
line(z[i][j-1],y[i][j-1],z[i][j],y[i][j]);delay(500);
}break;
case 2:printf("\nENTER X Y & Z VALUES:");scanf("%f%f%f",&tx,&ty,&tz);printf("\nENTER X Y & Z VECTORS:");scanf("%f%f%f",&sx,&sy,&sz);clrscr();for(i=1;i<=12;i++){
transform();scale();if(i<=8)
line(x[i][j-1],y[i][j-1],x[i][j],y[i][j]);else
line(z[i][j-1],y[i][j-1],z[i][j],y[i][j]);delay(500);
}break;
case 3:printf("\nENTER X Y & Z VECTORS:");scanf("%f%f%f",&sx,&sy,&sz);printf("\nENTER ROTATION ANGLE:");scanf("%f",&r);clrscr();r=(r*3.14/180);for(i=1;i<=12;i++){
scale();
48
3110111040XXXXXXXXX
rotate();if(i<=8)
line(x[i][j-1],y[i][j-1],x[i][j],y[i][j]);else
line(z[i][j-1],y[i][j-1],z[i][j],y[i][j]);delay(500);
}break;
case 4:printf("\nEND OF PROGRAM");exit(0);break;
}}getch();return 0;
}
OUTPUT:/* 3D-COMPOSITE TRANSFORMATION */1. TRANSLATION & ROTATION2.TRANSLATION & SCALING3.SCALING & ROTATION4.EXITENTER YOUR CHOICE:ENTER YOUR CHOICE:1ENTER YOUR X,Y &Z VECTORS: 1 1 1ENTER ROTATION ANGLE : 201. TRANSLATION & ROTATION2.TRANSLATION & SCALING3.SCALING & ROTATION4.EXITENTER YOUR CHOICE:2ENTER YOUR X ,Y & Z VALUES: 2 2 2ENTER YOUR X ,Y & Z VECTORS : 3 21. TRANSLATION & ROTATION2.TRANSLATION & SCALING3.SCALING & ROTATION4.EXITENTER YOUR CHOICE:3ENTER YOUR X,Y & Z VECTORS :1.3 1.4 1.3ENTER ROTATION ANGLE : 25
49
3110111040XXXXXXXXX
1. TRANSLATION & ROTATION2.TRANSLATION & SCALING3.SCALING & ROTATION4.EXITENTER YOUR CHOICE:4END OF THE PROGRAM
RESULT:Thus the program has been executed and verified successfully.
EX NO :8 COHEN SUTHERLAND 2D LINE CLIPPING AND WINDOWING DATE :
AIM:
To study and Implement Cohen Sutherland 2D line clipping and Windowing
ALGORITHM:
1. Start
2. Input two endpoints of the line say p1 ( x 1 , y1 ) and p2 ( x 2 , y 2 )
3. Input two corners (Let-top and right -bottom ) of the window , say(wx1 ,wy1 and wx2
, wy2)
4. Assign the region codes for two endpoints p1 and p2 using following steps :
Initialize code with bits 0000
Set Bit1 =0 if (x < wx1 )
Set Bit2 =0 if (x < wx2 )
50
3110111040XXXXXXXXX
Set Bit3 =0 if (y < wy2 )
Set Bit4 =0 if (y < wy1 )
5. Check for visibility of line
a. If region codes for both endpoints p1 and p2 are zero then the line is completely
visible. Hence draw the line and go to step 9
b. If region codes for both endpoints are not zero and the logical ANDing of them is also
nonzero then the line is completely invisible. So reject the ling and go to 9
c. If region codes for two endpoints do not satisfy the condition in (4a and 4b the line is
partially visible.
6. Determine the intersecting edge of the clipping window by inspecting the region codes
of two endpoints
a. If region codes for both endpoints are non- zero, find intersecting point p'1 and p'2
with boundary edges of clipping window with respect to point p1 and point p2
respectively
b. If region codes for any one endpoints are non-zero, find intersecting point p'1 or p'2
with boundary edges of clipping window with respect to it.
7. Divide the Line segments considering intersection points
8. Reject the line segments if any one endpoint of it appears outsides the clipping
window
9. Draw the remaining line segments
10.Stop
PROGRAM:
#include<stdio.h>#include<conio.h>#include<graphics.h>#define LEFT_EDGE 0x1#define RIGHT_EDGE 0x2#define BOTTOM_EDGE 0x4#define TOP_EDGE 0x8#define INSIDE(a) (!a)#define REJECT(a,b) (a&b)#define ACCEPT(a,b) (!(a|b))#define FALSE 0#define TRUE 1struct point{
51
3110111040XXXXXXXXX
int x;int y;
}p1,p2,tmp;struct win{
int x;int y;
}winmin,winmax;unsigned char encode(struct point pt,struct win winmin,struct win winmax){
unsigned char code=0x00;if(pt.x<winmin.x)
code=code|LEFT_EDGE;if(pt.x>winmax.x)
code=code|RIGHT_EDGE;if(pt.y<winmin.y)
code=code|BOTTOM_EDGE;if(pt.y>winmax.y)
code=code|TOP_EDGE;return(code);
}void swappts(struct point *p1,struct point *p2){
tmp=*p1;*p1=*p2;*p2=tmp;
}void swapcodes(unsigned char *c1,unsigned char *c2){
unsigned char tmp;tmp=*c1;*c1=*c2;*c2=tmp;
}void clipline(struct win winmin, struct win winmax,struct point p1,struct point p2){
unsigned char code1,code2;int done=FALSE,draw=FALSE;float m;while(!done){
code1=encode(p1,winmin,winmax);code2=encode(p2,winmin,winmax);if(ACCEPT(code1,code2)){
done=TRUE;draw=TRUE;
}else if(REJECT(code1,code2))
done=TRUE;
52
3110111040XXXXXXXXX
else{
if(INSIDE(code1)){
swappts(&p1,&p2);swapcodes(&code1,&code2);
}if(p2.x!=p1.x)
m=(p2.y-p1.y)/(p2.x-p1.x);if(code1 &LEFT_EDGE){
p1.y+=(winmin.x-p1.x)*m;p1.x=winmin.x;
}else if(code1 &RIGHT_EDGE){
p1.y+=(winmax.x-p1.x)*m;p1.x=winmax.x;
}else if(code1 &BOTTOM_EDGE){
if(p2.x!=p1.x)p1.x+=(winmin.y-p1.y)/m;
p1.y=winmin.y;}else if(code1 &TOP_EDGE){
if(p2.x!=p1.x)p1.x+=(winmax.y-p1.y)/m;
p1.y=winmax.y;}
}}if(draw)line(p1.x,p1.y,p2.x,p2.y);
}void main(){
int c,gm,gr;clrscr();printf("\nEnter the window minimum coordinates");scanf("%d%d",&winmin.x,&winmin.y);printf("\nEnter the window max coordinates");scanf("%d%d",&winmax.x,&winmax.y);printf("\nEnter the starting point");scanf("%d%d",&p1.x,&p1.y);printf("\nenter the end point");scanf("%d%d",&p2.x,&p2.y);detectgraph(&gm,&gr);initgraph(&gm,&gr,"d:\\tc\\BGI");
53
3110111040XXXXXXXXX
printf("Before Clipping");line(p1.x,p1.y,p2.x,p2.y);rectangle(winmin.x,winmax.y,winmax.x,winmin.y);getch();clrscr();cleardevice();printf("After Clipping");rectangle(winmin.x,winmax.y,winmax.x,winmin.y);clipline(winmin,winmax,p1,p2);getch();
}
OUTPUT:Enter the window minimum coordinates: 100 100Enter the window maximum coordinates: 200 200
Enter the starting point: 150 150Enter the ending point: 200 200
54
3110111040XXXXXXXXX
RESULT:
Thus the program was successfully created and executed
55
3110111040XXXXXXXXX
EX NO :9 SUTHERLAND-HODGEMAN POLYGON CLIPPING ALGORITHMDATE :
AIM:
To implement polygon clipping.
ALGORITHM:
1. Get the minimum and maximum coordinates of both window and view port.
2. Get the number of sides of a polygon and its corresponding coordinates.
3. If the polygon lies within region code window, display it.
4. If any one of the polygon side is neither inside nor outside the boundary, find point of
intersection and clip the regions that lies outside the boundary.
5. Display the polygon after clipping
PROGRAM:
#include<stdio.h>#include<conio.h>#include<graphics.h>#include<math.h>void clip(float,float,float);int i,j=0,n;int rx1,rx2,ry1,ry2;float x1[8],y1[8];void main(){
int gd=DETECT,gm;int i,n;float x[8],y[8],m;clrscr();initgraph(&gd,&gm,"");printf("coordinates for rectangle : ");scanf("%d%d%d%d",&rx1,&ry1,&rx2,&ry2);printf("no. of sides for polygon : ");scanf("%d",&n);printf("coordinates : ");
for(i=0;i<n;i++){
scanf("%f%f",&x[i],&y[i]);}
56
3110111040XXXXXXXXX
cleardevice();outtextxy(10,10,"Before clipping");outtextxy(10,470,"Press any key....");rectangle(rx1,ry1,rx2,ry2);for(i=0;i<n-1;i++)
line(x[i],y[i],x[i+1],y[i+1]);line(x[i],y[i],x[0],y[0]);getch();cleardevice();for(i=0;i<n-1;i++){
m=(y[i+1]-y[i])/(x[i+1]-x[i]);clip(x[i],y[i],m);clip(x[i+1],y[i+1],m);
}m=(y[i]-y[0])/(x[i]-x[0]);clip(x[i],y[i],m);clip(x[0],y[0],m);outtextxy(10,10,"After clipping");outtextxy(10,470,"Press any key....");rectangle(rx1,ry1,rx2,ry2);for(i=0;i<j-1;i++)
line(x1[i],y1[i],x1[i+1],y1[i+1]);getch();
}
void clip(float e,float f,float m){
while(e<rx1 || e>rx2 || f<ry1 || f>ry2){
if(e<rx1){
f+=m*(rx1-e);e=rx1;
}
else if(e>rx2){
f+=m*(rx2-e);e=rx2;
}if(f<ry1)
57
3110111040XXXXXXXXX
{e+=(ry1-f)/m;f=ry1;
}else if(f>ry2){
e+=(ry2-f)/m;f=ry2;
}}x1[j]=e;y1[j]=f;j++;
}
OUTPUT:
RESULT:
Thus the program was successfully created and executed
58
3110111040XXXXXXXXX
EX NO :10 DRAWING 3D OBJECTS AND SCENES USING OPEN GL
DATE :
AIM:To draw three dimensional objects and scenes using OPENGL
PROCEDURE:
Steps to add opengl files in Microsoft visual studio 2010: 1. Open Microsoft Visual Studio 2010.2. File -> New -> Project -> Other Languages -> Visual C++ -> Empty Project.3. Enter project name and click OK.4. Right click on the project in the Solution Explorer (in RHS) and select Add -> new item.5. Select C++ File(.cpp), Enter file name and click Add.6. To hide other folders click on Show All Files icon at the top of Solution Explorer (Second icon from left).7. Right Click the project in the Solution Explorer and select Open Folder in Windows Explorer.8. Copy the Folder freeglut\include\gl (gl in small letters) to the folder opened in step 7.9. Copy the File freeglut\lib\freeglut.lib to the folder opened in Step 7.10.Copy the File freeglut\bin\freeglut.dll to the folder opened in Step 7.11. Refresh the Project in Solution Explorer.12. Right Click all the newly added file and select Include in Project.13. Write the code in the .cpp file created in step 5.
ALGORITHM:Main:
1.Initialise glut and create window. 2.Register call backs.3.Create a render function to render the desired shape and rotate it.4.Call glutMainLoop().RenderScene:1.Clear color and depth buffers.2.Reset transformations.3.Set the camera position.4.Rotate the object using glRotatef();5.Switch between the 3D objects according to the choice.6.End using glEnd().
59
3110111040XXXXXXXXX
PROGRAM:
#include "conio.h"#include "stdio.h"#include "gl\glut.h"#include "gl\freeglut.h"using namespace std;
float angle = 0.0f;int choice;
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short// (you cant make a window of zero width).if (h == 0)
h = 1;float ratio = w * 1.0 / h;
// Use the Projection MatrixglMatrixMode(GL_PROJECTION);
// Reset MatrixglLoadIdentity();
// Set the viewport to be the entire windowglViewport(0, 0, w, h);
// Set the correct perspective.gluPerspective(45.0f, ratio, 0.1f, 100.0f);
// Get Back to the ModelviewglMatrixMode(GL_MODELVIEW);
}void renderScene(void) {
// Clear Color and Depth BuffersglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformationsglLoadIdentity();
// Set the camera
60
3110111040XXXXXXXXX
gluLookAt(0.0f, 0.0f, 10.0f,0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f);
glRotatef(angle, 1.0f, 0.0f, 0.0f);
switch(choice){
case 1: glutWireTeapot(1); break;
case 2: glutWireTorus(1,3,20,30);break;
case 3: glutWireCone(3,5,30,30);break;
case 4: glutWireSphere(3,30,30);break;
case 5: glutWireCube(5);break;
case 6: exit(0);}
glEnd();angle+=0.1f;glutSwapBuffers();
}
int main(int argc, char **argv){
printf("3D OBJECTS AND SCENES USING OPENGL\n\n");printf("MENU\n");printf("1. TEA POT\n2. TORUS\n3. CONE\n4. SPHERE\n5. CUBE\n6. EXIT"); printf("\nEnter Choice: ");scanf("%d", &choice);
// init GLUT and create WindowglutInit(&argc, argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100,100);glutInitWindowSize(640,480);glutCreateWindow(”Objects Drawn here");
// register callbacks
61
3110111040XXXXXXXXX
glutDisplayFunc(renderScene);glutReshapeFunc(changeSize);glutIdleFunc(renderScene);
// enter GLUT event processing cycleglutMainLoop();
return 1;}
OUTPUT:
RESULT:Thus the program was successfully created and executed
62