Yllä oleva fraktaalikuvio on niin yleinen, että lukija saattaa olla törmännyt tähän aiemminkin. Tässä blogissa pääaiheena ovat fraktaalit, joita on helppo visualisoida ja ohjelmoida, mutta joihin sisältyy hyvinkin syvällistä ja abstraktia matemaatiikkaa.
Yksi syy omaan kiinnostukseeni matematiikkaan ovat juurikin fraktaalit, joita piirtelin joskus 90-luvun alussa ensi fractint-ohjelmistolla ja sen jälkeen ohjelmoimalla itse pascal- ja C-kielillä. Silloin muinoin fraktaaleja vielä piirreltiin VGA-grafiikalla kirjoittamalla pikselien värejä suoraan näyttömuistiin, mutta nykyään käyttöjärjestelmät ja ohjelmointikielet ovat sen verran kehittyneet eteenpäin, että näin rautatason koodaukseen ei ole tarvetta. Aiemmin ohjelmointikielissä ei myöskään ollut valmiina kompleksilukuja, joita tarvitaan monien fraktaalien piirtämisessä, mutta nykyään ne löytyvät valmiina melkein kaikista ohjelmointikielistä.
Sellainen huonokin puoli systeemien kehityksessä kyllä on, että enää ei voi vaan tekstimoodia vaihtaa graafiseksi ja sen jälkeen piirrellä pisteitä näytölle, vaan ensin pitää avata grafiikkakirjasto, avata ikkuna, kenties tehdä muita valmisteluja ja vasta tämän jälkeen voi näytölle piirrellä. Kuitenkin python-kielen Tk-kirjasto tarjoaa varsin yksinkertaisen tavan piirrellä pikseligrafiikkaa ikkunaan.
Esimerkiksi ylläoleva Mandelbrotin joukon kuva on tuotettu seuraavalla ohjelmakoodilla:
# Asenna ensin python-tulkki taalta: http://www.python.org/ # Talleta koodi tiedostoon nimelta mandel1_tk.py ja aja komennolla # python mandel1_tk.py from Tkinter import Tk, PhotoImage, Label from math import * def main(): root = Tk() pic = PhotoImage(width=400, height=400) lbl = Label(root, image=pic) lbl.pack() root.update() max_iter = 1000 for y in range(pic.height()): for x in range(pic.width()): xs = 2.0 * x / pic.width() - 1.5 ys = 2.0 * y / pic.height() - 1.0 c = xs + ys*1j z = 0 n = 0 while n < max_iter and abs(z) <= 2: z = z**2 + c n = n + 1 if n == max_iter: (red,green,blue) = (0,0,0) else: (red,green,blue) = (n,2*n,3*n + 150) color = "#%02x%02x%02x" % (red % 256, green % 256, blue % 256) pic.put(color, (x,y)) root.update() root.mainloop() main()
Tämän Mandelbrotin joukon tuottamiseen liittyvään matematiikkaan mennään syvemmälle seuraavalla blogipostauksessa.