begin process at 2012 02 12 07:25:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > CERCLE DISCRET (POINT PAR POINT) EN C++

CERCLE DISCRET (POINT PAR POINT) EN C++


 Information sur la source

 Description

Ce programme permet de dessiner un cercle discret (point par point) et d’arrondis les cordonnées réels

Source

  • int xd=0,yd=0;
  • int n=0;
  • int s=0;
  • /* Plot generates a point of the circle */
  • void plot(x,y)
  • int x,y;
  • {
  • s++;
  • cout<<"Val Of X= "<<x+xd<< " and Val of y= "<<y+yd;
  • }
  • //------------------------------------------------------void main(void)
  • {
  • s=0;
  • int ri,x,y; /* Integer part of radius point */
  • float a,rph,rpxo,rmxo,rpyo,rmyo; /* constants */
  • float xoph,xomh,yoph,yomh;
  • float r,xo,yo; /* radius and center */
  • double d; /* control value */
  • float tmp,tmp1; /* temp. value */
  • n=0;
  • //Provide the radius and the center:R,xo,yo
  • cout<<" val of R= ";
  • sin>>r;
  • xo=0;yo=0 ;
  • ri=(int)r; /* integer part of the radius */
  • r=r-0.5; /* circle of radius r'=r-0.5 is generated */
  • a=r-ri; /* corresponding fractional part of radius */
  • /* CIRCLE WITH SMALL RADIUS */
  • if (ri<=1)
  • {
  • tmp=2*r+1;
  • for(x=-2;x<=2;x++) /* the generation is brute force */
  • for(y=-2;y<=2;y++)
  • {
  • tmp1=x*x+y*y-r*r;
  • if ((tmp1>=0) && (tmp1<tmp))
  • plot(x,y);
  • }
  • }
  • else
  • {
  • // ri>1
  • /* GENERAL CASE */
  • /* Initialization of loop constants */
  • rph=r+0.5;
  • rpxo=r; rmxo=r-xo; rpyo=r+yo; rmyo=r-yo;
  • xoph=xo+0.5; xomh=xo-0.5; yoph=yo+0.5; yomh=yo-0.5;
  • /* STARTING POINT COMPUTATION */
  • y=0;
  • d=((ri-rpxo)*(ri+rmxo)+yo*yo)/2.0; /* Initial value of d for (ri,0) */
  • if (d<(a+xo)) /* does (ri+1,0) belong to the circle ? */
  • { plot(ri+1,0); /* (ri+1,0) does belong to the circle */
  • if (d>=0) { plot(ri,0); x=ri;} /* (ri,0) belongs also to the circle */
  • else { x=ri+1; d+=ri-xomh;} /* (ri,0) doesn't belong to the circle */
  • }
  • else if ((d>=0) && (d<rph)) /* does (ri,0) belong to the circle ? */
  • { plot(ri,0);
  • x=ri;
  • }
  • else /* if neither (ri+1,0) nor (ri,0) belong to the
  • circle then (ri-1,0) does */
  • {
  • x=ri-1; plot(x,0);
  • d+=xoph-ri;
  • }
  • /* END OF STARTING POINT PHASE */
  • /* GENERATION OF QUADRANT 1 */
  • while (x>0)
  • {
  • if (d<(rpyo-y)) /* Type (a) ? */
  • { d+=y-yomh;
  • y++;
  • plot(x,y);
  • }
  • else
  • { d+=xoph-x;
  • x--;
  • if (d>=0) plot(x,y); /* Type (b) ? */
  • else
  • { d+=y-yomh; /* Type (c) !*/
  • y++;
  • plot(x,y);
  • }
  • }
  • }
  • /* END OF GENERATION OF QUADRANT 1 */
  • /* LIMIT POINTS BETWEEN QUADRANT #1 AND QUADRANT #2 */
  • if (d<(rpyo-y)) /* Does (0,y+1) belong to the circle ? */
  • { d+=xoph; plot(0,y+1); x--; plot(-1,y); }
  • /* GENERATION OF QUADRANT 2 */
  • while (y>0 )
  • { if (d<(rmxo+x))
  • {
  • d+=xoph-x;
  • x--;
  • plot(x,y);
  • }
  • else
  • { d+=yoph-y;
  • y--;
  • if (d>=0) plot(x,y);
  • else
  • { d+=xoph-x;
  • x--;
  • plot(x,y);
  • }
  • }
  • }
  • /* END OF GENERATION OF QUADRANT #2 */
  • /* LIMIT POINTS BETWEEN QUADRANT #2 AND QUADRANT #3 */
  • if (d<(rpxo+x))
  • { d+=yoph; plot(x-1,0); y--; plot(x,-1); }
  • /* GENERATION OF QUADRANT #3 */
  • while (x<0)
  • { if (d<(rmyo+y))
  • { d+=yoph-y;
  • y--;
  • plot(x,y);
  • }
  • else
  • { d+=x-xomh;
  • x++;
  • if (d>=0) plot(x,y);
  • else
  • { d+=yoph-y;
  • y--;
  • plot(x,y);
  • }
  • }
  • }
  • /* END OF GENERATION OF QUADRANT #3 */
  • /* LIMIT POINTS BETWEEN QUADRANT #3 AND QUADRANT #4 */
  • if (d<(rmyo+y))
  • { d-=xomh; plot(0,y-1); x++; plot(1,y); }
  • /* GENERATION OF QUADRANT #4 */
  • while (y<0)
  • { if (d<(rpxo-x))
  • { d+=x-xomh;
  • x++;
  • plot(x,y);
  • }
  • else
  • { d+=y-yomh;
  • y++;
  • if ((d>=0)&&(y)) plot(x,y);
  • else
  • { d+=x-xomh;
  • x++;
  • if (y) plot(x,y);
  • }
  • }
  • }
  • /* END OF GENERATION OF QUADRANT #4 */
  • } /* END OF THE GENERAL CASE */
  • }
  • //------------------------------------------------------
  • GO and test
int xd=0,yd=0;
int n=0;
int s=0;
/* Plot generates a point of the circle */
void plot(x,y)
int x,y;
{
  s++;
  cout<<"Val Of X= "<<x+xd<< " and Val of y= "<<y+yd;
}
//------------------------------------------------------void main(void)
{
  s=0;
  int ri,x,y; /* Integer part of radius point */

 float a,rph,rpxo,rmxo,rpyo,rmyo; /* constants */
 float xoph,xomh,yoph,yomh;
 float r,xo,yo; /* radius and center */
 double d; /* control value */
 float tmp,tmp1; /* temp. value */
 n=0;
//Provide the radius and the center:R,xo,yo
 
 cout<<" val of R= ";
 sin>>r;
 
 xo=0;yo=0 ;
 ri=(int)r; /* integer part of the radius */
 r=r-0.5; /* circle of radius r'=r-0.5 is generated */
 a=r-ri; /* corresponding fractional part of radius */
/* CIRCLE WITH SMALL RADIUS */
if (ri<=1)
{
    tmp=2*r+1;
    for(x=-2;x<=2;x++) /* the generation is brute force */
    for(y=-2;y<=2;y++)
    {
       tmp1=x*x+y*y-r*r;
       if ((tmp1>=0) && (tmp1<tmp))
       plot(x,y);
    }
}
else
{
   // ri>1
   /* GENERAL CASE */
   /* Initialization of loop constants */
   rph=r+0.5;
   rpxo=r; rmxo=r-xo; rpyo=r+yo; rmyo=r-yo;
   xoph=xo+0.5; xomh=xo-0.5; yoph=yo+0.5; yomh=yo-0.5;
/* STARTING POINT COMPUTATION */
    y=0;
    d=((ri-rpxo)*(ri+rmxo)+yo*yo)/2.0; /* Initial value of d for (ri,0) */
   if (d<(a+xo)) /* does (ri+1,0) belong to the circle ? */
{ plot(ri+1,0); /* (ri+1,0) does belong to the circle */
if (d>=0) { plot(ri,0); x=ri;} /* (ri,0) belongs also to the circle */
else { x=ri+1; d+=ri-xomh;} /* (ri,0) doesn't belong to the circle */
}
else if ((d>=0) && (d<rph)) /* does (ri,0) belong to the circle ? */
{ plot(ri,0);
  x=ri;
}
else /* if neither (ri+1,0) nor (ri,0) belong to the
circle then (ri-1,0) does */
 {
   x=ri-1; plot(x,0);
   d+=xoph-ri;
 }
/* END OF STARTING POINT PHASE */
/* GENERATION OF QUADRANT 1 */
while (x>0)
 {
   if (d<(rpyo-y)) /* Type (a) ? */
 {  d+=y-yomh;
 y++;
 plot(x,y);
}
else
{ d+=xoph-x;
x--;
if (d>=0) plot(x,y); /* Type (b) ? */
else
{ d+=y-yomh; /* Type (c) !*/
y++;
plot(x,y);
}
}
}
/* END OF GENERATION OF QUADRANT 1 */
/* LIMIT POINTS BETWEEN QUADRANT #1 AND QUADRANT #2 */
if (d<(rpyo-y)) /* Does (0,y+1) belong to the circle ? */
{ d+=xoph; plot(0,y+1); x--; plot(-1,y); }
/* GENERATION OF QUADRANT 2 */
while (y>0 )
{ if (d<(rmxo+x))
{
d+=xoph-x;
x--;
plot(x,y);
}
else
{ d+=yoph-y;
y--;
if (d>=0) plot(x,y);
else
{ d+=xoph-x;
  x--;
plot(x,y);
}
}
}
/* END OF GENERATION OF QUADRANT #2 */
/* LIMIT POINTS BETWEEN QUADRANT #2 AND QUADRANT #3 */
if (d<(rpxo+x))
{ d+=yoph; plot(x-1,0); y--; plot(x,-1); }
/* GENERATION OF QUADRANT #3 */
while (x<0)
{ if (d<(rmyo+y))
{ d+=yoph-y;

y--;
plot(x,y);
}
else
{ d+=x-xomh;
x++;
if (d>=0) plot(x,y);
else
 { d+=yoph-y;
   y--;
   plot(x,y);
 }
}
}
/* END OF GENERATION OF QUADRANT #3 */
/* LIMIT POINTS BETWEEN QUADRANT #3 AND QUADRANT #4 */
if (d<(rmyo+y))
{ d-=xomh; plot(0,y-1); x++; plot(1,y); }
/* GENERATION OF QUADRANT #4 */
while (y<0)
{ if (d<(rpxo-x))
  { d+=x-xomh;
    x++;
    plot(x,y);
  }
else
{  d+=y-yomh;
   y++;
   if ((d>=0)&&(y)) plot(x,y);
   else
{  d+=x-xomh;
   x++;
   if (y) plot(x,y);
}
}
}
/* END OF GENERATION OF QUADRANT #4 */
} /* END OF THE GENERAL CASE */
}
//------------------------------------------------------
  GO and test


 Conclusion

pour plus de détailles contactez moi à l'adresse suivante: bob_carlos2006@yahoo.fr


 Sources de la même categorie

Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi
Source avec Zip Source avec une capture XCOUPE : COUPE 2D par pop70

 Sources en rapport avec celle ci

Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip POLYGONE EN SDL par alexis0788
Source avec Zip Source avec une capture DÉTECTION DES CERCLES DANS UNE IMAGE: HOUGH par Pistol_Pete
Source avec Zip CODE DE HUFFMAN par Ricky_MacElroy
Source avec Zip JOUER A DESSINER ET AFFICHER UNE IMAGE AVEC C++ ET API WIN3... par zarra_taoufiq

Commentaires et avis

Commentaire de MuPuF le 03/11/2005 20:31:02

tout ça pour un cercle !!! alors qu'en 5 lignes tu le fais ...

Commentaire de alexblais le 04/11/2005 07:24:54

comme ça ?

float rayon=10.0;
float angle=0;
int xc=100;yc=100;
int x,y;
float PI=3.1415;

for (angle=0.0;angle<(2*PI);angle=angle+0.01)
{
x=(cos(angle)*rayon)+xc;
y=(sin(angle)*rayon)+yc;
dessine_point(x,y);
}

Commentaire de Galmiza le 04/11/2005 18:13:57

Bien, mais avez-vous un seul appel à une fonction trigonometrique ?
C'est l'algorithme de Brensenham, un ingé d'IBM qui a aussi fait un algorithme ultra rapide de tracé de ligne (algo utilisé partout).

Commentaire de MuPuF le 04/11/2005 18:30:05

ah car les fonction trigo sont super lente ...

Commentaire de Galmiza le 04/11/2005 19:01:42

Par rapport à des opérations élémentaires sur des entiers, c'est sûr que c'est infiniment plus lent.
Les programmes C qui tracent des lignes en calculant le coefficient directeur ou des cercles en utilisant sin et cos
se font larguer par leur homologue VB qui utilise Brensenham.

Même avec un ordinateur qui a une puissante FPU et en créant une table de sinus et de cosinus, l'algo de Brensenham est plus rapide.


Seul l'assembleur permet d'optimiser ce code.

Commentaire de Arnaud16022 le 07/11/2005 10:17:22

a ce niveau la l'assembleur n'optimisera rien du tout
1 -> un compilo en mode release c'est loin d'etre stupide il te sort souvent un code plus rapide que le tien
2 -> de toute facon les fonctions sin et cos, eles y sont deja,em asm

[edit] heu j' ai un doute la, ad tu dis
'Seul l'assembleur permet d'optimiser ce code." tu parles duquel ? :p

et heu dit voir.... vu la qte d'anglais dans ton code, t'est sur que c'est toi qui l'a fait ? :p

Commentaire de Galmiza le 07/11/2005 12:45:38

1 -

En assembleur, chaque opération modifie les états du flag et on peut directement faire un jump en fonction de l'état de ses bits.

Par exemple:
addition register, regiter
bcc \label      ; <- branch carry clear, => aller à \label si le bit du flag qui correspond a un resultat nul est a 1

A la limite, un:  if (hFile == NULL) {...} else {...} peut être parfaitement bien compilé.

Et encore c'est le plus simple. Certains bits du flag correspond a des débordements sur le registre d'"arrivé", des comparaisons des registres (plus grand ?, plus petit ?), des états des bits de poids fort et faible, et autres ...

Bref, beaucoup d'optimisation qui ne peuvent pas être automatiquement faites par un compilateur si l'utilisateur n'utilise pas volontairement (dans l'algorithme lui même) les avantages des flags.


2 -

2 programmes en assembleur en tournent pas forcement à la même vitesse.
sin et cos sont en assembleur mais plus lentes qu'une suite d'opérations élementaires rapides.

Dans le cas du cercle avec sin et cos tu calcules plusieurs fois la meme pixel, pas avec brensenham.

Quand je dis assembleur c'est le langage, genre le 8808, 8086, 80386, 80286, pas le module d'assemblage du compilateur.
Perso j'ai fait que du 68000 pour ti et l'assembleur change la vitesse de façon ultra-sensible.


Je code en anglais depuis un an, c'est plus stylé :D

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Dessiner sous Visual Studio C++ [ par KryztL ] Bonjour,J ai actuellement un programme a faire et entre autre chose, il faudrait qu il dessine un cercle mais sans passer par la fonction pDC-&gt;Elli comment dessiner un cercle en c++ [ par Pa109 ] je voudrais connaitre la fonction est la lib eventuel pour la realiser Dessiner ses forms [ par dread ] Bonjour.Je voudrais savoir si il existe des programmes qui permettent de dessiner sa form dans un fichier de ressource a la manière de vc++ pour les a Dessiner une ellipse [ par Azul ] Je dois modifier un programme VC++ pour représenter (dessiner dans une fenêtre ) des objets par des ellipses. Ces objets sont actuellement identifiés Dessiner une ellipse [ par Azul ] Je dois modifier un programme VC++ pour représenter (dessiner dans une fenêtre ) des objets par des ellipses. Ces objets sont actuellement identifiés dessiner une droite [ par gus2647 ] Bonjour,j aurais voulu savoir comment on faisait pour dessiner les droites de types suivants :1- les pointillés .....2- les ----------3- les .-.-.-.-. dessiner des formes libres [ par nbeaumont ] je souhaite trouver un composant qui reprendrait le principe du dessin d'une forme libre (suite de traits).je suis peut être passé à coté sans le voir Dessiner une icone sur un toolbar [ par gagah1 ] Comment dessine une icône ou un bitmap sur un bouton de ToolBar ,à part les 15 boutons standard prédéfinis. Dessiner un joli cadre en C :-) [ par did2604 ] Bonsoir,Petite question toute bête... je m'amuse à créer des cadres de présentation qui commence du style :___________________________________________ Dessiner sur tout l'ecran [ par memiks ] Voila, je voudrais pouvoir déssiner sur tout l'écran comme si je prenais des notes avec un feutre sur mon écran.J'ai penser à creer une fenetre transp


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,649 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales