首页 > 解决方案 > 什么是测量嵌套正多边形偏移的好方法?

问题描述

好吧,假设我们有一个任务是在 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_fwrad_convnew_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]))

但它仍然看起来不那么整洁

标签: pythonmathpolygon

解决方案


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

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

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

在此处输入图像描述


推荐阅读