Алгоритм решения задания 14. Часть 1
Учимся решать 15 задания первого типа
Читать
Исполнитель Чертёжник действует на плоскости с декартовой системой координат, в которой единица длины по каждой из осей соответствует одному сантиметру. В начальный момент Чертёжник находится в начале координат, перо опущено. При опущенном пере Чертёжник оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя.
У исполнителя существует 3 команды: Поднять перо, означающая переход к перемещению без рисования; Опустить перо, означающая переход в режим рисования; Сместиться x, y (где x, y — целые числа), вызывающая перемещение Чертёжника из текущего положения в точку с координатами x, y.
Чертёжнику был дан для исполнения следующий алгоритм:
Сместиться 77, 189
Опустить перо
Сместиться 288, 60
Сместиться 258, -130
Сместиться 0, -200
Сместиться -170, -78
Сместиться -118, 122
Сместиться 77, 189
Определите, сколько точек с целочисленными координатами будут находиться внутри области, ограниченной линией, заданной данным алгоритмом. Точки на линии учитывать не следует.
import math as m
from turtle import *
tracer(0) #
teleport(77, 189)
# --- if Python < 3.12 ---
# pu()
# goto(20,40)
# pd()
# --- end if ---
# Первая фигура
begin_poly()
goto(288, 60)
goto(258, -130)
goto(0, -200)
goto(-170, -78)
goto(-118, 122)
goto(77, 189)
end_poly()
coords = get_poly()
angles = []
count = 0
for coord in coords[1:]:
angles.append(towards(*coord))
goto(coord)
k_1 = m.tan(m.radians(angles[0]))
k_2 = m.tan(m.radians(angles[1]))
k_3 = m.tan(m.radians(angles[2]))
k_4 = m.tan(m.radians(angles[3]))
k_5 = m.tan(m.radians(angles[4]))
k_6 = m.tan(m.radians(angles[5]))
b_1 = coords[0][1] - k_1 * coords[0][0]
b_2 = coords[1][1] - k_2 * coords[1][0]
b_3 = coords[2][1] - k_3 * coords[2][0]
b_4 = coords[3][1] - k_4 * coords[3][0]
b_5 = coords[4][1] - k_5 * coords[4][0]
b_6 = coords[5][1] - k_6 * coords[5][0]
def get_min_max_coordinates(coordinates):
min_x = m.floor(min(x for x, _ in coordinates))
max_x = m.ceil(max(x for x, _ in coordinates))
min_y = m.floor(min(y for _, y in coordinates))
max_y = m.ceil(max(y for _, y in coordinates))
return min_x, max_x, min_y, max_y
ranges = get_min_max_coordinates(coords)
for x in range(ranges[0], ranges[1]):
for y in range(ranges[2], ranges[3]):
if k_4 * x + b_4 < y < k_1 * x + b_1 and
k_5 * x + b_5 > y > k_2 * x + b_2 and
k_6 * x + b_6 > y > k_3 * x + b_3:
count += 1
print(count)
