Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # (c) Computational Alchemy
- # Works on Python 2.7
- power_x = 10
- power_y = 10
- steps = 2000
- filename = "trig-1"
- import math, cmath, numpy
- import colorsys
- from PIL import Image
- import os.path
- def BaseSelect(base, n):
- accumulator = 1
- bit = 0
- while n > 0:
- if (n & 1) == 1:
- accumulator = accumulator * base[bit]
- n = n >> 1
- bit = bit + 1
- return accumulator
- #make palette
- palette = [0] * 256
- for i in range(256):
- c = colorsys.hsv_to_rgb(math.pi*i/256, 1.0, 1.0)
- palette[i] = (int(c[0]*256), int(c[1]*256), int(c[2]*256))
- print "Calculate number sequencies..."
- W = 2**power_x
- H = 2**power_y
- base_x = [cmath.exp(2j*math.pi*2**(i+1)/2**power_x) for i in range(power_x)]
- base_y = [cmath.exp(2j*math.pi*2**(i+1)/2**power_y) for i in range(power_y)]
- print "base_x=", base_x
- print "base_y=", base_y
- n_x = [BaseSelect(base_x, i) for i in range(2**power_x)]
- n_y = [BaseSelect(base_y, i) for i in range(2**power_y)]
- print "Find boundaries..."
- max_int = 1.e+10
- min_int = -max_int
- real_min = max_int
- real_max = min_int
- imag_min = max_int
- imag_max = min_int
- mag_min = max_int
- mag_max = min_int
- arg_min = max_int
- arg_max = min_int
- for y in range(H):
- for x in range(W):
- n = (n_x[x] * n_y[y])
- real_min = min(real_min, n.real)
- real_max = max(real_max, n.real)
- imag_min = min(imag_min, n.imag)
- imag_max = max(imag_max, n.imag)
- r, phi = cmath.polar(n)
- mag_min = min(mag_min, r)
- mag_max = max(mag_max, r)
- arg_min = min(arg_min, phi)
- arg_max = max(arg_max, phi)
- print "Generating images..."
- templates = [
- (real_min, real_max, lambda n: n.real, "real"),
- #(imag_min, imag_max, lambda n: n.imag, "imag"),
- #(mag_min, mag_max, lambda n: cmath.polar(n)[0], "mag"),
- #(arg_min, arg_max, lambda n: cmath.polar(n)[1], "arg"),
- ]
- angle = cmath.exp(2j*math.pi/steps)
- for step in range(steps):
- print "*** Step", step
- n_x = [BaseSelect(base_x, i) for i in range(2**power_x)]
- n_y = [BaseSelect(base_y, i) for i in range(2**power_y)]
- for template in templates:
- min_n, max_n, num_part, name = template
- magnitude = max_n - min_n
- print "Generating image", name, "..."
- print "min_n=", min_n
- print "max_n=", max_n
- print "magnitude=", magnitude
- im = Image.new("RGB", (W, H), (0,0,0))
- pix = im.load()
- for y in range(H):
- for x in range(W):
- pix[x, y] = palette[int(255*(num_part(n_x[x] * n_y[y])-min_n)/(magnitude))]
- dstfilename, _ = os.path.splitext(filename)
- dstfilename = "%s-%s-%04d.png" % (dstfilename, name, step)
- print "Saving image to", dstfilename
- im.save(dstfilename, "PNG")
- base_x = [p*angle for p in base_x]
- base_y = [p*angle for p in base_y]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement