Børre Stenseth
Algoritmer>Sirkler

Sirkel

Hva
Et par enkle, praktisk anvendbare måter å lage sirkler på

Under utledning av ligningssettet for rotasjoner i planet tok vi utgangspunkt i følgende figur:

rotkoord0 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.

rotkoord 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
}
Referanser
  1. Logo (programming language)Wikipediaen.wikipedia.org/wiki/Logo_%28programming_language%2914-04-2010
Modulen 2D transf.
Vedlikehold
B.Stenseth, 2003
(Velkommen) Algoritmer>Sirkler (Polygon)