Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_FFT_Fractal.py
- import tkinter as tk
- from PIL import Image, ImageTk
- import math
- W = 600
- H = 600
- root = tk.Tk()
- root.title("# tk_FFT_Fractal.py")
- root.geometry("+0+0")
- canvas = tk.Label(root)
- canvas.grid(row=0, column=0, columnspan=3)
- gradient = Image.new('RGB', (3, 3))
- pixels = gradient.load()
- grid_colors = {
- (0, 0): (255, 255, 255), # White
- (0, 1): (255, 255, 0), # Yellow
- (0, 2): (0, 255, 0), # Green
- (1, 0): (255, 165, 0), # Orange
- (1, 1): (128, 128, 128), # Gray
- (1, 2): (0, 0, 255), # Blue
- (2, 0): (255, 0, 0), # Red
- (2, 1): (128, 0, 128), # Purple
- (2, 2): (0, 0, 0) # Black
- }
- for x in range(3):
- for y in range(3):
- pixels[x, y] = grid_colors[(x, y)]
- gradient = gradient.resize((W, H))
- color_cache = {}
- for x in range(W*2):
- dx = x
- for y in range(H*2):
- dy = y
- if x >= W:
- x = 2*W - 1 - x
- if y >= H:
- y = 2*H - 1 - y
- color_cache[(dx, dy)] = gradient.getpixel((x, y))
- scale = 0.0025
- freqs = [3.0, math.pi, math.pi/3]
- amplitudes = [1.1, 1.2, 1.3]
- dbl = W*2
- def fft_fractal_iter(cx, cy):
- x = cx
- y = cy
- for i in range(len(amplitudes)):
- x_new = x*x - y*y + cx * 0.5
- y_new = 2*x*y + cy * 0.5
- x_new += math.sin(x * freqs[i % len(freqs)]) * amplitudes[i % len(amplitudes)]
- y_new += math.cos(y * freqs[i % len(freqs)]) * amplitudes[i % len(amplitudes)]
- x = x_new
- y = y_new
- color_x = int(abs(x * W))
- color_y = int(abs(y * W))
- return color_cache[(color_x % dbl, color_y % dbl)]
- img = Image.new("RGB", (W, H))
- def draw_frame():
- p = img.load()
- zoom = scale
- for py in range(H):
- for px in range(W):
- cx = (px - W/2) * zoom
- cy = (py - H/2) * zoom
- color = fft_fractal_iter(cx, cy)
- p[px, py] = color
- tkimg = ImageTk.PhotoImage(img)
- canvas.configure(image=tkimg)
- canvas.img = tkimg
- draw_frame()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment