Глава 12 · Множество увлекательных мини-проектов!
Проект: пиксельная графика по сетке
Данные → алгоритм → графика: вложенный список решает, что нарисовать, а вложенный цикл — как.
Используем
nested listnested forTurtleУровень
★★★★ challenge
Результат
пиксельная графика
Что создаём
Мост между данными и графикой: матрица из нулей и единиц — и программа, которая рисует
по ней картинку. 0 — пусто, 1 —
закрашенный квадрат.
0
1
2
3
4
0
0
1
0
1
0
1
1
1
1
1
1
2
1
1
1
1
1
3
0
1
1
1
0
4
0
0
1
0
0
setka_piksel_art.py
import turtle
screen = turtle.Screen()
screen.setup(width=360, height=360)
artist = turtle.Turtle()
artist.speed(0)
artist.hideturtle()
artist.penup()
picture = [
[0, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0],
]
razmer = 40
for row_index, row in enumerate(picture):
for col_index, value in enumerate(row):
if value == 1:
x = -100 + col_index * razmer
y = 100 - row_index * razmer
artist.goto(x, y)
artist.pendown()
artist.fillcolor("#DB2777")
artist.begin_fill()
for _ in range(4):
artist.forward(razmer)
artist.right(90)
artist.end_fill()
artist.penup()
screen.exitonclick()
Результат выполнения
Алгоритм
setka_piksel_art.py
picture = [
[0, 1, 0, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0],
]
razmer = 40
for row_index, row in enumerate(picture):
for col_index, value in enumerate(row):
if value == 1:
x = -100 + col_index * razmer
y = 100 - row_index * razmer
artist.goto(x, y)
artist.pendown()
artist.begin_fill()
for _ in range(4):
artist.forward(razmer)
artist.right(90)
artist.end_fill()
artist.penup()
Вложенный цикл — строка за строкой, столбец за столбцом
Внешний цикл (глава 10) идёт по строкам матрицы, внутренний — по значениям внутри строки; та же схема, что и у матрицы из главы 11 (§11.11), только теперь на каждую единицу рисуется квадрат, а не просто печатается число.
★★★ Задача повышенной сложности
Измените ОДНО: своя картинка
Замените picture на свою собственную матрицу 5×5 (или другого размера) из нулей и единиц — буква, смайлик, любой узор. Алгоритм менять не нужно.
Debug Lab
Что произойдёт, если в формуле координат перепутать местами
row_index и col_index?
debug_lab_grid.py
x = -100 + row_index * razmer # было col_index
y = 100 - col_index * razmer # было row_index
Картинка окажется зеркально отражённой (транспонированной)
Строки и столбцы поменяются местами — там, где должна быть широкая горизонтальная часть сердца, получится вытянутая вертикальная. Формулы координат нужно очень аккуратно сверять с тем, что означает каждый индекс.
Практика: пиксельная графика по своей матрице
Модуль turtle открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально