Julekuler, snøflak og rotasjonssymmetri#
I denne guiden skal vi lære hvordan dekorere julepynt med snøfnuggbroderi i Python. Bildet under viser et eksempel på julepynten vi skal lage med programmering.
Notis
Denne guiden antar at du har turtlethread installert fra før. Hvis du ikke har det, kan du trykke her for instrukser.
Et klassisk og vakkert motiv for julepynt er et snøfnugg. Hva er det som gjør snøfnugg så dekorative?
Ser vi nærmere på snøfnugget over ser vi at et av kjennetegnene er at det er symmetrisk. Det har for eksempel rotasjonssymmetri som vil si at det ser likt ut (med unntak av små «skader») når vi roterer rundt sentrum. Rotasjonssymmetri er både dekorativt og resurssparende og er mye brukt i både natur, matematikk, design og kunst.
Pynt til jul med snøkrystallbroderi i Python!#
Brodere en strek#
Begynn med å kopiere koden under inn i kodeeditoren din og kjør den. Hva blir tegnet opp på skjermen?
1from turtlethread import Turtle
2
3nål = Turtle()
4with nål.running_stitch(50):
5 nål.forward(100)
6
7nål.visualise()
La oss gå igjennom koden linje for linje:
- Linje 1:
Importerer Turtle kommandoen fra turtlethread biblioteket. Dette er litt som å be Python om å gå inn i verktøyboden og hente frem det verktøyet (
Turtle
) vi trenger og legge det frem på arbeidsbenken.- Linje 3:
Bruker Turtle kommandoen til å lage et Turtle objekt og lagre det i en variabel ved navn ‘nål’. Dette er det vi skal bruke for å brodere.
- Linje 4:
Forteller hva slags søm vi skal bruke. For mer om søm i turtlethread kan du klikke her, men alt du trenger å vite for nå er at vi i denne linjen ber om en rettsøm (
running_stitch
) med 5 mm (50 steg) mellom hvert sting.- Linje 5:
Ber nåla om å bevege seg fremover 100 steg. Legg merke til at denne koden ligger inne i et innrykk etter
with nål.running_stitch(50):
linja, som betyr at nåla skal brodere mens den beveger seg.- Linje 7:
Kaller på nåla sin
visualise
funksjon. Denne funksjonen ber Python tegne hvordan broderiet kommer til å se ut og er en fin måte å sjekke om mønsteret blir riktig før du prøver å brodere på stoff.- Linje 2 og 6:
Er tomme. Tomme linjer brukes til å gjøre koden ryddigere og enklere å lese, men har ikke noe å si for programmet. Du kan fjerne dem uten at det har noen effekt.
Prøv selv:
Endre programmet slik at det har en søm med 30 steg mellom hvert sting. Kjør programmet, ser du forskjellen?
Endre programmet slik at nåla beveger seg 90 steg fremover istedenfor 100 steg fremover.
Obs
Pass på at koden stemmer med løsningsforslaget over før du går videre.
Snu til høyre#
Vi vil at «armene» til snøkrystallen skal ha «grener». For å få til det må vi rotere skilpadden, det kan vi gjøre med right kommandoen. Programmet under tegner en gren med 45° rotasjon og steglengde 90:
1import turtlethread
2
3nål = turtlethread.Turtle()
4with nål.running_stitch(30):
5 # Gå litt frem
6 nål.forward(90)
7
8 # Tegn en "gren", denne peker litt nedover
9 nål.right(45)
10 nål.forward(90)
11
12nål.visualise()
- Linje 5 og 8:
Starter med et
#
symbol som betyr at her kommer en kommentar som Python skal ignorere. Slike kommentarer bruker vi for å holde programmet ryddig med små forklaringer.- Linje 9:
Roterer skilpadden 45 grader mot høyre.
Prøv selv:
Kjør programmet og se hva du får ut
Endre programmet slik at grenen er rotert 30 grader istedenfor 45
Endre programmet slik at grenen har lengde 60 istedenfor 90
Obs
Pass på at koden stemmer med løsningsforslaget over før du går videre.
Fullføre armen på snøfnugget#
Etter å ha tegnet «grenen» må vi rygge bakover og rotere tilbake for å fortsette på armen. Dette kan vi gjøre med backward
og left
slik:
1import turtlethread
2
3nål = turtlethread.Turtle()
4with nål.running_stitch(30):
5 # Gå litt frem
6 nål.forward(90)
7
8 # Tegn første "gren", denne peker litt nedover
9 nål.right(45)
10 nål.forward(60)
11 nål.backward(60)
12 nål.left(45)
13
14 # Gå litt frem
15 nål.forward(90)
16
17nål.visualise()
Prøv selv:
Kjør programmet og se hva du får ut.
Hvorfor er tallet i linje 10 og 11 likt. Er dette viktig? Hvorfor/Hvorfor ikke?
Nå fullfører vi armen ved å gå bakover og tegne en gren på andre siden også. Det er viktig at vi slutter med nåla i samme posisjon og pekende i samme retning som når vi startet:
1import turtlethread
2
3nål = turtlethread.Turtle()
4with nål.running_stitch(30):
5 # Gå litt frem
6 nål.forward(90)
7
8 # Tegn første "gren", denne peker litt nedover
9 nål.right(30)
10 nål.forward(60)
11 nål.backward(60)
12 nål.left(30)
13
14 # Gå litt frem og tilbake
15 nål.forward(90)
16 nål.backward(90)
17
18 # Tegn andre "gren", denne peker litt oppover
19 nål.left(30)
20 nål.forward(60)
21 nål.backward(60)
22 nål.right(30)
23
24 # Gå tilbake til start
25 nål.backward(90)
26
27nål.visualise()
Prøv selv:
Kjør programmet og se hva du får ut.
Hva gjør linje 19 til 22?
Obs
Pass på at koden stemmer med løsningsforslaget over før du går videre.
Bruke løkker til å tegne snøflak#
Nå har vi et program som instruerer skilpadden vår til å brodere en snøkrystallarm. Men snøkrystaller har gjerne flere armer, så får å tegne hele krystallen må vi gjenta disse kommandoene flere ganger. For det kan vi bruke en løkke. En mer detaljert forklaring på løkker i Python finner du her, men for nå er alt du trenger å vite at vi kan bruke en forløkke for å tegne fire armer slik:
1import turtlethread
2
3nål = turtlethread.Turtle()
4with nål.running_stitch(30):
5
6 for arm in range(4):
7 # Gå litt frem
8 nål.forward(90)
9
10 # Tegn første "gren", denne peker litt nedover
11 nål.right(30)
12 nål.forward(60)
13 nål.backward(60)
14 nål.left(30)
15
16 # Gå litt frem og tilbake
17 nål.forward(90)
18 nål.backward(90)
19
20 # Tegn andre "gren", denne peker litt oppover
21 nål.left(30)
22 nål.forward(60)
23 nål.backward(60)
24 nål.right(30)
25
26 # Gå tilbake til start
27 nål.backward(90)
28
29 # Roter 90 grader mot høyre for å tegne fire grener
30 nål.right(90)
31
32nål.visualise()
De eneste nye linjene i dette programemt er linje 6 og 30.
- Linje 6:
Definerer en
for
løkke og forteller python at alt som skjer inne i løkka skal gjentas 4 ganger. Legg merke til at linjene 7-30 har blitt flyttet ett innrykk inn. Det forteller python at disse linjene er inne i løkka og skal gjentas for hver runde i løkka- Linje 30:
Ber skilpadden om å rotere 90 grader for hver runde i løkka. Denne linja trenger vi for at snøkrystallarmene ikke skal tegnes oppå hverandre.
Prøv selv:
Kjør programmet og se hva du får ut
Hvorfor roterer det 90 grader i linje 30? Hva skjer om du endrer til 60?
Endre programemt slik at det tegner en snøkrystall med 6 armer istedenfor 4
Klikk her for å se programmet slik det skal være om du har gjort det rett:
1import turtlethread
2
3nål = turtlethread.Turtle()
4with nål.running_stitch(30):
5
6 for arm in range(6):
7 # Gå litt frem
8 nål.forward(90)
9
10 # Tegn første "gren", denne peker litt nedover
11 nål.right(30)
12 nål.forward(60)
13 nål.backward(60)
14 nål.left(30)
15
16 # Gå litt frem og tilbake
17 nål.forward(90)
18 nål.backward(90)
19
20 # Tegn andre "gren", denne peker litt oppover
21 nål.left(30)
22 nål.forward(60)
23 nål.backward(60)
24 nål.right(30)
25
26 # Gå tilbake til start
27 nål.backward(90)
28
29 # Roter 60 grader mot høyre for å tegne seks grener
30 nål.right(60)
31
32nål.visualise()
Obs
Pass på at koden stemmer med løsningsforslaget over før du går videre.
Nå har vi kode for å tegne et helt snøfnugg!
Prøv selv:
Bruk kode til å tegne dit eget snøfnugg med rotasjonssymmetri. Under er et galleri med noen eksempler til inspirasjon:
Lage en julekule med snøflakmønster#
For å lage juletrepynt med snøflakbroderiet må du først lagre mønsteret som en broderifil. Dette kan du gjøre ved å legge til
nål.save("snøflak.jef")
på slutten av scriptet ditt.
Merk at vi her bruker .jef
-filtypen, som vi har funnet ut at virker bra med Bernina 500 broderimaskinen vi har brukt, men du vil kanskje bruke en annen filtype for din maskin (f.eks. snøflak.pes
).
Når du har lagd broderifilen kan du følge disse instruksene for å lage en julekule:
Broder ett eller to snøfnugg, avhengig av om du vil ha snøfnugg på begge sidene av julekulen,
legg de to stoffbitene oppå hverandre slik at broderiene er rett over hverandre og peker utover,
og sy sammen stoffbitene (enten for hånd eller ved å tegne en sirkel med turtlethread).
Eksempelsnøflak#
Snøflak 1
Kode for arm
1from turtlethread import Turtle
2
3nål = Turtle()
4
5with nål.running_stitch(10):
6 # Roter snøflaket en halv runde
7 nål.right(30)
8
9 # Tegn en av armene til hovedsnøflaket
10 nål.forward(100)
11 nål.right(90)
12 nål.circle(30)
13 nål.circle(20)
14 nål.circle(10)
15 nål.left(90)
16 nål.backward(100)
17 nål.left(60)
18
19
20 # Roter snøflaket 30 grader før vi tegner det andre snøflaket
21 nål.right(30)
22 # Tegn armen til det andre snøflaket
23 nål.forward(40)
24 nål.right(90)
25 nål.circle(10)
26 nål.left(90)
27 nål.backward(40)
28 nål.left(60)
29
30nål.visualise()
Kode for snøflak
1from turtlethread import Turtle
2
3nål = Turtle()
4
5with nål.running_stitch(10):
6 # Roter snøflaket en halv runde
7 nål.right(30)
8
9 for arm in range(6): # Tegn en av armene til hovedsnøflaket
10 nål.forward(100)
11 nål.right(90)
12 nål.circle(30)
13 nål.circle(20)
14 nål.circle(10)
15 nål.left(90)
16 nål.backward(100)
17 nål.left(60)
18
19
20 # Roter snøflaket 30 grader før vi tegner det andre snøflaket
21 nål.right(30)
22 for arm in range(6): # Tegn det andre snøflaket
23 nål.forward(40)
24 nål.right(90)
25 nål.circle(10)
26 nål.left(90)
27 nål.backward(40)
28 nål.left(60)
29
30nål.visualise()
Snøflak 2
Kode for arm
1from turtlethread import Turtle
2
3nål = Turtle()
4
5with nål.running_stitch(10):
6 nål.forward(40*2)
7 nål.left(90)
8 nål.forward(30*2)
9 nål.left(127)
10 nål.forward(50*2)
11 nål.right(127)
12 nål.right(90)
13
14 nål.left(60)
15
16nål.visualise()
Kode for snøflak
1from turtlethread import Turtle
2
3nål = Turtle()
4
5with nål.running_stitch(10):
6 for arm in range(6):
7 nål.forward(40*2)
8 nål.left(90)
9 nål.forward(30*2)
10 nål.left(127)
11 nål.forward(50*2)
12 nål.right(127)
13 nål.right(90)
14
15 nål.left(60)
16
17nål.visualise()
Snøflak 3
Kode for arm
1from turtlethread import Turtle
2
3nål = Turtle()
4
5with nål.running_stitch(10):
6 # Tegn armen til hovedsnøflaket
7 nål.forward(100)
8 nål.right(40)
9 nål.forward(40)
10 nål.backward(40)
11 nål.left(40)
12 nål.forward(30)
13 nål.right(30)
14 nål.forward(20)
15 nål.backward(20)
16 nål.left(30)
17 nål.forward(20)
18
19 nål.backward(20)
20
21 nål.right(-30)
22 nål.forward(20)
23 nål.backward(20)
24 nål.left(-30)
25
26 nål.backward(30)
27
28 nål.right(-40)
29 nål.forward(40)
30 nål.backward(40)
31 nål.left(-40)
32 nål.backward(100)
33 nål.left(60)
34
35 # Roter 30 grader før det andre snøflaket tegnes
36 nål.right(30)
37
38 # Tegn armen til det andre snøflaket
39 nål.forward(50)
40
41 nål.right(40)
42 nål.forward(20)
43 nål.backward(20)
44 nål.left(40)
45
46 nål.forward(30)
47 nål.backward(30)
48
49 nål.left(40)
50 nål.forward(20)
51 nål.backward(20)
52 nål.right(40)
53
54 nål.backward(50)
55 nål.left(60)
56
57nål.visualise()
Kode for snøflak
1from turtlethread import Turtle
2
3nål = Turtle()
4
5with nål.running_stitch(10):
6 for arm in range(6): # Tegn av armene til hovedsnøflaket
7 nål.forward(100)
8 nål.right(40)
9 nål.forward(40)
10 nål.backward(40)
11 nål.left(40)
12 nål.forward(30)
13 nål.right(30)
14 nål.forward(20)
15 nål.backward(20)
16 nål.left(30)
17 nål.forward(20)
18
19 nål.backward(20)
20
21 nål.right(-30)
22 nål.forward(20)
23 nål.backward(20)
24 nål.left(-30)
25
26 nål.backward(30)
27
28 nål.right(-40)
29 nål.forward(40)
30 nål.backward(40)
31 nål.left(-40)
32 nål.backward(100)
33 nål.left(60)
34
35 # Roter 30 grader før det andre snøflaket tegnes
36 nål.right(30)
37
38 for arm in range(6): # Tegn en av armene til det andre snøflaket
39 nål.forward(50)
40
41 nål.right(40)
42 nål.forward(20)
43 nål.backward(20)
44 nål.left(40)
45
46 nål.forward(30)
47 nål.backward(30)
48
49 nål.left(40)
50 nål.forward(20)
51 nål.backward(20)
52 nål.right(40)
53
54 nål.backward(50)
55 nål.left(60)
56
57nål.visualise()