Как правильно измерить сдвиг во вложенных правильных многоугольниках? - PullRequest
0 голосов
/ 20 января 2020

Хорошо, допустим, у нас есть задача нарисовать вложенные правильные многоугольники с использованием модуля черепахи в 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]))

Вот вывод:

output

И вот как это должно выглядеть:

the thing

Я немного изменил код, вторая его часть ( 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]))

Но все же это не выглядит так аккуратно

1 Ответ

0 голосов
/ 24 января 2020

Мне кажется, что мы можем приблизиться к вашему идеальному решению, чем к вашему оригинальному решению, используя намного меньше кода:

import turtle

radius = 50

for sides in range(3, 16):
    turtle.penup()
    turtle.sety(turtle.ycor() - 25)
    turtle.pendown()

    turtle.circle(radius, steps=sides)

    radius += 25

turtle.hideturtle()
turtle.exitonclick()

Возможно, ваше окончательное решение проще, чем вы пытаетесь его сделать.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...