import tkinter as tk
from tkinter import ttk
import math
import colorsys

class ComplexArtCanvas:
    def __init__(self, root):
        self.root = root
        self.root.title("Python超高复杂度复合图形生成器")
        self.root.geometry("1100x750")

        # ==========先初始化变量！修复报错==========
        self.mouse_x = 500
        self.mouse_y = 370
        self.anim_running = True

        # 主布局
        self.main_frame = ttk.Frame(root)
        self.main_frame.pack(fill=tk.BOTH, expand=True, padx=8, pady=8)

        # 画布区域
        self.canvas = tk.Canvas(self.main_frame, bg="#000010")
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # 控制面板
        self.ctrl_panel = ttk.Frame(self.main_frame, width=220)
        self.ctrl_panel.pack(side=tk.RIGHT, fill=tk.Y, padx=(8, 0))

        # 参数变量
        self.angle_var = tk.DoubleVar(value=0.0)
        self.iter_var = tk.IntVar(value=120)
        self.scale_var = tk.DoubleVar(value=1.0)
        self.mode_var = tk.StringVar(value="复合分形")

        self.build_controls()

        # 鼠标交互
        self.canvas.bind("<Button-1>", self.on_click)
        
        # 延后启动动画，避免初始化冲突
        self.root.after(100, self.draw_loop)

    def build_controls(self):
        ttk.Label(self.ctrl_panel, text="图形参数", font=("微软雅黑",12,"bold")).pack(pady=6)

        ttk.Label(self.ctrl_panel, text="迭代层数").pack()
        ttk.Scale(self.ctrl_panel, from_=20, to=200, variable=self.iter_var, orient=tk.HORIZONTAL).pack(fill=tk.X, padx=5)

        ttk.Label(self.ctrl_panel, text="缩放系数").pack()
        ttk.Scale(self.ctrl_panel, from_=0.3, to=2.0, variable=self.scale_var, orient=tk.HORIZONTAL).pack(fill=tk.X, padx=5)

        ttk.Label(self.ctrl_panel, text="渲染模式").pack(pady=(8,0))
        modes = ["复合分形", "螺旋混沌", "曼德博局部", "科赫雪花群"]
        for m in modes:
            ttk.Radiobutton(self.ctrl_panel, text=m, variable=self.mode_var, value=m, command=self.redraw).pack(anchor="w")

        ttk.Button(self.ctrl_panel, text="清空画布", command=self.clear_canvas).pack(pady=10, fill=tk.X)
        ttk.Label(self.ctrl_panel, text="左键点击画布\n改变图形引力中心", foreground="#444").pack(pady=10)

    def clear_canvas(self):
        self.canvas.delete("all")

    def on_click(self, event):
        self.mouse_x = event.x
        self.mouse_y = event.y

    def get_color(self, phase, depth):
        """生成平滑彩虹渐变色"""
        h = (phase * 0.008 + depth * 0.025) % 1.0
        r, g, b = colorsys.hsv_to_rgb(h, 0.85, 0.95)
        return f'#{int(r*255):02x}{int(g*255):02x}{int(b*255):02x}'

    def draw_fractal_tree(self, x, y, length, angle, depth, max_depth):
        """分形树（基础递归图形单元）"""
        if depth > max_depth or length < 2:
            return
        rad = math.radians(angle)
        nx = x + length * math.cos(rad)
        ny = y + length * math.sin(rad)
        color = self.get_color(self.angle_var.get(), depth)
        self.canvas.create_line(x, y, nx, ny, fill=color, width=max(1, int(6-depth*0.4)))

        # 左右分支 + 随机偏移，增强复杂度
        offset = math.sin(self.angle_var.get()*0.015 + depth)*12
        self.draw_fractal_tree(nx, ny, length*0.72, angle+22+offset, depth+1, max_depth)
        self.draw_fractal_tree(nx, ny, length*0.72, angle-22-offset, depth+1, max_depth)
        if depth > 3:
            self.draw_fractal_tree(nx, ny, length*0.45, angle, depth+1, max_depth)

    def draw_spiral_chaos(self, cx, cy):
        """多重嵌套阿基米德螺旋"""
        angle = self.angle_var.get()
        scale = self.scale_var.get()
        iterations = self.iter_var.get()
        points = []
        for i in range(iterations):
            t = i * 0.06 + angle * 0.006
            r = t * scale * 2.2
            x = cx + r * math.cos(t + math.sin(t*0.35))
            y = cy + r * math.sin(t - math.cos(t*0.28))
            points.append((x,y))
            if len(points)>=2:
                c = self.get_color(i, i//12)
                self.canvas.create_line(points[-2][0], points[-2][1], x, y, fill=c, width=1)

    def draw_koch(self, x1,y1,x2,y2, depth, max_d):
        """科赫雪花曲线"""
        if depth >= max_d:
            c = self.get_color(self.angle_var.get(), depth)
            self.canvas.create_line(x1,y1,x2,y2, fill=c, width=1)
            return
        dx = x2 - x1
        dy = y2 - y1
        seg_x = dx / 3
        seg_y = dy / 3
        p1x = x1 + seg_x
        p1y = y1 + seg_y
        p3x = x1 + 2*seg_x
        p3y = y1 + 2*seg_y
        # 60度旋转点
        ang = math.radians(-60 + self.angle_var.get()*0.2)
        p2x = p1x + seg_x*math.cos(ang) - seg_y*math.sin(ang)
        p2y = p1y + seg_x*math.sin(ang) + seg_y*math.cos(ang)

        self.draw_koch(x1,y1,p1x,p1y, depth+1, max_d)
        self.draw_koch(p1x,p1y,p2x,p2y, depth+1, max_d)
        self.draw_koch(p2x,p2y,p3x,p3y, depth+1, max_d)
        self.draw_koch(p3x,p3y,x2,y2, depth+1, max_d)

    def draw_mandelbrot_preview(self, ox, oy, size):
        """简易曼德博集合采样图案"""
        scale = self.scale_var.get()
        step = 6
        for px in range(-size, size, step):
            for py in range(-size, size, step):
                a = px / (size * scale) - 0.6
                b = py / (size * scale)
                ca, cb = a, b
                i = 0
                while i < 60 and a*a + b*b < 4:
                    na = a*a - b*b + ca
                    nb = 2*a*b + cb
                    a,b = na,nb
                    i +=1
                if i>12:
                    c = self.get_color(i, self.angle_var.get())
                    self.canvas.create_rectangle(ox+px, oy+py, ox+px+step, oy+py+step, fill=c, outline="")

    def render_all_graphics(self):
        self.clear_canvas()
        mode = self.mode_var.get()
        cx = self.mouse_x
        cy = self.mouse_y
        iter_max = self.iter_var.get()
        scale = self.scale_var.get()

        if mode == "复合分形":
            # 中心主分形树 + 四周环绕多棵旋转分形树
            self.draw_fractal_tree(cx, cy+130, 75*scale, -90, 0, iter_max//12)
            for d in range(6):
                ang = d * 60 + self.angle_var.get()*0.4
                r = 180 * scale
                sx = cx + r*math.cos(math.radians(ang))
                sy = cy + r*math.sin(math.radians(ang))
                self.draw_fractal_tree(sx, sy, 42*scale, ang, 0, iter_max//16)
            # 叠加外圈螺旋
            self.draw_spiral_chaos(cx, cy)

        elif mode == "螺旋混沌":
            self.draw_spiral_chaos(cx, cy)
            self.draw_spiral_chaos(cx+160, cy-120)
            self.draw_spiral_chaos(cx-160, cy+120)

        elif mode == "科赫雪花群":
            sz = 160*scale
            angle = self.angle_var.get()
            pts = []
            for i in range(3):
                a = math.radians(angle + i*120)
                pts.append((cx + sz*math.cos(a), cy + sz*math.sin(a)))
            self.draw_koch(pts[0][0],pts[0][1],pts[1][0],pts[1][1],0,iter_max//20)
            self.draw_koch(pts[1][0],pts[1][1],pts[2][0],pts[2][1],0,iter_max//20)
            self.draw_koch(pts[2][0],pts[2][1],pts[0][0],pts[0][1],0,iter_max//20)

        elif mode == "曼德博局部":
            self.draw_mandelbrot_preview(cx, cy, int(220*scale))

    def draw_loop(self):
        # 动态旋转更新
        self.angle_var.set(self.angle_var.get() + 1.2)
        self.render_all_graphics()
        self.root.after(40, self.draw_loop)

    def redraw(self):
        self.render_all_graphics()

if __name__ == "__main__":
    window = tk.Tk()
    app = ComplexArtCanvas(window)
    window.mainloop()