什么是测量嵌套正多边形偏移的好方法?
What is a good way to measure shift in nested regular polygons?
好吧,假设我们有一个任务是使用 python 中的 turtle 模块绘制嵌套的正多边形。我以某种方式想出了一种算法来使用函数(func。根据其大小和顶点数绘制多边形,func。将前一个多边形的外接半径转换为下一个多边形的外接半径等)并循环.我遇到的问题是:
- 对于乌龟从前一个多边形的顶点移动到下一个多边形的顶点的移动,我还没有想出一个好的度量。从下图中可以看出,嵌套多边形之间的 space 不够多。我所做的只是简单地将移位的大小作为圆周半径之间的差异(如下面的代码所示)
- 海龟完成每个下一个多边形形状的点,从六边形开始,开始向下移动
你能建议我应该做些什么来改进我的代码?
这是我写的代码:
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()
也许您的最终解决方案比您尝试实现的要简单。
好吧,假设我们有一个任务是使用 python 中的 turtle 模块绘制嵌套的正多边形。我以某种方式想出了一种算法来使用函数(func。根据其大小和顶点数绘制多边形,func。将前一个多边形的外接半径转换为下一个多边形的外接半径等)并循环.我遇到的问题是:
- 对于乌龟从前一个多边形的顶点移动到下一个多边形的顶点的移动,我还没有想出一个好的度量。从下图中可以看出,嵌套多边形之间的 space 不够多。我所做的只是简单地将移位的大小作为圆周半径之间的差异(如下面的代码所示)
- 海龟完成每个下一个多边形形状的点,从六边形开始,开始向下移动
你能建议我应该做些什么来改进我的代码?
这是我写的代码:
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()
也许您的最终解决方案比您尝试实现的要简单。