Upload
amit-kapoor
View
2.601
Download
0
Embed Size (px)
Citation preview
1
/* Bresenham's Line drawing program */ #include<stdio.h>
#include<math.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,xs,ys,xe,ye,dx,dy,x,y,d,inc1,inc2,xend,yend;
float m;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter line starting & ending end points");
scanf("%d%d%d%d",&xs,&ys,&xe,&ye);
dx=(xe-xs);
dy=(ye-ys);
if(dx==0)
{
x=xs;
if(dy<0)
{
y=ye;
yend=ys;
}
else
2
{
y=ys;
yend=ye;
}
while(y<=yend)
{
delay(10);
putpixel(x,y,GREEN);
if(d>=0)
{
d=d+inc2;
}
else
d=d+inc1;
y=y+1;
}
}
if(dx!=0)
{
m=(float) dy/dx;
if(m<=1)
{
inc1=2*abs(dy);
inc2=2*abs(dy-dx);
d=inc1-abs(dx);
3
if(dx<0)
{
x=xe;
y=ye;
xend=xs;
}
else
{
x=xs;
y=ys;
xend=xe;
}
while(x<=xend)
{ delay(10);
putpixel(x,y,GREEN);
if(d>=0)
{
y=y+1;
d=d+inc2;
}
else
d=d+inc1;
x=x+1;
}
}
4
else if(m>1)
{
inc1=2*dx;
inc2=2*(dx-dy);
d=inc1-dy;
if(dy<0)
{
x=xe;
y=ye;
xend=xs;
}
else
{
x=xs;
y=ys;
xend=xe;
}
while(x<=xend)
{
putpixel(x,y,RED);
if(d>=0)
{
x=x+1;
d=d+inc2;
}
5
else
d=d+inc1;
y=y+1;
}
}}
getch();
}
/* Simple DDA Line drawing program */#include<stdio.h>
#include<process.h>
#include<math.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
float round(float r)
{
return(r+0.5);
}
void main()
{
int gdriver=DETECT,gmode,xs,ys,xe,ye,dx,dy,length,xend,yend;
float x,y,xinc,yinc;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter line starting & ending end points");
6
scanf("%d%d%d%d",&xs,&ys,&xe,&ye);
dx=xe-xs;
dy=ye-ys;
if(dx<0)
{
x=xe;
xend=xs;
}
else
{
x=xs;
xend=xe;
}
if(dy<0)
{
y=ye;
yend=ys;
}
else
{
y=ys;
yend=ye;
}
dx=abs(xe-xs);
dy=abs(ye-ys);
7
printf("x=%f y=%f",x,y);
if(dy>dx)
length=dy;
else
length=dx;
if(dx==0 && dy==0)
{
putpixel(x,y,YELLOW);
getch();
exit(0);
}
xinc=(float)dx/length;
yinc=(float)dy/length;
if(dx==0)
{
while(y<=yend)
{
putpixel(floor(round(x)),floor(round(y)),RED);
x=x+xinc;
y=y+yinc;
}
}
else if(dx!=0)
{
while(x<=xend)
8
{
putpixel(floor(round(x)),floor(round(y)),BLUE);
x=x+xinc;
y=y+yinc;
}}
getch();
}
/* Symmetrical DDA Line drawing program */#include<stdio.h>
#include<process.h>
#include<math.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
float round(float r)
{
return(r+0.5);
}
void main()
{
int gdriver=DETECT,gmode,xs,ys,xe,ye,dx,dy,length,xend,yend;
float x,y,xinc,yinc,n;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter line starting & ending end points");
9
scanf("%d%d%d%d",&xs,&ys,&xe,&ye);
dx=xe-xs;
dy=ye-ys;
if(dx<0)
{
x=xe;
xend=xs;
}
else
{
x=xs;
xend=xe;
}
if(dy<0)
{
y=ye;
yend=ys;
}
else
{
y=ys;
yend=ye;
}
dx=abs(xe-xs);
dy=abs(ye-ys);
10
printf("x=%f y=%f",x,y);
if(dy>dx)
length=dy;
else
length=dx;
if(dx==0 && dy==0)
{
putpixel(x,y,YELLOW);
getch();
exit(0);
}
n=log(length)/log(2);
xinc=(float)dx/pow(2,ceil(n));
yinc=(float)dy/pow(2,ceil(n));
if(dx==0)
{
while(y<=yend)
{
putpixel(floor(round(x)),floor(round(y)),RED);
x=x+xinc;
y=y+yinc;
}
}
else if(dx!=0)
{
11
while(x<=xend)
{
putpixel(floor(round(x)),floor(round(y)),BLUE);
x=x+xinc;
y=y+yinc;
}}
getch();
}
/* Circle drawing program using Trigonometric method*/#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,r,h,k;
float xend,x,y,temp,thetainc,theta,thetaend,angle;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter centre coordinates and radius of circle");
scanf("%d%d%d",&h,&k,&r);
temp=3.141/180;
thetainc=1.0/r;
theta=0;
thetaend=45;
12
while(theta<=thetaend)
{
angle=temp*theta;
x=r*cos(angle);
y=r*sin(angle);
putpixel(x+h,y+k,RED);
putpixel(y+h,x+k,RED);
putpixel(-y+h,x+k,RED);
putpixel(-x+h,y+k,RED);
putpixel(-x+h,-y+k,RED);
putpixel(-y+h,-x+k,RED);
putpixel(y+h,-x+k,RED);
putpixel(x+h,-y+k,RED);
theta=theta+thetainc;
}
getch();
}
/* Circle drawing program using Polynomial method*/#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,r,h,k;
13
float xend,x,y;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter centre coordinates and radius of circle");
scanf("%d%d%d",&h,&k,&r);
xend=r/1.414;
x=0;
y=r;
while(x<=xend)
{
y=sqrt(r*r-x*x);
putpixel(x+h,y+k,RED);
putpixel(y+h,x+k,RED);
putpixel(-y+h,x+k,RED);
putpixel(-x+h,y+k,RED);
putpixel(-x+h,-y+k,RED);
putpixel(-y+h,-x+k,RED);
putpixel(y+h,-x+k,RED);
putpixel(x+h,-y+k,RED);
x++;
}
getch();
}
14
/* Circle drawing program using Bresenham's method*/#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,r,h,k,x,y,d;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter centre coordinates and radius of circle");
scanf("%d%d%d",&h,&k,&r);
x=0;
y=r;
d=3-2*r;
while(x<=y)
{
putpixel(x+h,y+k,RED);
putpixel(y+h,x+k,RED);
putpixel(-y+h,x+k,RED);
putpixel(-x+h,y+k,RED);
putpixel(-x+h,-y+k,RED);
putpixel(-y+h,-x+k,RED);
putpixel(y+h,-x+k,RED);
putpixel(x+h,-y+k,RED);
15
if(d<0)
d=d+4*x+6;
else
{
d=d+4*(x-y)+10;
y--;
}
x++;
}
getch();
}
/* Circle drawing program using Mid-Point method*/#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,r,h,k,x,y,d;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter centre coordinates and radius of circle");
scanf("%d%d%d",&h,&k,&r);
x=0;
y=r;
16
d=1-r;
while(x<=y)
{
putpixel(x+h,y+k,RED);
putpixel(y+h,x+k,RED);
putpixel(-y+h,x+k,RED);
putpixel(-x+h,y+k,RED);
putpixel(-x+h,-y+k,RED);
putpixel(-y+h,-x+k,RED);
putpixel(y+h,-x+k,RED);
putpixel(x+h,-y+k,RED);
if(d<0)
d=d+2*x+3;
else
{
d=d+2*(x-y)+5;
y--;
}
x++;
}
getch();
}
17
/* Ellipse drawing program using Trigonometric method*/#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,r,h,k,a,b;
float xend,x,y,temp,thetainc,theta,thetaend,angle;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter centre coordinates of ellipse");
scanf("%d%d",&h,&k);
printf("enter major and minor axis of ellipse");
scanf("%d%d",&a,&b);
temp=3.141/180;
thetainc=3.141/(2*a);
theta=0;
thetaend=90;
while(theta<=thetaend)
{
angle=temp*theta;
x=a*cos(angle);
y=b*sin(angle);
putpixel(x+h,y+k,RED);
18
putpixel(-x+h,y+k,RED);
putpixel(-x+h,-y+k,RED);
putpixel(x+h,-y+k,RED);
theta=theta+thetainc;
}
getch();
}
/* Ellipse drawing program using Polynomial method*/#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gdriver=DETECT,gmode,r,h,k,a,b;
float xend,x,y;
clrscr();
initgraph(&gdriver,&gmode,"");
printf("enter centre coordinates of ellipse");
scanf("%d%d",&h,&k);
printf("enter major and minor axis of ellipse");
scanf("%d%d",&a,&b);
x=0;
xend=a;
while(x<=xend)
19
{
y=b*sqrt(1-(x*x)/(a*a));
putpixel(x+h,y+k,RED);
putpixel(-x+h,y+k,RED);
putpixel(-x+h,-y+k,RED);
putpixel(x+h,-y+k,RED);
x++;
}
getch();
}
Laing Barsky line clipping algorithm
#include<graphics.h>
#include<dos.h>
#include<conio.h>
#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 ;
20
int x11 , y11 , x22 , y22 ;
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 ) ) )
{
21
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 )
{
22
r2 = (float ) q2 /p2 ;
if( p2 < 0 )
u1 = max(r2 , u1 );
else
u2 = min(r2 , u2 );
}
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 )
23
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 coordinate 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);
24
setcolor(3);
line(x11,y11,x22,y22);
getch();
}
}
}
2d transformation#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>
int x1,y1,x2,y2;
void translation()
{
int tx,ty,xn1,xn2,yn1,yn2;
printf("Enter the Translation Vector:");
scanf("%d\n%d",&tx,&ty);
cleardevice();
outtextxy(400,100,"TRANSLATION");
xn1=x1+tx;
yn1=y1+ty;
xn2=x2+tx;
yn2=y2+ty;
line(x1,y1,x2,y2);
line(xn1,yn1,xn2,yn2);
25
getch();
}
void scaling()
{
int xn1,yn1,xn2,yn2;
float sx,sy;
printf("Enter the Sacling Factor:");
scanf("%f%f",&sx,&sy);
cleardevice();
outtextxy(300,200,"SCALING");
xn1=x1*sx;
yn1=y1*sy;
xn2=x2*sx;
yn2=y2*sy;
line(x1,y1,x2,y2);
line(xn1,yn1,xn2,yn2);
getch();
}
void rotation()
{
int r;
float rx,xn1,yn1,xn2,yn2;
printf("Enter the Angle for Rotation:");
scanf("%d",&r);
cleardevice();
26
outtextxy(500,200,"ROTATION");
rx=(r*3.14)/180;
xn1=x1*cos(rx)-y1*sin(rx);
yn1=y1*cos(rx)+x1*sin(rx);
xn2=x2*cos(rx)-y2*sin(rx);
yn2=y2*cos(rx)+x2*sin(rx);
line(x1,y1,x2,y2);
line(xn1,yn1,xn2,yn2);
getch();
}
void shearing()
{
int sh;
float xn1,yn1,xn2,yn2;
printf("Enter the value of Shearing");
scanf("%d",&sh);
cleardevice();
outtextxy(500,100,"SHEARING");
xn1=x1+sh*y1;
yn1=y1;
xn2=x2+sh*y2;
yn2=y2;
line(x1,y1,x2,y2);
line(xn1,yn1,xn2,yn2);
getch();
27
}
void reflection()
{
int xn1,yn1,xn2,yn2;
cleardevice();
outtextxy(300,100,"REFLECTION");
if((x1<y1)||(x2<y2))
{
xn1=x1+50;
xn2=x2+50;
yn1=y1;
yn2=y2;
}
else
{
xn1=x1;
xn2=x2;
yn1=y1+50;
yn2=y2+50;
}
line(x1,y1,x2,y2);
line(xn1,yn1,xn2,yn2);
getch();
}
void get()
28
{
printf("Enter the Co-ordinates x1,y1,x2,y2:");
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
cleardevice();
outtextxy(200,100,"ORIGINAL OBJECT");
line(x1,y1,x2,y2);
getch();
}
void main()
{
int ch,gd=DETECT,gm;
initgraph(&gd,&gm,"C:/tc/bgi");
get();
do
{
cleardevice();
outtextxy(10,10,"1.Translation");
outtextxy(10,20,"2.Scaling");
outtextxy(10,30,"3.Rotation");
outtextxy(10,40,"4.Shearing");
outtextxy(10,50,"5.Reflection");
outtextxy(10,60,"6.Exit");
outtextxy(10,70,"Enter Your Choice:");
scanf("%d",&ch);
switch(ch)
29
{
case 1:
{
translation();
break;
}
case 2:
{
scaling();
break;
}
case 3:
{
rotation();
break;
}
case 4:
{
shearing();
break;
}
case 5:
{
reflection();
break;
30
}
case 6:
{
exit(0);
break;
}
}
}
while(ch<6);
}
2d Viewing Transformation#include<stdio.h>
#include<conio.h>
#include<graphics.h>
void main()
{
int gm,gr,xwmin,ywmin,xwmax,
ywmax,xvmin,yvmin,xvmax,yvmax,xw,yw,xv,yv,sx,sy;
clrscr();
detectgraph(&gm,&gr);
initgraph(&gm,&gr,"d:\\tc\\BGI");
printf("Enter the window min coordinate(xwmin,ywmin):\n");
scanf("%d%d",&xwmin,&ywmin);
printf("Enter the window max coordinate(xwmax,ywmax):\n");
31
scanf("%d%d",&xwmax,&ywmax);
printf("Enter the viewport min coordinate(xvmin,yvmin):\n");
scanf("%d%d",&xvmin,&yvmin);
printf("Enter the viewport max coordinate(xvmax,yvmax):\n");
scanf("%d%d",&xvmax,&yvmax);
sx=(xvmax-xvmin)/(xwmax-xwmin);
sy=(yvmax-yvmin)/(ywmax-ywmin);
printf("Enter the point coordinate(xw,yw) in the window:\n");
scanf("%d%d",&xw,&yw);
xv=(sx*(xw-xwmin))+xvmin;
yv=(sy*(yw-ywmin))+yvmin;
cleardevice();
getch();
rectangle(xwmin,ywmax,xwmax,ywmin);
putpixel(xw,yw,15); getch();
cleardevice();getch();
rectangle(xvmin,yvmax,xvmax,yvmin);
putpixel(xv,yv,15);
getch();
}