#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
void initgraph()
{
int pg=DETECT,mg;
clrscr();
initgraph(&pg,&mg,"..\\bgi");
}
void repere()
{
setbkcolor(0);
setcolor(15);
line(0,240,640,240);
line(320,0,320,480);
}
void pixel(int x,int y)
{
x=x+320;
y=240-y;
putpixel(x,y,11);
}
void pixel0(int x,int y)
{
x=x+320;
y=240-y;
putpixel(x,y,0);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////les fonctions des 8 octants/////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ligne1(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*dy-dx;
while (i<=dx)
{if (s>=0)
{x++;y++;s+=2*(dy-dx);}
else
{x++;s+=2*dy;}
pixel(x,y);
i++;
}
}
void ligne2(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*dx-dy;
while (i<=dy)
{if (s>=0)
{x++;y++;s+=2*(dx-dy);}
else
{y++;s+=2*dx;}
pixel(x,y);
i++;
}
}
void ligne3(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*(-dx)-dy;
while (i<=dy)
{if (s>=0)
{x--;y++;s+=2*((-dx)-dy);}
else
{y++;s+=2*(-dx);}
pixel(x,y);
i++;
}
}
void ligne4(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*dy+dx;
while (i<=(-dx))
{if (s>=0)
{x--;y++;s+=2*(dy+dx);}
else
{x--;s+=2*dy;}
pixel(x,y);
i++;
}
}
void ligne5(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*(-dy)+dx;
while (i<=(-dx))
{if (s>=0)
{x--;y--;s+=2*(-dy+dx);}
else
{x--;s+=2*(-dy);}
pixel(x,y);
i++;
}
}
void ligne6(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*(-dx)+dy;
while (i<=(-dy))
{if (s>=0)
{x--;y--;s+=2*(-dx+dy);}
else
{y--;s+=2*(-dx);}
pixel(x,y);
i++;
}
}
void ligne7(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*dx+dy;
while (i<=(-dy))
{if (s>=0)
{x++;y--;s+=2*(dx+dy);}
else
{y--;s+=2*(dx);}
pixel(x,y);
i++;
}
}
void ligne8(int xd,int yd,int xf,int yf)
{
int x=xd;
int y=yd;
int dx=xf-xd;
int dy=yf-yd;
int i=1;
int s=2*(-dy)-dx;
while (i<=dx)
{if (s>=0)
{x++;y--;s+=2*(-dy-dx);}
else
{x++;s+=2*(-dy);}
pixel(x,y);
i++;
}
}
/////////////////////////////////////////////////////////////////////////////
//////////////////un segment par la m‚thode polynomiale//////////////////////
/////////////////////////////////////////////////////////////////////////////
void polynomiale(int xd,int yd,int xf,int yf)
{
int x,y,dx,dy,px,py;
float a,b;
dx=xf-xd;
dy=yf-yd;
px=(xd>xf)?-1:1;
py=(yd>yf)?-1:1;
pixel(xd,yd);
pixel(xf,yf);
if( abs(dx)>=abs(dy) )
{ a=(float)dy/dx;
b=yd-xd*a;
for (x=xd+px ; x!=xf ; x=x+px )
{ y=a*x+b;
pixel(x,y);
}
}
else
{ a=(float)dx/dy;
b=xd-yd*a;
for(y=yd+py ; y!=yf ; y=y+py)
{ x=a*y+b;
pixel(x,y);
}
}
}
/////////////////////////////////////////////////////////////////////////////
/////////////////la m‚thode g‚n‚rale de Bresenham////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void ligne(int xd,int yd,int xf,int yf)
{
int x=xd,y=yd,dx=abs(xf-xd),dy=abs(yf-yd),s,px,py;
int i=1;
px=(xd>xf)?-1:1;
py=(yd>yf)?-1:1;
if (dx>=dy)
{ s=2*dy-dx;
while(i<=dx)
{ if (s>=0)
{x=x+px;
y=y+py;
s=s+2*(dy-dx);
}
else
{x=x+px;
s=s+2*dy;
}
pixel(x,y);
i++;
}
}
else
{ s=2*dx-dy;
while(i<=dy)
{ if (s>=0)
{x=x+px;
y=y+py;
s=s+2*(dx-dy);
}
else
{y=y+py;
s=s+2*dx;
}
pixel(x,y);
i++;
}
}
}
/////////////////////////////////////////////////////////////////////////////
/////////////////le cercle par la m‚thode de Bresenham///////////////////////
/////////////////////////////////////////////////////////////////////////////
void cercle (int r,int h,int k)
{
int x=0;
int y=r;
int s=3-2*r;
while (x<y)
if (s>0)
{
s=s+4*(x-y)+10;
x++;
y--;
pixel(x+h,y+k);
pixel(y+h,x+k);
pixel(-y+h,x+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(-y+h,-x+k);
pixel(y+h,-x+k);
pixel(x+h,-y+k);
}
else
{
s=s+4*x+6;
x++;
pixel(x+h,y+k);
pixel(y+h,x+k);
pixel(-y+h,x+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(-y+h,-x+k);
pixel(y+h,-x+k);
pixel(x+h,-y+k);
}
}
void cercle0 (int r,int h,int k)
{int x=0;
int y=r;
int s=3-2*r;
while (x<y)
if (s>0)
{ s=s+4*(x-y)+10;
x++;
y--;
pixel0(x+h,y+k);
pixel0(y+h,x+k);
pixel0(-y+h,x+k);
pixel0(-x+h,y+k);
pixel0(-x+h,-y+k);
pixel0(-y+h,-x+k);
pixel0(y+h,-x+k);
pixel0(x+h,-y+k);
}
else
{ s=s+4*x+6;
x++;
pixel0(x+h,y+k);
pixel0(y+h,x+k);
pixel0(-y+h,x+k);
pixel0(-x+h,y+k);
pixel0(-x+h,-y+k);
pixel0(-y+h,-x+k);
pixel0(y+h,-x+k);
pixel0(x+h,-y+k);
}
}
/////////////////////////////////////////////////////////////////////////////
////////////////////le cercle par la m‚thode polynomiale/////////////////////
/////////////////////////////////////////////////////////////////////////////
void cercle_polynomiale(long r,int h,int k)
{
int x=0,y;
for(x=0 ; x<(r/sqrt(2)) ; x++)
{
y=sqrt(r*r-x*x);
pixel(x+h,y+k);
pixel(y+h,x+k);
pixel(-y+h,x+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(-y+h,-x+k);
pixel(y+h,-x+k);
pixel(x+h,-y+k);
}
}
////////////////////////////////////////////////////////////////////////////
///////////////////le cercle par la m‚thode trigonometrique/////////////////
////////////////////////////////////////////////////////////////////////////
void cercle_trig(int r,int h,int k)
{int x,y;
float i,p=M_PI/2000;
for(i=0 ; i<M_PI/4 ; i+=p)
{ x=(int)r*cos(i);
y=(int)r*sin(i);
pixel(x+h,y+k);
pixel(y+h,x+k);
pixel(-y+h,x+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(-y+h,-x+k);
pixel(y+h,-x+k);
pixel(x+h,-y+k);
}
}
////////////////////////////////////////////////////////////////////////////
////////////////l'ellipse par la m‚thode trigonometrique////////////////////
////////////////////////////////////////////////////////////////////////////
void ellipse_trig(int a,int b,int h,int k)
{int x,y;
float i,p=M_PI/2000;
for(i=0 ; i<M_PI/2 ; i+=p)
{ x=(int)a*cos(i);
y=(int)b*sin(i);
pixel(x+h,y+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(x+h,-y+k);
}
}
/////////////////////////////////////////////////////////////////////////////
////////////////////l'ellipse par la m‚thode de Bresenham////////////////////
/////////////////////////////////////////////////////////////////////////////
void ellipse (float a,float b,int h,int k)
{ int x,y;
float S1,S2 ;
x = 0 ;
y = b ;
S1 = 2*b*b - 2*a*a*b + a*a ;
while ( a*a*(y-1) > b*b*(x+1) )
{
if ( S1 > 0 )
{
S1 += b*b*(4*x+6) + a*a*(-4*y+4) ;
x++ ;
y-- ;
}
else
{
S1 += b*b*(4*x+6) ;
x++ ;
}
pixel(x+h,y+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(x+h,-y+k);
}
S2 = b*b*(x+1)*(x+1) + a*a*(y-1)*(y-1) - a*a*b*b ;
while ( y > 0 )
{
if (S2<0)
{
S2 += b*b*(2*x+3) + a*a*(-2*y+3) ;
y-- ;
x++ ;
}
else
{
S2 += a*a*(-2*y+3) ;
y-- ;
}
pixel(x+h,y+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(x+h,-y+k);
}
}
/////////////////////////////////////////////////////////////////////////////
//////////////////l'ellipse par la m‚thode polynomiale///////////////////////
/////////////////////////////////////////////////////////////////////////////
void ellipse_polynomiale(float a,float b,int h,int k)
{
float x,y,p=0.01;
for(x=0 ; x<a ; x+=p)
{ y=sqrt(b*b*(1-(x*x)/(a*a)));
pixel(x+h,y+k);
pixel(-x+h,y+k);
pixel(-x+h,-y+k);
pixel(x+h,-y+k);
}
}
/////////////////////////////////////////////////////////////////////////////
//////////////////////////le programme g‚n‚ral///////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void main()
{
int n;
clrscr();
{textcolor(12);
cprintf(" ************************** ");
printf("\n");
cprintf("\n ***** TP:Infographie realise par ghizlane salem***** ");
printf("\n");
cprintf("\n ************************** \n\n\n\n");
printf("\n");
textcolor(11);
cprintf("Entrer ce que vous voulez tracer svp:");
printf("\n");
cprintf("-------------------------------------\n\n\n");
printf("\n");
printf("\t 1-Un segment par la m‚thode de Bresenham des 8 octants;\n\n");
printf("\t 2-Un segment par la formule g‚n‚rale de Bresenham;\n\n");
printf("\t 3-Un segment par la m‚thode polynomiale;\n\n");
printf("\t 4-Un cercle par la m‚thode de Bresenham;\n\n");
printf("\t 5-Un cercle par la m‚thode polynomiale;\n\n");
printf("\t 6-Un cercle par la m‚thode trigometrique;\n\n");
printf("\t 7-Un cercle de rayon croissant;\n\n");
printf("\t 8-Une ellipse par la m‚thode de Bresenham;\n\n");
printf("\t 9-Une ellipse par la m‚thode polynomiale;\n\n");
printf("\t10-Une ellipse par la m‚thode trigonometrique;\n\n\n");
printf("\n");
textcolor(11);
cprintf("Entrer n:");
printf("\n");
scanf("%d",&n);
switch(n)
{
case 1:
{
int xd,yd,xf,yf;
clrscr();
initgraph();
repere();
printf("Entrer xd,yd,xf et yf:\n");
scanf("%d%d%d%d",&xd,&yd,&xf,&yf);
int dx=xf-xd;
int dy=yf-yd;
int x=xd;
int y=yd;
if(y>=0)
if (x>=0)
if(dx>=dy)
ligne1(xd,yd,xf,yf) ;
else
ligne2(xd,yd,xf,yf);
else if(dy>=(-dx))
ligne3(xd,yd,xf,yf);
else
ligne4(xd,yd,xf,yf);
else if(x<=0)
if ((-dx)>=(-dy))
ligne5(xd,yd,xf,yf);
else
ligne6(xd,yd,xf,yf);
else if ((-dy)>=dx)
ligne7(xd,yd,xf,yf);
else
ligne8(xd,yd,xf,yf);
}
break;
case 2:
{
int xd,yd,xf,yf;
initgraph();
repere();
printf("donner xd,yd,xf et yf:\n");
scanf("%d%d%d%d",&xd,&yd,&xf,&yf);
ligne(xd,yd,xf,yf);
getch();
}
break;
case 3:
{
int xd,yd,xf,yf;
initgraph();
repere();
printf("entrer xd,yd,xf et yf:\n");
scanf("%d%d%d%d",&xd,&yd,&xf,&yf);
polynomiale(xd,yd,xf,yf);
}
break;
case 4:
{
int r,h,k;
clrscr();
initgraph();
repere();
printf("donner r,h et k:\n");
scanf("%d%d%d",&r,&h,&k);
cercle(r,h,k);
}
break;
case 5:
{
int r,h,k;
clrscr();
initgraph();
repere();
printf("Donner r,h et k:\n");
scanf("%d%d%d",&r,&h,&k);
cercle_polynomiale(r,h,k);
}
break;
case 6:
{
int r,h,k;
clrscr();
initgraph();
repere();
printf("donner r,h et k:\n");
scanf("%d%d%d",&r,&h,&k);
cercle_trig(r,h,k);
}
break;
case 7:
{
int r,h,k;
clrscr();
initgraph();
repere();
printf("donnez r,h,k:\n");
scanf("%d%d%d",&r,&h,&k);
while(r<=450)
{cercle(r,h,k);
delay(100);
cercle0(r,h,k);
r=r+5;}
}
break;
case 8:
{
clrscr();
float a,b;
int h,k;
initgraph();
repere();
printf("Donner a,b,h et k:\n");
scanf("%f%f%d%d",&a,&b,&h,&k);
ellipse(a,b,h,k) ;
}
break;
case 9:
{
float a,b;
int h,k;
clrscr();
initgraph();
repere();
printf("Donner a,b,h et k:\n");
scanf("%f%f%d%d",&a,&b,&h,&k);
ellipse_polynomiale(a,b,h,k);
}
break;
case 10:
{
int a,b,h,k;
clrscr();
initgraph();
repere();
printf("donner a,b,h et k:\n");
scanf("%d%d%d%d",&a,&b,&h,&k);
ellipse_trig(a,b,h,k);
}
break;
default : printf("taper un num‚ro entre 1 et 10 :\n");
}
getch();
}}