CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
Algorithme de tracé d'arc de cercle de Bresenham - Wikipédia

Algorithme de tracé d'arc de cercle de Bresenham

Un article de Wikipédia, l'encyclopédie libre.

Vous avez de nouveaux messages (diff ?).


L’algorithme de tracé d'arc de cercle de Jack E. Bresenham permet, pour une complexité algorithmique très réduite, de tracer des cercles en image matricielle.

Sommaire

[modifier] Explication de l'algorithme de base dans le premier octant

[modifier] Un huitième suffit

Tout d'abord, on peut remarquer que sur une grille de pixels, il existe quatre axes de symétrie au cercle, deux suivant les axes de la matrice, et deux représentant les bissectrices du repère centré sur le cercle. Ainsi, ayant calculé un arc d'un secteur du repère délimité par les axes de symétrie, il suffit d'exploiter la symétrie pour positionner les sept autres pixels.


[modifier] L'algorithme de base

Pour les raisons de symétrie expliquées précédemment, l'algorithme expliqué sera limité au deuxième octant (d'angle compris entre \frac{\pi}{2} et \frac{\pi}{4}) puis généralisé ensuite. L'algorithme partira donc du point le plus haut du cercle, et descendra jusqu'à la première bissectrice.

Schéma

Ce tracé procède par itération, chaque itération activant un pixel. Imaginons que nous sommes en un pixel P, et qu'il faut placer le pixel suivant. Puisque nous sommes dans le deuxième octant, ce pixel sera le point E ou le point F. La méthode de Bresenham consiste à évaluer si le cercle "idéal" d'équation x2 + y2R2 = 0 passe au-dessus ou en dessous du point M, milieu du segment EF pour activer respectivement le pixel E ou le pixel F.

Il faut donc calculer à chaque itération une variable m telle que m={x_M}^2+{y_M}^2-R^2. Alors :

  • m > 0 ⇒M au-dessus du cercle idéal ⇒ choix de F ⇒ incrémenter x, décrémenter y
  • m < 0 ⇒ M au-dessous du cercle idéal ⇒ choix de E ⇒ incrémenter x


[modifier] Optimisation de l'algorithme

Pour optimiser l'algorithme, on calcule la variable m récursivement.

Plaçons-nous au pointPi de coordonnées sur la grille de pixel (xi;yi) et calculons la variable m. On sait alors que M a pour coordonnées (xm = xi + 1;ym = yi − 0,5). Donc m={x_M}^2+{y_M}^2-R^2={(x_i+1)}^2+{(y_i-0,5)}^2-R^2={x_i}^2+{y_i}^2+2x_i-y_i+1,25-R^2. Puisqu'on souhaite ne travailler qu'avec des nombres entiers, et puisque seul le signe de m nous intéresse, on utilisera l'équation (1) : 4m=4{x_i}^2+4{y_i}^2+8x_i-4y_i+5-4R^2.


On va modifier la variable m en fonction du choix du pixel E ou du pixel F. On nommera mi l'ancienne valeur de m, et mi + 1 la nouvelle valeur de m.

  • Si on choisit E, alors (xi + 1 = xi + 1,yi + 1 = yi). Or d'après l'équation (1), 4m_{i+1}=4{x_{i+1}}^2+4{y_{i+1}}^2+8x_i-4y_i+5-4R^2, donc 4m_{i+1}=4{x_i+1}^2+4{y_i}^2+8x_i-4y_i+5-4R^2 d'où 4m_{i+1}=4{x_i+1}^2+4{y_i}^2+8x_i-4y_i+5-4R^2. En utilisant le fait que 4m=4{x_i}^2+4{y_i}^2+8x_i-4y_i+5-4R^2, on obtient 4mi + 1 = 4mi + 8xi + 12 = 4mi + 8xi + 1 + 4. Si on choisit E, il faut donc incrémenter 4mide 8xi + 1 + 4.
  • Si on choisit F, alors (xi + 1 = xi + 1,yi + 1 = yi + 1). En effectuant un raisonnement analogue à celui du cas E, on démontre que si on choisit F, il faut incrémenter 4mide 8xi + 1 + 4 − 8yi + 1.

On en déduit donc le calcul itératif de m : mi + 1 = mi + 8xi + 1 + 4 − d avec d qui vaut 0 si on choisit E, et 8yi + 1 si on choisit F.

Pour amorcer le calcul itératif, on remarque que m0 = ( − 1)2 + (R − 0,5)2R2 donc 4m0 = 5 − 4R.


[modifier] Algorithme optimisé

Algorithme de tracé d'un octant

procédure tracerOctant (entier rayon, entier x_centre, entier y_centre)
        déclarer entier x, y, m ;
        x ←0 ;
        y ← R ;    //on se place en haut du cercle 
        m ←5-4*rayon ;             // initialisation
        Tant que x < y       // tant qu'on est dans le second octant
                tracerPixel( x+x_centre , y+y_centre ) ;
                si m > 0 alors       // choix du point F
                        y ← y - 1 ;
                        m ← m-8*y ;        // correspond au "d" des explications
                fin si ;
                x ← x+1 ;
                m ← m + 8*x+4 ;
        fin tant que ;
fin de procédure ;

On notera que ici la variable m représente le "4m" du paragraphe précédent, ce que l'on peut se permettre puisque seul le signe de 4m nous intéresse et qu'il est le même que celui de m.

Algorithme de tracé du cercle entier

procédure tracerOctant (entier rayon, entier x_centre, entier y_centre)
        déclarer entier x, y, m ;
        x ←0 ;
        y ← R ;    // on se place en haut du cercle 
        m ←5-4*rayon ;             // initialisation
        Tant que x < y       // tant qu'on est dans le second octant
                tracerPixel( x+x_centre , y+y_centre ) ;
                tracerPixel( y+x_centre , x+y_centre ) ;
                tracerPixel( -x+x_centre , y+y_centre ) ;
                tracerPixel( -y+x_centre , x+y_centre ) ;
                tracerPixel( x+x_centre , -y+y_centre ) ;
                tracerPixel( y+x_centre , -x+y_centre ) ;
                tracerPixel( -x+x_centre , -y+y_centre ) ;
                tracerPixel( -y+x_centre , -x+y_centre ) ;
                si m > 0 alors       //choix du point F
                        y ← y - 1 ;
                        m ← m-8*y ;
                fin si ;
                x ← x+1 ;
                m ← m + 8*x+4 ;
        fin tant que ;
fin de procédure ;

On procède simplement par symétrie dans les différents octants.


[modifier] Remarques sur la méthode de Bresenham

[modifier] La faible complexité

On a vu précédemment que pour chaque pixel placé la complexité de calcul se réduisait à X additions, Y multiplications et Z comparaisons. L'utilisation de fonctions trigonométriques usuelles ou d'une racine carrée auraient nécessité un coût algorithmique considérable en comparaison.


Illustration des "trous"

[modifier] Extensions

On peut également se servir du principe de cet algorithme pour tracer des couronnes et des ellipses.


[modifier] Limites de la méthode

Si l'on trace des cercles concentriques de rayon de plus en plus grand, on remarque que l'on ne parvient pas à remplir tout le plan : il y a des "trous" . Ce défaut amène à utiliser d'autres méthodes, comme l'algorithme de tracé d'arc de cercle d'Andres.

Portail de l'informatique – Accédez aux articles de Wikipédia concernant l’informatique.
Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Sub-domains

CDRoms - Magnatune - Librivox - Liber Liber - Encyclopaedia Britannica - Project Gutenberg - Wikipedia 2008 - Wikipedia 2007 - Wikipedia 2006 -

Other Domains

https://www.classicistranieri.it - https://www.ebooksgratis.com - https://www.gutenbergaustralia.com - https://www.englishwikipedia.com - https://www.wikipediazim.com - https://www.wikisourcezim.com - https://www.projectgutenberg.net - https://www.projectgutenberg.es - https://www.radioascolto.com - https://www.debitoformtivo.it - https://www.wikipediaforschools.org - https://www.projectgutenbergzim.com