import turtle
import colorsys
import random
import math

# 设置窗口
screen = turtle.Screen()
screen.setup(width=1000, height=800, startx=None, starty=None)
screen.bgcolor("#0a0a1a")
screen.title("复杂图形生成器 - 彩色旋转分形")
screen.tracer(0, 0)  # 关闭自动刷新，提高绘制速度

# 创建海龟对象
t = turtle.Turtle()
t.speed(0)
t.hideturtle()

# 全局变量
current_pattern = 0
patterns = []  # 存储已绘制的图形
color_offset = 0

# 初始化颜色列表
def generate_colors(num_colors, offset=0):
    colors = []
    for i in range(num_colors):
        hue = (i / num_colors + offset) % 1.0
        saturation = 0.7 + random.random() * 0.3
        value = 0.8 + random.random() * 0.2
        rgb = colorsys.hsv_to_rgb(hue, saturation, value)
        color = "#{:02x}{:02x}{:02x}".format(
            int(rgb[0]*255), 
            int(rgb[1]*255), 
            int(rgb[2]*255)
        )
        colors.append(color)
    return colors

# 复杂图形1: 彩色旋转分形
def draw_fractal_spiral():
    t.clear()
    t.penup()
    
    colors = generate_colors(20, color_offset)
    
    for i in range(200):
        t.pensize(2 + i/40)
        t.color(colors[i % len(colors)])
        
        # 计算位置
        angle = i * 5
        radius = i * 2
        x = radius * math.cos(math.radians(angle))
        y = radius * math.sin(math.radians(angle))
        
        t.goto(x, y)
        t.pendown()
        
        # 绘制小分支
        for j in range(6):
            branch_angle = angle + j * 60
            branch_radius = 20 + i/5
            bx = x + branch_radius * math.cos(math.radians(branch_angle))
            by = y + branch_radius * math.sin(math.radians(branch_angle))
            t.goto(bx, by)
            t.goto(x, y)
        
        t.penup()
    
    screen.update()

# 复杂图形2: 几何花朵
def draw_geometric_flower():
    t.clear()
    t.penup()
    
    colors = generate_colors(12, color_offset + 0.3)
    
    for petal in range(12):
        t.color(colors[petal % len(colors)])
        t.pensize(3)
        
        # 移动到花瓣起始位置
        t.goto(0, 0)
        t.setheading(petal * 30)
        t.pendown()
        
        # 绘制花瓣
        for i in range(60):
            t.forward(5 + i/2)
            t.left(5)
            t.forward(2)
            t.right(3)
        
        t.penup()
    
    # 绘制花心
    t.goto(0, 0)
    t.pendown()
    t.color("#ffd700")
    t.begin_fill()
    for _ in range(36):
        t.forward(15)
        t.left(10)
    t.end_fill()
    t.penup()
    
    screen.update()

# 复杂图形3: 曼德勃罗式分形
def draw_mandelbrot_style():
    t.clear()
    t.penup()
    
    colors = generate_colors(15, color_offset + 0.6)
    
    for layer in range(10, 0, -1):
        t.color(colors[layer % len(colors)])
        t.pensize(1 + layer/2)
        
        for i in range(360):
            t.penup()
            radius = layer * 20
            angle = math.radians(i * 2)
            
            # 计算分形扰动
            fractal_factor = 0.5 + 0.5 * math.sin(angle * 8 + layer)
            x = radius * fractal_factor * math.cos(angle)
            y = radius * fractal_factor * math.sin(angle)
            
            t.goto(x, y)
            t.pendown()
            
            # 绘制小细节
            if i % 5 == 0:
                for j in range(3):
                    detail_angle = angle + j * math.pi/3
                    detail_radius = 5 + layer
                    dx = x + detail_radius * math.cos(detail_angle)
                    dy = y + detail_radius * math.sin(detail_angle)
                    t.goto(dx, dy)
                    t.goto(x, y)
    
    screen.update()

# 复杂图形4: 旋转立方体网络
def draw_rotating_cubes():
    t.clear()
    t.penup()
    
    colors = generate_colors(8, color_offset + 0.9)
    
    for cube in range(5):
        t.color(colors[cube % len(colors)])
        t.pensize(2)
        
        # 立方体位置
        cube_x = (cube - 2) * 100
        cube_y = 0
        
        # 绘制立方体
        for i in range(4):
            t.penup()
            t.goto(cube_x, cube_y)
            t.setheading(90 * i)
            
            # 绘制立方体边缘
            for j in range(4):
                t.pendown()
                length = 40 + cube * 5
                
                # 绘制边缘线
                t.forward(length)
                t.left(90)
                
                # 绘制对角线
                if j % 2 == 0:
                    t.left(45)
                    t.forward(length * 0.7)
                    t.backward(length * 0.7)
                    t.right(45)
        
        # 绘制连接线
        if cube > 0:
            t.penup()
            t.goto(cube_x - 40, cube_y)
            t.pendown()
            t.color("#ffffff")
            t.pensize(1)
            t.goto(cube_x - 100, cube_y)
    
    screen.update()

# 切换图形
def change_pattern(direction=1):
    global current_pattern, color_offset
    current_pattern = (current_pattern + direction) % 4
    color_offset = (color_offset + 0.1) % 1.0
    draw_pattern()

# 重新绘制当前图形
def redraw_pattern():
    global color_offset
    color_offset = (color_offset + 0.05) % 1.0
    draw_pattern()

# 绘制当前选择的图形
def draw_pattern():
    patterns = [
        draw_fractal_spiral,
        draw_geometric_flower,
        draw_mandelbrot_style,
        draw_rotating_cubes
    ]
    patterns[current_pattern]()

# 添加文字说明
def add_labels():
    label_turtle = turtle.Turtle()
    label_turtle.speed(0)
    label_turtle.color("white")
    label_turtle.penup()
    label_turtle.hideturtle()
    
    # 标题
    label_turtle.goto(0, 350)
    label_turtle.write("复杂图形生成器", align="center", font=("Arial", 24, "bold"))
    
    # 操作说明
    label_turtle.goto(0, -360)
    label_turtle.write("操作说明:", align="center", font=("Arial", 16, "bold"))
    
    label_turtle.goto(0, -390)
    label_turtle.write("左键点击: 切换图形 | 右键点击: 重新生成颜色 | 空格键: 随机颜色", 
                      align="center", font=("Arial", 12, "normal"))
    
    # 图案名称
    pattern_names = [
        "彩色旋转分形",
        "几何花朵",
        "曼德勃罗式分形", 
        "旋转立方体网络"
    ]
    
    label_turtle.goto(0, 310)
    label_turtle.write(f"当前图案: {pattern_names[current_pattern]}", 
                      align="center", font=("Arial", 16, "bold"))
    
    return label_turtle

# 随机颜色
def randomize_colors():
    global color_offset
    color_offset = random.random()
    draw_pattern()

# 设置键盘和鼠标事件
def setup_controls():
    screen.onkey(lambda: change_pattern(1), "Right")
    screen.onkey(lambda: change_pattern(-1), "Left")
    screen.onkey(randomize_colors, "space")
    screen.onclick(lambda x, y: change_pattern(1), 1)  # 左键
    screen.onclick(lambda x, y: redraw_pattern(), 3)   # 右键
    
    screen.listen()

# 主函数
def main():
    # 绘制初始图形
    draw_fractal_spiral()
    
    # 添加标签
    add_labels()
    
    # 设置控制
    setup_controls()
    
    # 保持窗口打开
    turtle.done()

if __name__ == "__main__":
    main()