turtle приведены в основной презентации (повороты, движения, подъем/опускание пера, переход в точку, рисование точки), см. раздел «Основные команды».Теория и цели задания
Что проверяется:
- Понимание основных конструкций языка программирования.
- Умение читать и отлаживать программы.
- Навык мысленного (или реального) построения фигуры по командам исполнителя.
- Умение использовать циклы, повторения и команды движения.
Что нужно уметь: строить фигуру, которую нарисует Черепаха, при известном начальном положении (в начале координат, направлена вверх, хвост опущен).
Основные команды модуля turtle
import turtle as t
t.left(90) # повернуть налево на 90°
t.right(90) # повернуть направо на 90°
t.forward(100) # движение вперёд на 100 шагов
t.backward(50) # движение назад
t.penup() # поднять перо
t.pendown() # опустить перо
t.goto(x, y) # переместиться в точку (x, y)
t.dot(4) # нарисовать точку радиусом 4
t.shape("turtle") # сменить вид на черепаху
t.pensize(3) # толщина линии
t.pencolor("cyan") # цвет линии
Разбор заданий
Задача 1
Алгоритм: Повтори 7 [Вперёд 10 Направо 120]
Что делает: рисует звездообразный многоугольник (семикратное повторение треугольного шага).
Нужно определить количество целочисленных точек внутри фигуры (без точек на границе).
import turtle as t
k = 50
t.left(90)
for i in range(7):
t.forward(10*k)
t.right(120)
t.up()
t.pencolor('red')
for x in range(0, 11):
for y in range(0, 11):
t.goto(x*k, y*k)
t.dot(6)
# ответ по рисунку → 38
Ответ: 38 точек.
Задача 2
Алгоритм: Повтори 4 [Вперёд 5 Направо 90 Вперёд 10 Направо 90]
Рисуется прямоугольная фигура, составленная из четырёх трапеций.
Нужно посчитать точки внутри (без границы).
for i in range(4):
t.forward(5*k)
t.right(90)
t.forward(10*k)
t.right(90)
# ответ по рисунку → 36
Ответ: 36 точек.
Задача 3
Алгоритм: Повтори 4 [Вперёд 10 Направо 60 Вперёд 10 Направо 120]
Рисуется «ромбовидная звезда». Считаем количество целочисленных точек внутри без учёта границы.
for i in range(4):
t.forward(10*k)
t.right(60)
t.forward(10*k)
t.right(120)
# ответ → 80
Ответ: 80 точек.
Задача 4
Алгоритм: Повтори 14 [Направо 60 Вперёд 2 Направо 60 Вперёд 2 Направо 270]
Здесь точки на границе учитывать нужно.
for i in range(14):
t.right(60)
t.forward(2*k)
t.right(60)
t.forward(2*k)
t.right(270)
# ответ → 148
Ответ: 148 точек (включая точки на линии).
Задача 5
Алгоритм объединяет две фигуры:
Повтори 4 [Вперёд 10 Направо 90] (квадрат)
и
Повтори 5 [Вперёд 6 Направо 60 Вперёд 6 Направо 120] (ромб), повернутый на 30°.
Нужно найти количество точек, которые находятся внутри квадрата, но вне ромба.
for i in range(4):
t.forward(10*k)
t.right(90)
t.right(30)
t.pencolor('cyan')
for i in range(5):
t.forward(6*k)
t.right(60)
t.forward(6*k)
t.right(120)
# ответ → 51
Ответ: 51 точка.
Что повторить из Python перед решением
- Циклы:
for i in range(...), вложенные циклы, работа с диапазонами. - Условные операторы:
if / else— фильтрация точек по условиям. - Функции: определение функций, возврат результата, использование
return. - Импорт модулей:
import turtle as t, использование псевдонимов. - Типы данных: числа, строки, списки.
- Работа с циклами Повтори: понимание, как запись
Повтори k [Команда1 Команда2]превращается в циклfor i in range(k):. - Функции ускорения отрисовки:
speed(0),tracer(0),update().
Лайфхаки ускорения рисования
t.speed(0)— максимальная скорость линий (без анимации).t.tracer(0, 0)— отключает отрисовку;t.update()покажет результат одним кадром.t.hideturtle()иt.pensize(1)уменьшают нагрузку на анимацию.
import turtle as t
t.hideturtle()
t.speed(0)
t.tracer(0, 0)
# ваш рисунок здесь
t.update()
Подсчёт целочисленных точек: 2 подхода
Подход A — через цвет пикселя (быстрый старт)
Идея: закрасить внутренность многоугольника цветом (например, red) и обойти сетку с шагом масштаба K, считывая цвет в координате. Если цвет равен red — точку учитываем. Такой метод прост и хорошо иллюстрирует идею, но может давать сбои при наложении сегментов/толстых линий и из-за особенностей Canvas.
Улучшенная версия «цветового» метода с ускорением
import turtle as t
def setup_fast():
t.hideturtle(); t.speed(0); t.tracer(0, 0)
def get_color_at_canvas_xy(x, y):
# Получаем tk.Canvas и смотрим верхний элемент под точкой (x,y)
sc = t.getcanvas()
items = sc.find_overlapping(x, y, x, y)
if not items:
return None
return sc.itemcget(items[-1], 'fill') or sc.itemcget(items[-1], 'outline')
def count_grid_points_by_color(xmin, xmax, ymin, ymax, K=10, target='red'):
cnt = 0
for ix in range(xmin, xmax + 1):
for iy in range(ymin, ymax + 1):
# tk.Canvas ось Y направлена вниз — инвертируем экранную Y
col = get_color_at_canvas_xy(ix * K, -iy * K)
if col == target:
cnt += 1
return cnt
# Пример использования:
# 1) рисуем и заливаем красным; 2) t.update(); 3) считаем
setup_fast()
K = 10
t.color('green', 'red') # граница зелёная, внутренняя заливка красная
t.begin_fill()
t.left(90)
for _ in range(4):
t.forward(10 * K)
t.right(90)
t.end_fill()
t.update()
inside = count_grid_points_by_color(-50, 50, -50, 50, K=K, target='red')
print(inside)
Важный приём: если по условию нужно учитывать точки на границе, сделайте и линию, и заливку red: t.color('red', 'red'). Если не учитывать — задайте линии другой цвет: t.color('green', 'red'). Это устраняет двусмысленность при чтении цвета.
Подход B — геометрический (надёжно и очень быстро)
Вместо чтения пикселей используем математику: строим список вершин многоугольника из команд Черепахи и считаем точки внутри методом «луча» (ray casting). Преимущества — стабильность, отсутствие артефактов Canvas, скорость.
1) Как получить вершины многоугольника
Черепашка ходит по сетке в масштабе K. Мы можем не рисовать, а лишь «симулировать» её команды и собирать вершины в список.
import math
def simulate_turtle_path(commands, K=10, start=(0.0, 0.0), heading_deg=90.0):
"""
commands: список шагов, например:
[('fd', 10), ('rt', 120), ('rep', 7, [('fd', 10), ('rt', 120)])]
Возвращает список вершин (x, y) в ПИКСЕЛЯХ экрана (как у turtle),
где ось Y направлена вверх (как в математике).
"""
x, y = start
ang = math.radians(heading_deg)
verts = [(x, y)]
def fd(n):
nonlocal x, y
x += K * n * math.cos(ang)
y += K * n * math.sin(ang)
verts.append((x, y))
def rt(a):
nonlocal ang
ang -= math.radians(a)
def lt(a):
nonlocal ang
ang += math.radians(a)
def exec_list(lst):
for cmd, *args in lst:
if cmd == 'fd': fd(args[0])
elif cmd == 'rt': rt(args[0])
elif cmd == 'lt': lt(args[0])
elif cmd == 'rep':
times, sub = args
for _ in range(times): exec_list(sub)
else:
raise ValueError('unknown cmd', cmd)
exec_list(commands)
return verts
# пример для «Повтори 7 [Вперёд 10 Направо 120]»
commands = [('rep', 7, [('fd', 10), ('rt', 120)])]
V = simulate_turtle_path(commands, K=50) # список вершин
2) Проверка «точка внутри многоугольника» (ray casting)
def point_in_poly(px, py, poly):
""" Возвращает: 1 – внутри, 0 – снаружи, 2 – на границе. """
inside = False
on_edge = False
n = len(poly)
for i in range(n):
x1, y1 = poly[i]
x2, y2 = poly[(i+1) % n]
# проверка на ребро (точка лежит на отрезке)
# векторное уравнение + допуск по коллинеарности
dx, dy = x2 - x1, y2 - y1
dxp, dyp = px - x1, py - y1
cross = dx * dyp - dy * dxp
if abs(cross) < 1e-9:
dot = dxp * dx + dyp * dy
if 0 - 1e-9 <= dot <= dx*dx + dy*dy + 1e-9:
on_edge = True
break
# пересечение луча вправо с ребром
condY = (y1 > py) != (y2 > py)
if condY:
x_int = x1 + dx * (py - y1) / (y2 - y1)
if x_int > px:
inside = not inside
if on_edge: return 2
return 1 if inside else 0
3) Подсчёт решётчатых точек в ограничивающем прямоугольнике
Считаем только целочисленные точки (с шагом масштаба K). Можно включать или исключать границу.
def count_lattice_points(poly, K=10, include_border=False):
xs = [x for x, y in poly]; ys = [y for x, y in poly]
xmin, xmax = int(min(xs) // K) - 1, int(max(xs) // K) + 1
ymin, ymax = int(min(ys) // K) - 1, int(max(ys) // K) + 1
total = 0
for ix in range(xmin, xmax + 1):
for iy in range(ymin, ymax + 1):
px, py = ix * K, iy * K
pos = point_in_poly(px, py, poly)
if pos == 1 or (include_border and pos == 2):
total += 1
return total
# пример:
include_border = False # или True — если по условию нужно учитывать точки на границе
ans = count_lattice_points(V, K=50, include_border=include_border)
print(ans)
Почему это быстрее и стабильнее: мы вообще не трогаем Canvas и цвета; работаем в чистой геометрии, ограничиваем перебор рамкой (bounding box), и за счёт этого код надёжно работает даже при сложных «накладывающихся» линиях или большой толщине пера.
Применяем к задачам из урока
Структура решения одинакова для всех пяти задач из презентации: формируем список команд (с повторами), получаем вершины simulate_turtle_path, затем считаем точки count_lattice_points. Если в условии «точки на линии учитывать/не учитывать», достаточно переключать include_border и/или подбирать цвет границы/заливки (в «цветовом» методе). Примеры исходных алгоритмов и разметка холста показаны в материалах урока.
О решении на PascalABC
Некоторые преподаватели предлагают выполнять подобные задачи на PascalABC, так как там визуализация проще и быстрее.
Однако переходить на другой язык ради одного задания нецелесообразно.
- Плюсы: высокая скорость отрисовки, встроенный графический холст.
- Минусы: ради одной задачи менять язык и среду не нужно; Python с
turtle.tracer(0)даёт ту же скорость.
Вывод: остаёмся на Python. Если хочется, можно ознакомиться с видеороликом по PascalABC:
разбор на YouTube.
Чек-лист перед сдачей решения
- Выдержан масштаб
Kи начальное направление «на север» (left(90)) - Команды повтора (
Повтори k [ ... ]) корректно развернуты в циклы - Точки на границе учитываются/исключаются согласно условию (
include_borderили цветовую схему)? - Анимация отключена (
speed(0)+tracer(0,0)+update()) для ускорения? - Подсчёт сделан геометрически (надёжно), а не через «на глаз по картинке»?
Задания для подготовки
Простые
- https://kompege.ru/task?id=4694 Смотреть разбор
- https://kompege.ru/task?id=4717
- https://kompege.ru/task?id=4742 Смотреть разбор Вариант 2
- https://kompege.ru/task?id=4747 Смотреть разбор
- https://kompege.ru/task?id=4752
- https://inf-ege.sdamgia.ru/problem?id=75243 Смотреть разбор
- https://kompege.ru/task?id=17860 Смотреть разбор
- https://kompege.ru/task?id=23190 Смотреть разбор
Средние
- https://inf-ege.sdamgia.ru/problem?id=48454 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=52845 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=58245 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=47404 Смотреть разбор
- https://kompege.ru/task?id=9987 Смотреть разбор
Сложные
- https://inf-ege.sdamgia.ru/problem?id=58248 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=58249 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=68239 Смотреть разбор
- https://inf-ege.sdamgia.ru/problem?id=55593 Смотреть разбор
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6350 Смотреть разбор
- https://kompege.ru/task?id=16253
- https://kompege.ru/task?id=13848
- https://kompege.ru/task?id=13845
- https://kompege.ru/task?id=13843
- https://kompege.ru/task?id=13841
- https://kompege.ru/task?id=13835
- https://kompege.ru/task?id=13247
- https://kompege.ru/task?id=11533
- https://kompege.ru/task?id=6762
- https://kompege.ru/task?id=5428
- https://kompege.ru/task?id=5379
- https://kompege.ru/task?id=5150
- https://kompege.ru/task?id=4834
- https://kompege.ru/task?id=4830
- https://kompege.ru/task?id=4828
- https://kompege.ru/task?id=4826
- https://kompege.ru/task?id=4743
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8374
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8373
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8372
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8371
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8370
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8068
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8067
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8066
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8059
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=8056
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7886
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7885
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7884
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7883
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7882
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7881
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=7365
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6448
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6447
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6446
- https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=6445
- https://education.yandex.ru/ege/task/f0313c16-d430-4903-a234-73f6d2753066
- https://education.yandex.ru/ege/task/d2df37be-0530-4f21-bc5a-e8bd4cb9a299
- https://education.yandex.ru/ege/task/dad05297-e113-4aca-859b-6b22efe7e4c3
- https://education.yandex.ru/ege/task/b983ceae-433d-4e57-bbda-af5a9cfd2520
- https://education.yandex.ru/ege/task/b42704bc-b6b7-420b-9e9a-7b701e544087
- https://education.yandex.ru/ege/task/7b60b06e-c339-4b65-b9bd-44fc7e11767f
- https://education.yandex.ru/ege/task/d357aaaa-53b2-4348-bb4d-ee71688c114e
- https://education.yandex.ru/ege/task/a5a6fe7c-3e0b-4e9c-9dbf-10560a973262
- https://education.yandex.ru/ege/task/c6285aaf-7b03-4e47-bd3a-241d1cae56b9
- https://education.yandex.ru/ege/task/a10ac35a-d156-4410-b805-f4891aab9345
- https://education.yandex.ru/ege/task/a9b4ee81-7aca-4fca-9eec-1801673d12f2
- https://education.yandex.ru/ege/task/c6d8a84e-640e-40c0-a97d-2569546ec12f
