Mini-projekt – ponadczasowe zegary
Rozpoznawalna tarcza zegara — po prostu geometria: podział przez równe kąty, liczby, dwie wskazówki w ustalonych kierunkach.
Co zbudujemy
Timeless Watch to statyczna tarcza zegarka analogowego. Moduł
datetime jeszcze nie potrzebujemy — strzałki zostaną naprawione
kąt, po prostu po to, by pokazać, jak rozpoznawalny obiekt jest złożony z geometrii.
import turtle
screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#0D0230")
artist.pensize(3)
#circle(150) wyśrodkowuje okrąg 150 px LEWO od obecnego kursu —
# więc zacznij 150 niżej (0, -150), tak aby środek tarczy spadał do (0, 0)
artist.penup()
artist.goto(0, -150)
artist.pendown()
artist.circle(150)
for hour in range(12):
artist.penup()
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(135)
artist.pendown()
artist.forward(15)
artist.penup()
for hour, label in [(0, "12"), (3, "3"), (6, "6"), (9, "9")]:
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(110)
artist.write(label, align="center", font=("Arial", 16, "bold"))
artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()
artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)
screen.exitonclick()
Plan geometryczny
12 podziałów pokrętła jest ułożonych w okręgu w regularnych odstępach – znana formuła
360 / 12 = 30 stopni między sąsiednimi godzinami. Ale w przeciwieństwie do
zwykłego wielokąta, tutaj wygodniej ustawiać kąt każdego podziału ABSOLUTNIE, przez
setheading(), a nie kumulować się na przemian:
# godzina 0 (12 godzin) – w górę, 90°
# godzina 3 — kierunek w prawo, 0°
# godzina 6 — kierunek w dół, -90°
# godzina 9 — kierunek w lewo, 180°
# ogólnie: ugol = 90 - hour * 30
Krok 1: Koło i znaczniki
import turtle
screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#0D0230")
artist.pensize(3)
#circle(150) wyśrodkowuje okrąg 150 px LEWO od obecnego kursu —
# więc zacznij 150 niżej (0, -150), tak aby środek tarczy spadał do (0, 0)
artist.penup()
artist.goto(0, -150)
artist.pendown()
artist.circle(150)
for hour in range(12):
artist.penup()
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(135)
artist.pendown()
artist.forward(15)
artist.penup()
screen.exitonclick()
artist.circle(150)
for hour in range(12):
artist.penup()
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(135)
artist.pendown()
artist.forward(15)
artist.penup()
Krok 2: Liczby i strzałki
for hour, label in [(0, "12"), (3, "3"), (6, "6"), (9, "9")]:
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(110)
artist.write(label, align="center", font=("Arial", 16, "bold"))
# wskazówka godzinowa — krótsza, grubsza, ustawiona na 12
artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()
# wskazówka minutowa — dłuższa, cieńsza, przymocowana do 2
artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)
Końcowy efekt
import turtle
screen = turtle.Screen()
screen.setup(width=420, height=420)
artist = turtle.Turtle()
artist.speed(0)
artist.pencolor("#0D0230")
artist.pensize(3)
#circle(150) wyśrodkowuje okrąg 150 px LEWO od obecnego kursu —
# więc zacznij 150 niżej (0, -150), tak aby środek tarczy spadał do (0, 0)
artist.penup()
artist.goto(0, -150)
artist.pendown()
artist.circle(150)
for hour in range(12):
artist.penup()
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(135)
artist.pendown()
artist.forward(15)
artist.penup()
for hour, label in [(0, "12"), (3, "3"), (6, "6"), (9, "9")]:
artist.goto(0, 0)
artist.setheading(90 - hour * 30)
artist.forward(110)
artist.write(label, align="center", font=("Arial", 16, "bold"))
artist.pensize(5)
artist.pencolor("#5B24F9")
artist.goto(0, 0)
artist.setheading(90 - 12 * 30)
artist.pendown()
artist.forward(80)
artist.penup()
artist.pensize(3)
artist.pencolor("#DB2777")
artist.goto(0, 0)
artist.setheading(90 - 2 * 30)
artist.pendown()
artist.forward(120)
screen.exitonclick()
Dodaj pozostałe 8 liczb (1, 2, 4, 5, 7, 8, 10, 11) według tej samej zasady.
Dodaj trzecią, najcieńszą rękę – drugą wskazówkę – do dowolnego ustalonego kąta.
Zmień kąty wskazówek godzinowych i minutowych, aby zegarek pokazywał inny (również stały) czas.