Рисовалка мн-ва Жулиа на хаскеле со всевозможной обвязкой. Написана от нечего делать, где-то за 2 часа. Не оптимизирована!
Прошу заметить, что сама рисовалка занимает пару строк: большая часть кода - описание параметров командной строки. Да, в хаскеле всегда так
Всё-таки, имхо, оно сделано императивно. Буду думать/гуглить Ъ-функциональное решение.
читать дальше
import Complex
import Graphics.GD
import System (getArgs)
import System.Console.GetOpt
import Data.Maybe
data Options = Options {
optIX :: Int,
optIY :: Int,
optX1 :: Double,
optY1 :: Double,
optX2 :: Double,
optY2 :: Double,
optCX :: Double,
optCY :: Double,
optMax :: Int
}
defaultOptions = Options {
optIX = 800,
optIY = 600,
optX1 = -1.5,
optY1 = -1.5,
optX2 = 1.5,
optY2 = 1.5,
optCX = 0.285,
optCY = 0.01,
optMax = 255
}
main = do
args <- getArgs
let (popts, _, _) = getOpt RequireOrder options args
let Options { optIX = x,
optIY = y,
optX1 = x1,
optY1 = y1,
optX2 = x2,
optY2 = y2,
optCX = cx,
optCY = cy,
optMax = max
} = foldl (flip id) defaultOptions popts
img <- newImage (x, y)
let pixels = [(a, b) | a <- [0..x - 1], b <- [0..y - 1]]
let pixelZ (a, b) = (x1 + (fromIntegral a * (x2 - x1) / fromIntegral x)) :+
(y1 + (fromIntegral b * (y2 - y1) / fromIntegral y))
let forone coord = setPixel coord (getColor $ julia (pixelZ coord) (cx :+ cy) max) img
sequence_ $ map forone pixels
savePngFile "a.png" img
julia :: Complex Double -> Complex Double -> Int -> Int
julia z c max = length $ takeWhile ((< 10) . magnitude) $ take max $ iterate (juliai c) z
juliai :: Complex Double -> Complex Double -> Complex Double
juliai c z = z ** 2 + c
getColor :: Int -> Color
getColor x = rgb 0 x x
options :: [OptDescr (Options -> Options)]
options = [
Option ['X'] ["imagex"] (ReqArg (\x opts -> opts {optIX = read x}) "" "image width",
Option ['Y'] ["imagey"] (ReqArg (\x opts -> opts {optIY = read x}) "" "image height",
Option ['c'] ["cx"] (ReqArg (\x opts -> opts {optCX = read x}) "" "",
Option ['C'] ["cy"] (ReqArg (\x opts -> opts {optCY = read x}) "" "",
Option ['j'] ["x1"] (ReqArg (\x opts -> opts {optX1 = read x}) "" "",
Option ['k'] ["y1"] (ReqArg (\x opts -> opts {optY1 = read x}) "" "",
Option ['l'] ["x2"] (ReqArg (\x opts -> opts {optX2 = read x}) "" "",
Option ['m'] ["y2"] (ReqArg (\x opts -> opts {optY2 = read x}) "" ""
]
туду:
+ принять участие в
генту-покатушках