Algorithme de Bresenham pour tracer un cercle (pixel en trop)
Bonjour, pourriez-vous me dire concernant l'algorithme de bresenham pourquoi quand on calcule la progression de l'erreur dans le cas 1 on passe de :
erreur = 4x² + 4y² + 8x − 4y + 5 − R² + 8x + 12 à
erreur = 4x² + 4y² + 8x − 4y + 5 − R² + 8x + 4
pourquoi (là ou j'ai surligné) on passe de 12 à 4
pareille pour le cas 2 ou on passe de :
erreur = 4x² + 4y² + 8x − 4y + 5 − R² + 8x − 8y + 20
erreur = 4x² + 4y² + 8x − 4y + 5 − R² + 8x − 8y + 4
on passe de 20 à 4
Dans le code ci-dessous on met donc e+=8x+4 et non e+=8x +12
et dans e+=-8y on ne mais pas de constante je ne comprends pas pourquoi, puisque dans le cas 2 on vois que l'on a 8x-8y+20 ;
Donc admettons que l'on mette 4 à 8x (8x+4) dans ce cas là il faudrait mettre a -8y : +16 pour retrouver le 20 au départ pour moi si on a 8x+12 alors pour -8y on devrait avoir -8y+8.
Pourriez-vous m'expliquer ce qui justifie de mettre 8x+4 et -8y dans le code au lieu de 8x+12 et -8y+8
De plus dans le code que voici je n'ai pas un cercle identique a celui de paint (voir image : Pièce jointe 193874) j'ai quelque pixel qui sont en trop quand j'ai des grands rayon supérieur à 32 des pixels en trop commence à apparaître pourriez-vous me dire de quoi ça vient. En vous remerciant par avance.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
void line_bresenham(SDL_Surface* display,color c)
{
int x=0;
int r=128, cx=128, cy=128;
int y =r;
int e=5-4*r;
while(x<=y)
{
*((int*)display->pixels + x+ cx+display->w*(cy+y))=c; /*allume le pixel*/
if(e>0)
{
y--;
e+=-8*y;
}
x++;
e+=8*x+4;
SDL_Flip(display);
} |