Je vous présente ici 5 algorithmes de tracé de cercles utilisant des entiers.
- Algorithme d'Eric Andres
- Algorithme de Bresenham pour le tracé de cercle
- Algorithme de Pierre Audibert
- Algorithme de Nicolas Rey
- Pythagore
Algorithme d'Eric Andres
Principe : Eric Andres intègre les coordonnées du centre dans l'équation du cercle : r2=x2+y2 devient r2=(x-x0)2+(y-y0)2. On choisit le pixel suivant parmi les 3 pixels (x+1,y), (x+1,y+1) et (x,y+1), en évaluant leur distance du cercle discret. Pour chaque pixel on a une distance d = r - √(x2 - y2). Il considère en outre que les points de ce cercle dont l'épaisseur physique est de 1 pixel sont situés dans l'intervale r-0.5 ≤ pixel < r+0.5. La vérification de l'appartenance du point est alors (r-½)2 ≤ (x-x0)2+(y-y0)2 < (r+½)2.
Le génie consiste ici à poser d = r2 + r - x2 - y2 - 1 et de montrer qu'on choisit :
- (x+1,y) si d ≥ 2x
- (x,y+1) si d < 2(r - y)
- sinon (x+1,y+1) quand 2x > d ≥ 2(r - y)
Tous les points entiers (pixels) du plan appartiennent à au moins 1 cercle d'Eric Andres de rayon entier (c'est le cas aussi pour ceux de Pierre Audibert et Nicolas Rey).
Implémentation
DrawCircleAndres
Algorithme de Bresenham pour le tracé de cercle
Principe : Comme dans son algorithme de tracé de segment Jack Bresenham part du principe qu'on doit choisir entre 2 pixels en fonctions de sa distance au cercle de rayon R+½. On parcout un octant en X et on décrémente Y quand le point passe dans ce cercle. L'optimisation de cet algorithme passe par un développement de (x+1,y-0.5) multiplié par 4. On peut de plus intégrer le choix du pixel dans l'équation (voir Wiki).
Implémentation
DrawCircleBresenham
Implémentation optimale en intégrant le choix du pixel dans l'équation
DrawCircleOptimalBresenham
Algorithme de Pierre Audibert
Principe : Pierre Audibert est parti du théorème de Pythagore en développant et factorisant les incrémentations de (x-x0) et (y-y0). voir Tracé d'un cercle quelconque.
Implémentation
DrawCirclePierreAudibert
Algorithme de Nicolas Rey
Principe : J'ai utilisé une propriété intéressante des carrés. Tout nombre entier au carré est une somme de nombres impairs consécutifs, ce qui permet d'incrémenter un carré sans passer par une multiplication. Mon algorythme n'utilise donc que des additions et des soustractions dans la boucle principale.
Implémentation
DrawCircleNicolasRey
Pythagore
Je le met à titre indicatif puisque tous les algorythmes cités ici utilisent ce célèbre théorème.
Implémentation
DrawCirclePythagore
Comments est propulsé par CComment