So my brother has asked me to help in making some iPhone/iPad applications. Sounds like a great idea, I just need to get used to Objective-C. If you already know C/C++, it’s not a huge leap to produce some iPhone code. But I’m short of ideas to write and since most of the Mac is using Objective-C, I’ve decided practicing that language with something else, a screen saver!
I have done a simple screen saver using this excellent article to draw shapes. I’ve decided to go from utilizing already produced code to doing something of my own. My wife, who is a botanist at Iowa State was kind enough to loan me a Mac with Snow Leopard loaded, as school is out for the summer and they do not need this for their classes. I asked her what she would like, and of course, it’s ferns (that’s the plant she studies). Some quick thinking and googling lead me to the idea to use fractals! In particular, Barnsley’s Fern. To learn more, use google and this link.
Now, as I have shown previously, I’m much better with Python, so to prototype the mathematical equation and code idea, I’ve developed a sample using pygame. I found the math through this excellent code snippet, which saved me a lot of time in testing. The use of the code is explained in the comments:
#!/usr/bin/python import random, pygame, time from PIL import Image from pygame.locals import * from pygame.color import THECOLORS as color # VARIABLES TO INCLUDE MATH mat = [[0.0,0.0,0.0,0.16,0.0,0.0,0.01], [0.85,0.04,-0.04,0.85,0.0,1.6,0.85], [0.2,-0.25,0.23,0.22,0.0,1.6,0.07], [-0.15,0.28,0.26,0.24,0.0,0.44,0.07]] xa = -5.5 xb = 6.5 ya = -0.5 yb = 10.5 x = 0.0 y = 0.0 imgx = 700 imgy = 700 # VARIABLES FOR CONTROL k = 1 end = imgx*imgy / 10 * 4 # Looks like nothing is happening after this point. # START PYGAME AND SETUP pygame.init() screen = pygame.display.set_mode((imgx, imgy), 0, 8 ) pygame.display.set_caption('Fern Screensaver') screen.fill(color['black']) # START LOOP done = False while not done: # DETECT END OF DRAWING if k == end: # ENJOY AND RESET time.sleep(3) k = 0 screen.fill(color['black']) else: # MATH FOR THE FRACTAL p = random.random() if p <= mat: i = 0 elif p <= mat + mat: i = 1 elif p <= mat + mat + mat: i = 2 else: i = 3 x0 = x * mat[i] + y * mat[i] + mat[i] y = x * mat[i] + y * mat[i] + mat[i] x = x0 jx = int((x-xa)/(xb-xa)*(imgx-1)) jy = int(imgy-1)-int((y-ya)/(yb-ya)*imgy-1) # AFTER PLAYING WITH SEVERAL COLORS, WHITE ON BLACK IS THE BEST c = color['white'] screen.set_at((jx, jy), c) pygame.display.update() # DETECT EVENTS TO END PYGAME events = pygame.event.get() for e in events: if e.type == KEYDOWN and e.key == K_ESCAPE or e.type == QUIT: done = True # CYCLE AGAIN k += 1 # DONE pygame.quit()
So, the next step is to code this for the Mac… keep posted for that code/tutorial.