Хорошо, допустим, у нас есть задача нарисовать вложенные правильные многоугольники с использованием модуля черепахи в python. Я как-то придумал алгоритм для этого, используя функции (fun c., Что dr aws многоугольник, учитывая его размер и количество вершин, fun c., Который преобразует окружность предыдущего многоугольника в апофе следующий и т. д. c.) и петли. У меня есть следующие проблемы:
- Я не смог придумать подходящую меру для сдвига, который черепаха совершает, перемещаясь из вершины предыдущего многоугольника в вершину следующего. Как видно из рисунка ниже, между вложенными полигонами недостаточно места. То, что я сделал, просто поместил размер смены как разницу между окружающими (как показано в коде ниже)
- Точки, где черепаха заканчивает формы каждого следующего многоугольника, начиная с шестиугольника, начинают сдвигаться вниз
Что вы можете посоветовать мне, чтобы улучшить мой код?
Вот код, который я написал:
import turtle
import math
turtle.shape('turtle')
def prmn(num, size, draw):
if draw == True:
angle = 180-(360//num)
turtle.left(180-angle//2)
for i in range(1, num+1):
turtle.forward(size)
if i != num:
turtle.left(180-angle)
else:
turtle.right(angle//2)
if draw == False:
inner_angle = 360//num
inner_radius = (size*math.cos((math.pi/num)))/(2*math.sin(math.pi/num))
outer_radius = size/(2*math.sin((math.pi/num)))
chars = [inner_angle, inner_radius, outer_radius]
return chars
def rad_conv(num, outer_radiu_prev):
inner_angle = 360//num
outer_radiu = outer_radiu_prev/math.cos(math.pi/num)
return outer_radiu
def new_size(num, outer_radiu):
new_size = 2*outer_radiu*math.sin(math.pi/num)
return new_size
def rad_fw(outer_radiu_new, outer_radiu_prev):
turtle.penup()
turtle.forward(outer_radiu_new-outer_radiu_prev)
turtle.pendown()
ns = 40
for i in range(3, 16):
prmn(i, ns, True)
rad_fw(rad_conv((i+1), prmn(i, ns, False)[2]), prmn(i, ns, False)[2])
ns = new_size((i+1), rad_conv((i+1), prmn(i, ns, False)[2]))
Вот вывод:
И вот как это должно выглядеть:
Я немного изменил код, вторая его часть ( funcs. rad_fw , rad_conv , new_size ), вот оно:
def rad_conv(num, outer_radiu_prev):
inner_angle = 360//num
outer_radiu = outer_radiu_prev + 20
return outer_radiu
def new_size(num, outer_radiu):
new_size = 2*outer_radiu*math.sin(math.pi/num)
return new_size
def rad_fw():
turtle.penup()
turtle.forward(20)
turtle.pendown()
ns = 60
for i in range(3, 12):
prmn(i, ns, True)
rad_fw()
ns = new_size((i+1), rad_conv((i+1), prmn(i, ns, False)[2]))
Но все же это не выглядит так аккуратно