20100225

Buddhabrot

Po nocích, když se nudím nebo když potřebuju ze své hlavy vytáhnout co nejvíc nebo když mám prostě chuť, programuju v Pythonu, krásném jazyce pro lidi, jako jsem já. Můj nejposlednější projekt je zatím generátor Mandelbrotovy množiny a nástavba pro zobrazení tzv. Buddhabrota.


Aby bylo jasno a nedocházelo k případným spekulacím. Umím základy Pythonu a jediná vnější aplikace, se kterou ho umím slinkovat, je Blender. Je to 3D grafický nástroj, takže se pro mé účely hodí jen částečně. Je velmi snadné spravovat a do finálního obrázku umisťovat výsledné body buddhabrota, ale proces je ták pomalý... Pro zajímavost sem hodím (neokomentovaný) zdroják poslední verze svého výtvoru:

from math import sqrt
import bpy
from random import randrange
from time import time
me=bpy.data.meshes.new('Mandel')
scn = bpy.data.scenes.active
ob = scn.objects.new(me, 'Mandel')
a=0
timers=time()


def iter(zr,zi,r,i):
return (zr*zr)-(zi*zi)+r,2*zr*zi+i


def check(r,i,it,bail):
zr=r
zi=i
a=1
while a<=it:
zr,zi=iter(zr,zi,r,i)
if sqrt((zr**2)+(zi**2))>=bail:
return False,a
a+=1
return True,0


def plot(r,i,b,it,bail):
zr=r
zi=i
a=1
while a<=it:
zr,zi=iter(zr,zi,r,i)
if a>=4:
me.verts.extend([[zr,zi,b],[zr,-zi,b/100]])
if sqrt((zr**2)+(zi**2))>=bail:
return False
a+=1
return True


try:
a=1
timer=time()
timers=time()
while 0==0:

r=randrange(-30000000000000,30000000000000)/float(10000000000000)
i=randrange(-30000000000000,30000000000000)/float(10000000000000)
if (a%1000)==0:
print a,"iterovanych bodu Z (",time()-timer,"sec. )"
timer=time()
bck,b=check(r,i,100000,50)
if bck==False:
plot(r,i,b,100000,50)
a+=1

finally:
print "Celkem iterovano",a,"bodu Z, ubehlo",time()-timers,"sekund."

Krásné, že? :) Ale nejspíš chcete vidět výsledek a ne průběh, tak vám to ukážu:
No jistě uznáte, že to nevypadá nic moc. Jenom samotné trasování bodů Z trvalo 14 hodin a to nemluvím o renderu, který je v Blenderu nutné provést. Chystám se tedy napsat novou verzi, kde místo blenderovského me.verts.extend([[zr,zi,b],[zr,-zi,b/100]]) bude něco pro přímou práci s obrázky, čímž snad ušetřím spousty času.

2 komentáře:

  1. Ále.. Mam tam chybu, v tom ověřování, jestli počet iterací překročil 4.. Má tam být opačná nerovnost.

    OdpovědětVymazat