Algorithme de tracé d'arc de cercle de Bresenham - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

L’algorithme de tracé d'arc de cercle de Bresenham, ou algorithme de tracé d'arc de cercle par point milieu (midpoint en anglais) permet, pour une complexité algorithmique très réduite, de tracer des cercles en image matricielle.

Historique

Cet algorithme n'aurait pas été écrit par Jack E. Bresenham, mais inspiré de son travail sur le tracé de segments. Cet algorithme serait issu de travaux de Pitteway et van Aken.

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 ← rayon ; 	//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 ;      

La variable m représente le "4m" du paragraphe précédent, 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 ← rayon ; 	// 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.

Explication de l'algorithme de base dans le premier octant

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.

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

Optimisation de l'algorithme

Pour optimiser l'algorithme, on calcule la variable m récursivement. On montre que 4m=4{x_i}^2+4{y_i}^2+8x_i-4y_i+5-4R^2 (1)

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.

  • On montre que si on choisit E, 4mi + 1 = 4mi + 8xi + 12 = 4mi + 8xi + 1 + 4.

Il faut donc incrémenter 4mi de 8xi + 1 + 4.

  • On montre que si on choisit F, (xi + 1 = xi + 1,yi + 1 = yi + 1).

Il faut donc incrémenter 4mi de 8xi + 1 + 4 − 8yi + 1.

On en déduit donc le calcul itératif de m : 4mi + 1 = 4mi + 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.

Page générée en 0.096 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise