用递归和Turtle库绘制八进制的雪花。以下是递归深度从1~5的八面形雪花:
除了通过递归深度停止递归,还可以在半径小于特定大小时停止递归。以下八面形雪花是通过将半径递归的阈值设置为10生成的。现在你可以看到所有的八边形都有相同的尺寸
源代码
import turtle
from turtle import *
import math
import random
# 以指定的中心,画八面形
def octagon(x, y, r): # x,y is the center
up()
goto(x, y)
seth(90)
fd(r)
left(180 - 135 / 2)
down()
begin_fill()
edgeSize = 2 * r * math.sin(math.radians(45 / 2))
for _ in range(8):
fd(edgeSize)
left(45)
end_fill()
# 画八面形雪花
def octaflake(x, y, r, n):
# 根据递归深度(recursion depths)控制何时退出递归
# if n ==1:
# octagon(x, y, r)
# return
# 根据八面形的半径控制,当半径小于10时,退出递归
if r < 10:
octagon(x, y, r)
return
r2 = r / (1 1 / math.tan(math.radians(45 / 2)))
octaflake(x, y, r - 2 * r2, n - 1)
direction = 90
for _ in range(8):
up()
goto(x, y)
seth(direction)
fd(r - r2)
octaflake(xcor(), ycor(), r2, n - 1)
direction = 45
def main():
screen = Screen()
screen.setup(800, 600)
screen.title('cloudcloder出品--画雪花')
bgcolor('royal blue')
fillcolor('white')
pencolor('steel blue')
speed(0)
screen.tracer(0, 0)
octaflake(-200, -200, 70, 1)
octaflake(-50, -50, 80, 2)
octaflake(-190, 100, 50, 3)
octaflake(200, 100, 80, 4)
octaflake(-190, 200, 50, 3)
octaflake(-190, 0, 50, 3)
octaflake(180, -140, 120, 5)
screen.update()
done()
if __name__ == "__main__":
hideturtle()
up()
goto(-260, 270)
write("今日头条-cloudcoder出品", align='left', font=('fangsong', 14, 'normal'))
showturtle()
main()