【问题标题】:What is a good way to measure shift in nested regular polygons?什么是测量嵌套正多边形偏移的好方法?
【发布时间】:2020-01-20 13:15:03
【问题描述】:

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

但看起来还是不那么整洁

【问题讨论】:

    标签: python math polygon


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多