Draws a random 2D slice from 4D Mandelbrot fractal.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | # Random 2D Slice Of 4D Mandelbrot Fractal
# FB - 20120707
import math
import random
from PIL import Image
imgx = 512
imgy = 512
image = Image.new("RGB", (imgx, imgy))
pixels = image.load()
# drawing area (xa < xb & ya < yb)
xa = -2.0
xb = 2.0
ya = -2.0
yb = 2.0
maxIt = 256 # max number of iterations allowed
# random rotation angles to convert 2d plane to 4d plane
xy = random.random() * 2.0 * math.pi
xz = random.random() * 2.0 * math.pi
xw = random.random() * 2.0 * math.pi
yz = random.random() * 2.0 * math.pi
yw = random.random() * 2.0 * math.pi
zw = random.random() * 2.0 * math.pi
sxy = math.sin(xy)
cxy = math.cos(xy)
sxz = math.sin(xz)
cxz = math.cos(xz)
sxw = math.sin(xw)
cxw = math.cos(xw)
syz = math.sin(yz)
cyz = math.cos(yz)
syw = math.sin(yw)
cyw = math.cos(yw)
szw = math.sin(zw)
czw = math.cos(zw)
origx = (xa + xb) / 2.0
origy = (ya + yb) / 2.0
for ky in range(imgy):
b = ky * (yb - ya) / (imgy - 1) + ya
for kx in range(imgx):
a = kx * (xb - xa) / (imgx - 1) + xa
x = a
y = b
z = 0 # c = 0
w = 0 # d = 0
# 4d rotation around center of the plane
x = x - origx
y = y - origy
x0=x*cxy-y*sxy;y=x*sxy+y*cxy;x=x0 # xy-plane rotation
x0=x*cxz-z*sxz;z=x*sxz+z*cxz;x=x0 # xz-plane rotation
x0=x*cxw-z*sxw;w=x*sxw+z*cxw;x=x0 # xw-plane rotation
y0=y*cyz-z*syz;z=y*syz+z*cyz;y=y0 # yz-plane rotation
y0=y*cyw-w*syw;w=y*syw+w*cyw;y=y0 # yw-plane rotation
z0=z*czw-w*szw;w=z*szw+w*czw;z=z0 # zw-plane rotation
x = x + origx
y = y + origy
cx = x
cy = y
cz = z
cw = w
for i in range(maxIt):
# iteration using quaternion numbers
x0 = x * x - y * y - z * z - w * w + cx
y = 2.0 * x * y + cy
z = 2.0 * x * z + cz
w = 2.0 * x * w + cw
x = x0
# iteration using hyper-complex numbers
# x0 = x * x - y * y - z * z - w * w + cx
# y0 = 2.0 * x * y - 2.0 * z * w + cy
# z0 = 2.0 * x * z - 2.0 * y * w + cz
# w = 2.0 * x * w + 2.0 * z * y + cw
# x = x0
# y = y0
# z = z0
if x * x + y * y + z * z + w * w > 4.0: break
pixels[kx, ky] = (i % 4 * 64, i % 8 * 32, i % 16 * 16)
image.save("4D_Mandelbrot_Fractal.png", "PNG")
|
Mandelbrot fractal can easily be calculated in 8D (using Octonions) and 16D (using Sedenions) also but there is not much point to it unless you own a super-computer. :-)