Samples¶
Mandelbrot¶
Visualising the Mandelbrot fractal with asq
. This is a direct translation
of Jon Skeet’s original LINQ Mandelbrot
from LINQ in C# to asq
in Python. The sample requires the Python Imaging
Library and so at the time of
writing only works with Python 2.
This example can be found in the source distribution of asq
under
asq/examples/mandelbrot.py
.
'''A conversion of Jon Skeet's LINQ Mandelbrot from LINQ to asq.
The original can be found at
http://msmvps.com/blogs/jon_skeet/archive/2008/02/26/visualising-the-mandelbrot-set-with-linq-yet-again.aspx
'''
import colorsys
#import Image
from asq.initiators import integers, query
def generate(start, func):
value = start
while True:
yield value
value = func(value)
def colnorm(r, g, b):
return (int(255 * r) - 1, int(255 * g) - 1, int(255 * b) - 1)
def col(n, max):
if n == max:
return (0, 0, 0)
return colnorm(colorsys.hsv_to_rgb(0.0, 1.0, float(n) / max))
def mandelbrot():
MaxIterations = 200
SampleWidth = 3.2
SampleHeight = 2.5
OffsetX = -2.1
OffsetY = -1.25
ImageWidth = 480
ImageHeight = int(SampleHeight * ImageWidth / SampleWidth)
query = integers(0, ImageHeight).select(lambda y: (y * SampleHeight) / ImageHeight + OffsetY) \
.select_many_with_correspondence(
lambda y: integers(0, ImageWidth).select(lambda x: (x * SampleWidth) / ImageWidth + OffsetX),
lambda y, x: (x, y)) \
.select(lambda real_imag: complex(*real_imag)) \
.select(lambda c: query(generate(c, lambda x: x * x + c))
.take_while(lambda x: x.real ** 2 + x.imag ** 2 < 4)
.take(MaxIterations)
.count()) \
.select(lambda c: ((c * 7) % 255, (c * 5) % 255, (c * 11) % 255) if c != MaxIterations else (0, 0, 0))
data = q.to_list()
image = Image.new("RGB", (ImageWidth, ImageHeight))
image.putdata(data)
image.show()
if __name__ == '__main__':
mandelbrot()
This example can be be run with:
python -m asq.examples.mandelbrot
which produces