""" Zeichnet Ziffern aus sieben Segmenten. (c)2021 if1.net-schulbuch.de (bda_ornamente) Eine Ziffer setzt sich aus sieben Segmenten zusammen. Diese werden üblicherweise mit den Buchstaben a bis g bezeichnet. +-a-+ f b +-g-+ e c +-d-+ Siehe: https://de.wikipedia.org/wiki/Segmentanzeige """ import turtle from math import sqrt def segment_zeichnen(groesse, linienfarbe=(0.0, 0.0, 0.0), fuellfarbe=(1.0, 1.0, 1.0), stil='standard'): """ Zeichnen eines Segments. Parameter groesse :Breite de Ziffer in Pixel, die Höhe ist das Doppelte. stil: 'standard'(default), 'schmal', medium', 'fett' Die Turtle steht an der 'Spitze' des Segments in korrekter Richtung. Am Ende steht die Turtle wieder so wie am Anfang. Wenn 'groesse' < 6, Linien mit Dicke 1 und Linienfarbe zeichnen Wenn 'groesse' < 11, Linien mit Dicke 2 und Linienfarbe zeichnen Andernfalls Segment als lang gezogenes Sechseck mit Linienfarbe und Füllfarbe zeichnen. """ if stil == 'schmal': elem = 0.94 ende = sqrt(2 * 0.03**2) elif stil == 'medium': elem = 0.66 ende = sqrt(2 * 0.17**2) elif stil == 'fett': elem = 0.5 ende = sqrt(2 * 0.25**2) else: elem = 0.8 ende = sqrt(2 * 0.1**2) turtle.pendown() turtle.colormode(1) stiftFarbe = turtle.pencolor() fuellFarbe = turtle.fillcolor() turtle.color(linienfarbe, fuellfarbe) if groesse < 6: turtle.forward(groesse) turtle.backward(groesse) elif groesse < 11: turtle.pensize(2) turtle.forward(groesse) turtle.backward(groesse) turtle.pensize(1) else: turtle.begin_fill() turtle.left(45) turtle.forward(groesse*ende) turtle.right(45) turtle.forward(groesse*elem) turtle.right(45) turtle.forward(groesse*ende) turtle.right(90) turtle.forward(groesse*ende) turtle.right(45) turtle.forward(groesse*elem) turtle.right(45) turtle.forward(groesse*ende) turtle.right(135) turtle.end_fill() turtle.pencolor(stiftFarbe) turtle.fillcolor(fuellFarbe) turtle.penup() def ziffer_zeichnen(ziffer, groesse, linienfarbe=(0.0, 0.0, 0.0), fuellfarbe=(1.0, 1.0, 1.0), stil="standard"): """ Durchläuft alle Segmente und zeichnet sie, wenn sie zur Ziffer gehören. Die feste Reihenfolge ist: dcbafge. Start ist in Schreibrichtung. Ende ist der Schreibstart. """ if ziffer < 0 or ziffer > 9: return # Die zu jeder Ziffer gehörenden Segmente. segmente = ['abcdef', 'bc', 'abged', 'abcdg', 'bcgf', 'afgcd', 'afedcg', 'abc', 'abcdefg', 'gfabcd', ] altePosition = turtle.position() alterKurs = turtle.heading() turtle.penup() turtle.hideturtle() turtle.speed(0) if 'd' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.forward(groesse) turtle.left(90) if 'c' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.forward(groesse) if 'b' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.forward(groesse) turtle.left(90) if 'a' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.forward(groesse) turtle.left(90) if 'f' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.forward(groesse) turtle.left(90) if 'g' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.right(90) if 'e' in segmente[ziffer]: segment_zeichnen(groesse, linienfarbe, fuellfarbe, stil) turtle.setposition(altePosition) turtle.setheading(alterKurs) #turtle.pendown() def zahl_zeichnen(zahl, groesse, linienfarbe=(0.0, 0.0, 0.0), fuellfarbe=(1.0, 1.0, 1.0), stil="standard"): """ Zeichnet die angegebene Zahl. Abstand der Ziffern ist groesse*1.6. Abstand der Zeilen ist groesse*2.6. """ ziffern = [] while zahl > 0: z = zahl % 10 ziffern.insert(0, z) zahl //= 10 altePosition = turtle.position() alterKurs = turtle.heading() for i in ziffern: ziffer_zeichnen(i, groesse, linienfarbe, fuellfarbe, stil) turtle.forward(groesse*1.6) turtle.setposition(altePosition) turtle.setheading(alterKurs) if __name__ == "__main__": from time import time turtle.penup() size = 10 t = time() turtle.left(90) turtle.forward(2*size) turtle.right(45) zahl_zeichnen(73102, size, fuellfarbe=(0.0, 0.0, 0.0)) turtle.left(45) turtle.backward(2*size) turtle.right(90) print(time() - t) turtle.backward((size*1.6)*5) for i in range(10): ziffer_zeichnen(i, size, fuellfarbe=(1.0, 0.0, 0.75), stil='schmal') turtle.penup() turtle.forward(size*1.6) turtle.right(90) turtle.forward(size*2.6) turtle.left(90) turtle.backward((size*1.6)*10) for i in range(10): ziffer_zeichnen(i, size, fuellfarbe=(0.0, 0.75, 0.75), stil='standard') turtle.penup() turtle.forward(size*1.6) turtle.right(90) turtle.forward(size*2.5) turtle.left(90) turtle.backward((size*1.6)*10) for i in range(10): ziffer_zeichnen(i, size, fuellfarbe=(0.0, 1.0, 0.0), stil='medium', linienfarbe=(1.0, 0.0, 0.05)) turtle.penup() turtle.forward(size*1.6) turtle.right(90) turtle.forward(size*2.5) turtle.left(90) turtle.backward((size*1.6)*10) for i in range(10): ziffer_zeichnen(i, size, fuellfarbe=(0.8, 0.5, 0.05), stil='fett', linienfarbe=(0.95, 0.95, 0.95)) turtle.penup() turtle.forward(size*1.6)