[C++] Prenons une forme simple... un cercle par exemple :)

Prenons une forme simple... un cercle par exemple :) [C++] - Programmation

Marsh Posté le 21-06-2001 à 10:26:00    

Je vous expose mon probleme : je dois tracer un cercle de centre (x0,y0) et de rayon r dans un plan.
 
un algo tout bete serait :  
 
for (float theta=0; theta<=360; theta+= increment)
  drawpoint(x0+r*cos(theta),x0+r*sin(theta));
 
Je precise que les coordonnees finales sont entieres.
Tout le probleme reside dans le choix de increment.  
Ex: pour un cercle de rayon 1, il suffit de choisir increment=360.
Pour un cercle de rayon 2, il suffit de choisir increment=90.
 
Tout le probleme reside dans le choix de increment pour un cercle de rayon n, tout en evitant de donner la valeur 0.0000001 qui fonctionne pour tout cercle, mais est tres lent (je veux un truc qui va vite).
 
Pour l'instant, j'ai mis increment= 360/(4*rayon), mais malheureusement j'ai quelques bugs d'affichage qui restent... :sarcastic:

Reply

Marsh Posté le 21-06-2001 à 10:26:00   

Reply

Marsh Posté le 21-06-2001 à 10:30:34    

ben y'a une methode tres rapide c'est le tracé de cercle de brensenham.
 
http://www.citeweb.net/discase/8/CERCLE.htm

Reply

Marsh Posté le 21-06-2001 à 10:33:28    

Thx :hello:

Reply

Marsh Posté le 21-06-2001 à 20:06:48    

rx,
y'a moy de faire plein de trucs avec Bresenham, genre des paraboles,  des coniques, enfin plein de trucs avec de trucs polynomiaux, mais pas avec un deg trop élevé sinon ça devient atroce.

Reply

Marsh Posté le 22-06-2001 à 10:46:56    

Ben en fait mon probleme est plus complique que ca (enfin du moins en apparence).  
 
Le truc c'est que je dois definir un volume de revolution a partir d'une image x*y. Par exemple je fais tourner l'image autour de l'axe x=0 pour avoir un machin cylindrique.  
 
Alors je pensais simplement prendre chaque point de l'image et dessiner le cercle centre sur l'axe x=0 et passant par le point en question, tel que tous les points du cercle ont la valeur du pixel original de l'image.  
 
Ca marche, sauf que j'ai evidemment des trous par endroit, parce que lorsque l'on trace des cercles concentriques de rayon 1,....,n on ne remplit pas exactement un disque de rayon n, il y a des endroits ou ca foire a cause des approximations entieres... :(

 

[edit]--Message édité par tgrx--[/edit]

Reply

Marsh Posté le 22-06-2001 à 14:00:52    

tgrx a écrit a écrit :

Ben en fait mon probleme est plus complique que ca (enfin du moins en apparence).
 
 
 
Le truc c'est que je dois definir un volume de revolution a partir d'une image x*y. Par exemple je fais tourner l'image autour de l'axe x=0 pour avoir un machin cylindrique.
 
 
 
Alors je pensais simplement prendre chaque point de l'image et dessiner le cercle centre sur l'axe x=0 et passant par le point en question, tel que tous les points du cercle ont la valeur du pixel original de l'image.
 
 
 
Ca marche, sauf que j'ai evidemment des trous par endroit, parce que lorsque l'on trace des cercles concentriques de rayon 1,....,n on ne remplit pas exactement un disque de rayon n, il y a des endroits ou ca foire a cause des approximations entieres... :(
 
 




et en prenant l'eqution Y2+Z2=R2 pour tes cercles
tu calcules Y a partir de Z, puis Z a partir de Y en fonction de l'orientation de la derivee, et tu trace deux points a chaque fois ex: tu trouves Z=2.7 -> tu traces Z=2 et Z=3 (2<2.7<3)
Le risque c'est que ce soit un peu gras... mais la methode permet de controler les erreurs d'arrondis...

Reply

Marsh Posté le 22-06-2001 à 14:23:14    

pour continuer sur ce que disais BENB, tu as la méthode du cercle lissé.
 
Tu veux faire un cercle de couleur noir par exemple.
Tu dois ah un moment donné dessiner le pixels x=2.7,y=2.3, forcement va y avoir un probleme et il faudra faire un choix, au lieu de chosir le pixel (3,2) et de faire un arrondie, ben tu peux faire autrement :
 
tu mets 21% de noir dans p(2,2) (0.3*0.7=0.21)
tu mets 49% de noir dans p(3,2) (0.7*0.7=0.49)
tu mets  9% de noir dans p(2,3) (0.3*0.3=0. 9)
tu mets 21% de noir dans p(3,3) (0.7*0.3=0.21)
 
voila, c'est pas tres clair mais en general ca marche bien

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed