import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import Data.Complex import Data.List import Data.List.Split import Control.Applicative type MyPoint = ((Vertex3 GLfloat),(Color3 GLfloat)) data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show) mx::[GLfloat] mx =[0.002,0.004..1.0] ++ [-0.002,-0.004..(-1.0)] ++ [0.0] my::[GLfloat] my = [0.002,0.004..1.0] ++ [-0.002,-0.004..(-1.0)] ++ [0.0] myPoints :: ((Complex Float) -> (Complex Float)) -> [MyPoint] myPoints g = [((Vertex3 x y 0.0) , (colorD ex)) | x <-mx , y <-my ,let ex = (convergeSequence g ((gLfloatTofloat x) :+ (gLfloatTofloat y)) 0)] gLfloatTofloat :: GLfloat -> Float gLfloatTofloat = realToFrac maxR :: Float maxR = 4.0 maxCount :: Int maxCount = 40 main = do putStrLn "Input Polynominal" px <- getLine (progname, _) <- getArgsAndInitialize createWindow "Julia" windowSize $= Size 800 800 displayCallback $= display (makePolynominal px) mainLoop display :: ((Complex Float) -> (Complex Float)) -> IO() display g = do clear [ColorBuffer] mapM_ pointColored (myPoints g ) flush pointColored :: MyPoint -> IO() pointColored mypt = do renderPrimitive Points $ do vertex((fst mypt)) color((snd mypt)) convergeSequence :: ((Complex Float) -> (Complex Float)) -> (Complex Float) -> Int -> Int convergeSequence g z count |(magnitude z) >= maxR =count |count >= maxCount =count |otherwise = let newZ = g z in convergeSequence g newZ (count+1) tst :: (Complex Float) -> (Complex Float) tst z= z^2 + 0.1 makePolynominal :: String -> (Complex Float) -> (Complex Float) makePolynominal s z =sum $ getZipList $ (*) <$> ZipList (map (read . complexNotation) (splitOn "," s)) <*> ZipList (inftyVarList z) inftyVarList :: (Complex Float) -> [(Complex Float)] inftyVarList z = [z^n | n <- [0,1..]] complexNotation :: String -> String complexNotation s = if ':' `elem` s then s else s ++":+0.0" colorD :: Int -> (Color3 GLfloat) colorD a | (a `mod` maxCount == 0) = Color3 0.0 0.0 0.0 | (a `mod` maxCount <= 4) = Color3 0.0 0.0 0.3 | (a `mod` maxCount <= 8) = Color3 0.0 0.0 0.6 | (a `mod` maxCount <= 12) = Color3 0.0 0.0 1.0 | (a `mod` maxCount <= 16) = Color3 0.3 0.0 1.0 | (a `mod` maxCount <= 20) = Color3 0.6 0.0 1.0 | (a `mod` maxCount <= 24) = Color3 1.0 0.0 1.0 | (a `mod` maxCount <= 28) = Color3 1.0 0.3 0.6 | (a `mod` maxCount <= 32) = Color3 1.0 0.6 0.3 | (a `mod` maxCount <= 36) = Color3 1.0 1.0 0.0 | (a `mod` maxCount <= 39) = Color3 0.8 1.0 0.0