# True-color plasma fractal using non-recursive algorithm # FB - 201003287 import random from PIL import Image imgx = 512 imgy = 512 image = Image.new("RGB", (imgx, imgy)) mx = imgx - 1 my = imgy - 1 f = 2.0 # roughness level = round(math.log(max(imgx, imgy), 2)) + 1 image.putpixel((0, 0), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) image.putpixel((mx, 0), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) image.putpixel((mx, my), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) image.putpixel((0, my), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) for j in range(level): j2 = 2 ** j jx = float(mx) / j2 jy = float(my) / j2 for i in range(j2): y0 = i * jy y1 = y0 + jy y = y0 + jy / 2.0 for k in range(j2): x0 = k * jx x1 = x0 + jx x = x0 + jx / 2.0 a = image.getpixel((x0, y0)) b = image.getpixel((x1, y0)) c = image.getpixel((x0, y1)) d = image.getpixel((x1, y1)) image.putpixel((x, y), ((a[0] + b[0] + c[0] + d[0]) / 4.0, (a[1] + b[1] + c[1] + d[1]) / 4.0, (a[2] + b[2] + c[2] + d[2]) / 4.0)) image.putpixel((x, y0), ((a[0] + b[0]) / 2.0 + jx * (random.random() - .5) * f, (a[1] + b[1]) / 2.0 + jx * (random.random() - .5) * f, (a[2] + b[2]) / 2.0 + jx * (random.random() - .5) * f)) image.putpixel((x0, y), ((a[0] + c[0]) / 2.0 + jy * (random.random() - .5) * f, (a[1] + c[1]) / 2.0 + jy * (random.random() - .5) * f, (a[2] + c[2]) / 2.0 + jy * (random.random() - .5) * f)) image.putpixel((x1, y), ((b[0] + d[0]) / 2.0 + jy * (random.random() - .5) * f, (b[1] + d[1]) / 2.0 + jy * (random.random() - .5) * f, (b[2] + d[2]) / 2.0 + jy * (random.random() - .5) * f)) image.putpixel((x, y1), ((c[0] + d[0]) / 2.0 + jx * (random.random() - .5) * f, (c[1] + d[1]) / 2.0 + jx * (random.random() - .5) * f, (c[2] + d[2]) / 2.0 + jx * (random.random() - .5) * f)) image.save("plasma2.png", "PNG")