import turtle
import random

# 窗口设置
screen = turtle.Screen()
screen.setup(width=1200, height=1000)
screen.title("最复杂的图形")
screen.tracer(0)
pen = turtle.Turtle()
pen.speed(0)
pen.hideturtle()

colors = ["#ff3333","#ff9933","#ffff33","#33ff33","#33ffff","#3333ff","#9933ff","#ff3399"]

# 1.递归分形树（修复）
def draw_tree(x, y, length, angle, depth):
    pen.penup()
    pen.goto(x, y)
    pen.setheading(angle)
    pen.pendown()
    if depth <= 0 or length < 3:
        pen.dot(random.randint(3,8), random.choice(colors))
        return
    pen.pencolor(random.choice(colors))
    pen.forward(length)
    cx, cy = pen.xcor(), pen.ycor()
    draw_tree(cx, cy, length*0.72, angle+22, depth-1)
    draw_tree(cx, cy, length*0.72, angle-22, depth-1)

# 2.谢尔宾斯基三角形，降低递归深度防止卡死
def sierpinski(ax, ay, bx, by, cx, cy, depth):
    if depth == 0:
        pen.penup()
        pen.goto(ax,ay)
        pen.pendown()
        pen.pencolor(random.choice(colors))
        pen.begin_fill()
        pen.goto(bx,by)
        pen.goto(cx,cy)
        pen.goto(ax,ay)
        pen.end_fill()
        return
    abx, aby = (ax+bx)/2, (ay+by)/2
    bcx, bcy = (bx+cx)/2, (by+cy)/2
    acx, acy = (ax+cx)/2, (ay+cy)/2
    sierpinski(ax,ay,abx,aby,acx,acy,depth-1)
    sierpinski(abx,aby,bx,by,bcx,bcy,depth-1)
    sierpinski(acx,acy,bcx,bcy,cx,cy,depth-1)

#3.阿基米德螺旋
def spiral(start_x,start_y,max_r):
    pen.penup()
    pen.goto(start_x,start_y)
    pen.pendown()
    for i in range(720):
        pen.pencolor(colors[i%len(colors)])
        step = i * 0.12
        pen.setheading(i)
        pen.forward(step)
        if pen.distance(start_x,start_y) > max_r:
            break

#4.多层曼陀罗花瓣
def mandala(x,y,size,layers):
    for lay in range(layers):
        s = size - lay*12
        pen.penup()
        pen.goto(x,y)
        for angle in range(0,360,15):
            pen.pencolor(random.choice(colors))
            pen.setheading(angle)
            pen.pendown()
            pen.circle(s,60)
            pen.left(120)
            pen.circle(s,60)
            pen.left(120)
    screen.update()

#5.嵌套多边形镂空花纹，降低递归深度
def nested_poly(x,y,side,size,deep):
    if deep <=0:
        return
    pen.penup()
    pen.goto(x,y)
    pen.pendown()
    pen.pencolor(random.choice(colors))
    for _ in range(side):
        pen.forward(size)
        pen.left(360/side)
    for a in range(0,360,45):
        pen.penup()
        pen.goto(x,y)
        pen.setheading(a)
        pen.forward(size*0.35)
        nested_poly(pen.xcor(),pen.ycor(),side,size*0.45,deep-1)


# 绘图顺序，调低所有递归深度，防止栈溢出卡死
mandala(0, 0, 130, 5)

pos_list = [(180,0),(-180,0),(0,180),(0,-180),
            (130,130),(-130,130),(130,-130),(-130,-130)]
for px,py in pos_list:
    spiral(px,py,110)

# 递归深度改成4，不会栈溢出
sierpinski(-550,-400,-350,-50,-150,-400,4)
sierpinski(150,-400,350,-50,550,-400,4)
sierpinski(-550,400,-350,50,-150,400,4)
sierpinski(150,400,350,50,550,400,4)

tree_pos = [(-420,-200),(420,-200),(-420,200),(420,200)]
for tx,ty in tree_pos:
    draw_tree(tx, ty, 75, 90, 6)

for ang in range(0,360,30):
    pen.penup()
    pen.goto(0,0)
    pen.setheading(ang)
    pen.forward(260)
    nested_poly(pen.xcor(),pen.ycor(),6,45,3)

screen.update()
turtle.done()