python - 什么是测量嵌套正多边形偏移的好方法?
问题描述
好吧,假设我们有一个任务是在 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 - 由降维的主成分定义的平面的 Python 方程
- javascript - 如果输入的用户不在自动完成列表中,则添加用户
- python - 按来源类型对 Google 新闻进行分类
- c# - 如何在浏览器中从 Xamarin UWP 项目打开 .pdf 文件?
- c# - 如何从 dafny 程序中获取 C# 程序?
- google-cloud-dataflow - 排空 DataFlow 作业并立即启动另一个作业,导致消息重复
- javascript - 有没有一个函数可以减去两个数字并除以
- perl - 为什么不“使用 utf-8;” 在 Perl 模块中使用时工作?
- android - 如何在 nodejs 服务器中的 socket.emit 中发送地图,我们如何在 android(Java) 中检索它?
- c# - Visual Studio 2019 到数据库的连接字符串