Recursie: het cirkel algoritme van Bresenham Cirkels tekenen op een monitor… Onmogelijk vanwege het discrete karakter van monitoren. Derhalve: genoegen nemen met een benadering.
De cirkel: een definitie Een cirkel = een verzameling punten die allemaal op een gegeven afstand r liggen van een centraal punt. r y x
De cirkel: eigenschappen De relatie tussen een punt op de rand en het centrum: Pythagoras r
Een cirkel tekenen… Loop over de x- as en bereken de bijbehorende y- coördinaat op basis van de straal:
Een cirkel tekenen… Problemen: De cirkel wordt niet mooi gesloten getekend… Ieder punt kost nogal wat rekenkracht. Gebroken getallen zijn niet zo netjes en leiden mogelijk tot afrondingsfouten.
Een cirkel tekenen… Een andere methode: poolcoördinaten. r
Een cirkel tekenen… Poolcoördinaten: problemen: Hoekberekening vormt een gebroken getal. Gebruik van goniometrische functies…
Goniometrie in een computer Goniometrische functies volgens Taylor:
Een cirkel tekenen: Bresenham Een cirkel is symmetrisch… Teken 1/8 deel van de cirkel en construeer de rest volgens herhaald spiegelen.
Een cirkel tekenen: Bresenham Definieer een cirkelfunctie: Punt (x,y) op cirkel met straal r? functiewaarde=0 Punt (x,y) binnen de cirkel? functiewaarde <0 Punt (x,y) buiten de cirkel? functiewaarde >0
Bresenham: recursie… 2 mogelijkheden voor het volgende pixel… evaluatiepunt
Bresenham: recursie… Hebben we getekend: Dan wordt de volgende: OF
Bresenham: recursie… Evalueer de cirkelfunctie op het evaluatiepunt teneinde de y- coördinaat van de opvolger te kunnen berekenen:
Bresenham: recursie… Evaluatiepunt binnen cirkel? Teken: Evaluatiepunt buiten cirkel? Teken:
Bresenham: recursie… Evalueer cirkelfunctie voor “de opvolger van de opvolger”:
Bresenham: recursie… Ofwel:
Bresenham: recursie code int circlemid(int xc,int yc,int r) { int x=0,y=r; axis(); putpixel(convertxc(xc),convertyc(yc),5); plotpoint(xc,yc,x,y); double p=1-r; while(x<y) { if(p<0) { x=x+1; p=p+2*x+1; } else{ y=y-1; p=p+2*(x-y)+1;} return(0);