Brodere en beskjed med morsekode

Brodere en beskjed med morsekode#

I dette eksempelet skal vi se på hvordan vi kan oversette beskjeder til morsekode og hvordan vi kan lage et broderimønster fra disse beskjedene.

Tegne morsekode#

Vi starter det hele med å importere Turtle fra turtlethread.

1from turtlethread import Turtle

Da er neste steg å lage kode som tegner denne morsekode med et skilpaddeobjekt. Dette gjør vi ved å definere hvordan vi tegner en prikk og en strek. Det vi vet om morsekode er:

  • En prikk varer en tidsenhet

  • En strek varer tre tidsenheter

  • Mellomrommet mellom hvert tegn er tre tidsenheter

  • Mellomrommet mellom hvert ord er syv tidsenheter

Basert på dette kan vi tegne prikker og streker med turtlethread. Det er mange måter vi kan gjøre det på, men vi har valgt denne:

../_images/morse_nb_NO.svg

La oss lage en funksjon for å tegne en prikk, en funksjon for å tegne en strek og en funksjon som tar inn et morsetegn (strek eller mellomrom) og tegner det.

 1def draw_dash(needle, length, height):
 2    """Use the Turtle object ``needle`` to draw a dash.
 3    """
 4    needle.left(90)
 5    needle.forward(height)
 6    needle.right(90)
 7    needle.forward(3*length)
 8    needle.right(90)
 9    needle.forward(height)
10    needle.left(90)
11
12def draw_dot(needle, length, height):
13    """Use the Turtle object ``needle`` to draw a dot.
14    """
15    needle.left(90)
16    needle.forward(height)
17    needle.right(90)
18    needle.forward(length)
19    needle.right(90)
20    needle.forward(height)
21    needle.left(90)
22
23def draw_morse_symbol(symbol, needle, length, height):
24    """Use the Turtle object ``needle`` to draw a morse symbol (dot, dash or pause).
25    """
26    if symbol == ".":
27        draw_dot(needle, length, height)
28    elif symbol == "-":
29        draw_dash(needle, length, height)
30    elif symbol == " ":
31        needle.forward(length)

Nå har vi kode som tegner hvert tegn i en morsekode, men vi må også lage kode for å tegne en hel beskjed.

 1def draw_morse_code(morse_code, needle, length, height):
 2    """Use the Turtle object ``needle`` to draw morse code
 3    """
 4    # We want a small space at the beginning. This is not necessary, but makes the embroidery prettier.
 5    needle.forward(length/2)
 6
 7    # We can iterate over each letter in a string
 8    for morsebokstav in morse_code:
 9        draw_morse_tegn(morsebokstav, needle, length=length, height=height)
10        needle.forward(length)  # We add a unit-length space between each symbol
11
12    # We want a small space at the end also. This is not necessary, but makes the embroidery prettier.
13    needle.forward(length/2)

La oss prøve ut koden så langt ved å tegne SOS (... --- ...) med morsekode.

1needle = Turtle()
2with needle.running_stitch(30):
3    draw_morse_code("... --- ...", needle, 60, 200)
4
5needle.save("sos.svg")
SOS skrevet med morsekode.

Oversette tekst til morsekode#

Neste steg er å lage kode som gjør om tekst til morsekode. For å gjøre det bruker vi ett oppslagsverk (dictionary) som transformerer bokstaver og tegn til morsekode.

 1MORSEALFABET = {
 2    'A': '.-',     'B': '-...',   'C': '-.-.',
 3    'D': '-..',    'E': '.',      'F': '..-.',
 4    'G': '--.',    'H': '....',   'I': '..',
 5    'J': '.---',   'K': '-.-',    'L': '.-..',
 6    'M': '--',     'N': '-.',     'O': '---',
 7    'P': '.--.',   'Q': '--.-',   'R': '.-.',
 8    'S': '...',    'T': '-',      'U': '..-',
 9    'V': '...-',   'W': '.--',    'X': '-..-',
10    'Y': '-.--',   'Z': '--..',   'Æ': '.-.-',
11    'Ø': '---.',   'Å': '.--.-',  '1': '.----',
12    '2': '..---',  '3': '...--',  '4': '....-',
13    '5': '.....',  '6': '-....',  '7': '--...',
14    '8': '---..',  '9': '----.',  '0': '-----',
15    ',': '--..--', '.': '.-.-.-', '?': '..--..',
16    '/': '-..-.',  '-': '-....-', '(': '-.--.',
17    ')': '-.--.-', ' ': '   '
18}

Så oppretter vi en funksjon som tar inn en tekststreng og gjør den om til morsekode.

1def oversett_tekst_til_morse(tekst):
2    morsetekst = ""
3    for bokstav in tekst:
4        morsetekst += MORSEALFABET[bokstav.upper()]
5        morsetekst += " "
6    return morsetekst
7
8print(oversett_tekst_til_morse("Hei på deg"))
.... . ..     .--. .--.-     -.. . --. 

Tegne tekst som morsekode#

Vi ser at vi fikk skrevet ut «Hei på deg» med morsetegn. La oss bruke tegn_morsekode for å tegne denne teksten.

1morsekode = oversett_tekst_til_morse("Hei på deg")
2penn = Turtle()
3with penn.running_stitch(30):
4    tegn_morsekode(morsekode, penn, 60, 200)
5
6penn.save("hei_på_deg.svg")
Teksten "Hei på deg" med morsetegn

Her har vi en fin liten beskjed. La oss putte dette inn i en funksjon som tar inn en tekststreng og bruker en skilpadde for å tegne morsekoden som representerer den tekststrengen.

 1def tegn_morsekode_fra_tekst(tekst, penn, lengde, høyde):
 2    morsekode = oversett_tekst_til_morse(tekst)
 3    tegn_morsekode(morsekode, penn, lengde, høyde)
 4
 5penn = Turtle()
 6with penn.running_stitch(30):
 7    tegn_morsekode_fra_tekst("Hei verden", penn, 60, 200)
 8
 9penn.save("hei_verden.jef")
10penn.save("hei_verden.svg")
Teksten "Hei verden" med morsetegn