
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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