使用 turtle 模块通过特定规范在彼此内部绘制正多边形
Drawing regular polygons inside each other with specific specing using turtle module
我正在尝试创建一个函数,如附图所示,在彼此内部绘制正多边形。多边形边的大小由以下公式定义:
initial_size = initial_radius*(2*math.sin(360/(2*number_of_angles)))
我有两个问题: 1. 为什么当我通过上面的公式分配“initial_size”时,我的绘图从不同的方向开始,而不是当我简单地分配 initial_size = 100(忽略公式)?
import turtle
import math
turtle.speed(1)
def reg_polygon(number_of_angles, initial_radius):
Q = 180-(180/number_of_angles)/2
turtle.left(Q)
initial_size = initial_radius*(2*math.sin(360/(2*number_of_angles)))
if number_of_angles>=3:
sum_angle = 180*(number_of_angles-2)
angle = sum_angle/number_of_angles
for i in range(number_of_angles):
turtle.forward(initial_size)
turtle.left(180-angle)
elif number_of_angles<3:
print("Minimum number of angels should be >=3")
for i in range(3,6):
reg_polygon(i,100)
turtle.done()
这是以下代码片段绘制的内容;它不是您发布的 gif 的绝对完美再现(必须对 3、4 和 5 边形的大小进行一些调整,以避免较小的邻居在某些点接触 - i/e gif 制作者有点被骗了!),但它遵循数学对称性和完美性。
下面的代码有一些神奇的数字;我可能会稍后再谈,但不是现在。可以找到我用来计算正多边形的资源 here, and there.
import turtle
import math
def reg_polygon(start_pos, number_of_angles, side):
interior_angle = (180 * (number_of_angles - 2)) / number_of_angles
turtle.setheading(180 - interior_angle//2)
for i in range(number_of_angles):
turtle.forward(side)
turtle.left(180 - interior_angle)
def reset_start_point():
global start_pos, startx, starty, initial_size, number_of_angles, side
startx += 8
starty -= 0
initial_size += 8
number_of_angles += 1
side = 2 * initial_size * math.sin(math.radians(180/number_of_angles))
start_pos = startx, starty
turtle.penup()
turtle.goto((startx, starty))
turtle.pendown()
start_pos = startx, starty = 0, 0
number_of_angles = 2
initial_size = 15 # radius
side = 0
while number_of_angles < 21:
reset_start_point()
reg_polygon(start_pos, number_of_angles, side)
turtle.done()
我正在尝试创建一个函数,如附图所示,在彼此内部绘制正多边形。多边形边的大小由以下公式定义:
initial_size = initial_radius*(2*math.sin(360/(2*number_of_angles)))
我有两个问题: 1. 为什么当我通过上面的公式分配“initial_size”时,我的绘图从不同的方向开始,而不是当我简单地分配 initial_size = 100(忽略公式)?
import turtle
import math
turtle.speed(1)
def reg_polygon(number_of_angles, initial_radius):
Q = 180-(180/number_of_angles)/2
turtle.left(Q)
initial_size = initial_radius*(2*math.sin(360/(2*number_of_angles)))
if number_of_angles>=3:
sum_angle = 180*(number_of_angles-2)
angle = sum_angle/number_of_angles
for i in range(number_of_angles):
turtle.forward(initial_size)
turtle.left(180-angle)
elif number_of_angles<3:
print("Minimum number of angels should be >=3")
for i in range(3,6):
reg_polygon(i,100)
turtle.done()
这是以下代码片段绘制的内容;它不是您发布的 gif 的绝对完美再现(必须对 3、4 和 5 边形的大小进行一些调整,以避免较小的邻居在某些点接触 - i/e gif 制作者有点被骗了!),但它遵循数学对称性和完美性。
下面的代码有一些神奇的数字;我可能会稍后再谈,但不是现在。可以找到我用来计算正多边形的资源 here, and there.
import turtle
import math
def reg_polygon(start_pos, number_of_angles, side):
interior_angle = (180 * (number_of_angles - 2)) / number_of_angles
turtle.setheading(180 - interior_angle//2)
for i in range(number_of_angles):
turtle.forward(side)
turtle.left(180 - interior_angle)
def reset_start_point():
global start_pos, startx, starty, initial_size, number_of_angles, side
startx += 8
starty -= 0
initial_size += 8
number_of_angles += 1
side = 2 * initial_size * math.sin(math.radians(180/number_of_angles))
start_pos = startx, starty
turtle.penup()
turtle.goto((startx, starty))
turtle.pendown()
start_pos = startx, starty = 0, 0
number_of_angles = 2
initial_size = 15 # radius
side = 0
while number_of_angles < 21:
reset_start_point()
reg_polygon(start_pos, number_of_angles, side)
turtle.done()