import tkinter as tk
from tkinter import ttk
import math

class MandelbrotWindow:
    def __init__(self, root):
        self.root = root
        self.root.title("超复杂图形 - 曼德博集合")
        self.width = 700
        self.height = 600
        # 参数
        self.xmin = -2.25
        self.xmax = 0.75
        self.ymin = -1.25
        self.ymax = 1.25
        self.max_iter = 120

        # 顶部控制面板
        control_frame = ttk.Frame(root, padding=5)
        control_frame.pack(fill=tk.X)

        ttk.Label(control_frame, text="最大迭代次数:").pack(side=tk.LEFT)
        self.iter_var = tk.IntVar(value=self.max_iter)
        spin = ttk.Spinbox(control_frame, from_=20, to=500, textvariable=self.iter_var, width=6)
        spin.pack(side=tk.LEFT, padx=5)

        render_btn = ttk.Button(control_frame, text="渲染复杂图形", command=self.draw_mandelbrot)
        render_btn.pack(side=tk.LEFT, padx=10)

        # 画布
        self.canvas = tk.Canvas(root, width=self.width, height=self.height, bg="black")
        self.canvas.pack()

    def get_color(self, iteration, max_iter):
        if iteration == max_iter:
            return "#000000"
        # 绚丽渐变色
        r = int(128 + 127 * math.sin(0.05 * iteration))
        g = int(128 + 127 * math.sin(0.08 * iteration + 2))
        b = int(128 + 127 * math.sin(0.11 * iteration + 4))
        return f"#{r:02x}{g:02x}{b:02x}"

    def mandelbrot_calc(self, cx, cy, max_iter):
        x, y = 0.0, 0.0
        for i in range(max_iter):
            x2 = x*x - y*y + cx
            y2 = 2*x*y + cy
            x, y = x2, y2
            if x*x + y*y > 4:
                return i
        return max_iter

    def draw_mandelbrot(self):
        self.canvas.delete("all")
        max_iter = self.iter_var.get()
        # 逐像素绘制
        for px in range(self.width):
            cx = self.xmin + (self.xmax - self.xmin) * px / self.width
            for py in range(self.height):
                cy = self.ymin + (self.ymax - self.ymin) * py / self.height
                iters = self.mandelbrot_calc(cx, cy, max_iter)
                color = self.get_color(iters, max_iter)
                self.canvas.create_line(px, py, px+1, py, fill=color)
            self.root.update() #实时刷新画面

if __name__ == "__main__":
    win = tk.Tk()
    app = MandelbrotWindow(win)
    win.mainloop()
