52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
import matplotlib.pyplot as plt
|
|
import matplotlib.patches as patches
|
|
|
|
def draw_trapezoid(a, b, h):
|
|
fig, ax = plt.subplots()
|
|
|
|
# Рисуем трапецию
|
|
trapezoid = patches.Polygon([(0, 0), (a, 0), (b, h), (0, h)], closed=True, fill=None, edgecolor='r')
|
|
ax.add_patch(trapezoid)
|
|
|
|
# Разбиваем трапецию на квадраты
|
|
split_trapezoid(a, b, h, ax)
|
|
|
|
# Устанавливаем пределы осей
|
|
ax.set_xlim(-1, max(a, b) + 1)
|
|
ax.set_ylim(-1, h + 1)
|
|
ax.set_aspect('equal')
|
|
|
|
plt.show()
|
|
|
|
def split_trapezoid(a, b, h, ax):
|
|
if a == 0 or b == 0 or h == 0:
|
|
return
|
|
|
|
# Найдите самый большой квадрат, который можно вписать в трапецию
|
|
largest_square_side = h
|
|
|
|
# Поместите квадрат в трапецию
|
|
place_square(largest_square_side, 0, 0, ax)
|
|
|
|
# Разделите оставшуюся часть трапеции
|
|
remaining_a = a - largest_square_side
|
|
remaining_b = b - largest_square_side
|
|
|
|
# Повторите процесс для новых трапеций
|
|
if remaining_a > 0:
|
|
split_trapezoid(remaining_a, b, h, ax)
|
|
if remaining_b > 0:
|
|
split_trapezoid(a, remaining_b, h, ax)
|
|
|
|
def place_square(side, x, y, ax):
|
|
# Функция для помещения квадрата в трапецию
|
|
square = patches.Rectangle((x, y), side, side, linewidth=1, edgecolor='b', facecolor='none')
|
|
ax.add_patch(square)
|
|
|
|
# Пример использования
|
|
a = 10 # Длина верхнего основания трапеции
|
|
b = 20 # Длина нижнего основания трапеции
|
|
h = 5 # Высота трапеции
|
|
|
|
draw_trapezoid(a, b, h)
|