什么是测量嵌套正多边形偏移的好方法?

What is a good way to measure shift in nested regular polygons?

好吧,假设我们有一个任务是使用 python 中的 turtle 模块绘制嵌套的正多边形。我以某种方式想出了一种算法来使用函数(func。根据其大小和顶点数绘制多边形,func。将前一个多边形的外接半径转换为下一个多边形的外接半径等)并循环.我遇到的问题是:

你能建议我应该做些什么来改进我的代码?

这是我写的代码:

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]))

但看起来还是不那么整洁

在我看来,使用更少的代码,我们可以比您的原始解决方案更接近您的理想解决方案:

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()

也许您的最终解决方案比您尝试实现的要简单。