Sirkel
Under utledning av ligningssettet for rotasjoner i planet tok vi utgangspunkt i følgende figur:
x1= r·cos(v1) y1= r·sin(v1) |
En sirkel med radius r om origo kan i følge dette tegnes slik, med 20 linjestykker:
x=R y=0 moveto(x,y) v=0 while(v<2*pi) { v+=2*pi/20 x=r*cos(v) y=r*sin(v) lineto(x,y) }
I modulen 2D transf. resonnerte vi oss fram til at vi kunne lage et generelt rotasjonsuttrykk som generelt uttrykker en rotasjon fra en vinkel til en annen.
x2= x1·cos(v2)-y1·sin(v2) y2= x1·sin(v2)+y1·cos(v2) |
Hvis vi bruker denne kan vi formulere algoritmen slik:
dv=2*pi/20 s=sin(dv) c=cos(dv) x=R y=0 moveto(x,y) n=0 while(n<20) { nyx=x*c+y*s nyy=x*s+y*c lineto(nyx,nyy) x=nyx y=nyy n++ }
Vi har oppnådd en antatt effektivitetsgevisnt ved at vi har byttet ut funksjonskall med to multiplikasjoner. På den annen side har vi fått en algoritme der eventuelle avrundingsfeil akkumuleres. Hvorvidt dette betyr noe i praktisk bruk er avhengig av omgivelse, hvor ofte tegner vi?, hvor stor presisjon trenger vi? Vi har ikke angitt type på variablene i algoritmen. Dersom vi bruker flytetall så vil avrundingsfeilen ikke ha betydning i situasjoner med "rimelige" tall, f.eks. av samme størrelsesorden som oppløsning på en skjerm.
Dersom vi ønsker sentrum et annet sted enn i origo kan vi lett modifisere algoritmen ved å modifisere selve uttegningen:
dv=2*pi/20 s=sin(dv) c=cos(dv) x=R y=0 moveto(senterx+x,sentery+y) n=0 while(n<20) { nyx=x*c+y*s nyy=x*s+y*c lineto(senterx+nyx,sentery+nyy) x=nyx y=nyy n++ }
Logo
I programmeringsspråket Logo [1] er det vanlig å beskrive sirkler på følgende måte:
repeat 360 times forward(1) right(1) end repeat
der vi styrer en skjermpenn ved å si at den skal gå forover et antall enheter i den retningen den peker (forward) og ved be den om å endre retning et antall gader, feks 1 grad mot høyre (right(1))
Hvordan kan dette bli riktig ?
Parametrisk
Vi kan også beskrive en sirkel parametrisk:
x=r·cos(2·pi·t)
y=r·sin(2·pi·t)
og kan følgelig tegne slik:
t=0 moveto(r,0) while(t<1) { lineto(r*cos(2*pi*t),r*sin(2*pi*t)) t+=0.05f }