Wednesday, December 23, 2015

martin attractor

This pattern generator, discovered by Barry Martin, was nicknamed 'Hopalong' when Scientific American introduced it in their September '86 issue.

Clicking the window adjusts the viewport position; there is also an alternate version with color and animation.

Also, for a certain Rubyist friend, I wrote another lazily-evaluated, colored and animated implementation in Ruby.

import Control.Arrow ((***))
import Graphics.UI.SDL as SDL
(xres, yres) = (850, 850)
(a,b,c) = (5, 1, 20)
main = withInit [InitVideo] $ do
w <- setVideoMode xres yres 32 [NoFrame]
enableEvent SDLMouseMotion False
setCaption "Hopalong Pattern" "Barry Martin"
render w p ps
loop w p ps
where
p = (xres `div` 2, yres `div` 2)
ps = take 7000000 points
loop w p ps = do
delay 32
e <- pollEvent
case e of
KeyUp (Keysym SDLK_ESCAPE _ _) -> return ()
MouseButtonUp x y _ -> click $ f x y
_ -> loop w p ps
where
click p = render w p ps >> loop w p ps
f x y = (fromIntegral x, fromIntegral y)
render w (x,y) ps = do
s <- createRGBSurface [SWSurface] 1 1 32 0 0 0 0
fillRect w (Just $ Rect 0 0 xres yres) (Pixel 0)
mapM_ (draw s 0xFFFFFF . rect . center) ps
SDL.flip w
where
center = ((xres - x) +) *** (+ (yres - y))
rect (x,y) = Just $ Rect x y 1 1
draw s c p = do fillRect s Nothing $ Pixel c
blitSurface s Nothing w p
points = map (round *** round) $ iterate f (0,0)
where
f (x,y) = (g x y, a - x)
g x y = y - (signum x * (sqrt . abs $ b*x - c))

No comments:

Post a Comment