import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import Data.Complex type MyPoint = ((Vertex2 GLfloat),(Color3 GLfloat)) 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 :: [MyPoint] myPoints = [((Vertex2 x y) , (colorD ex)) | x <-mx , y <-my ,let ex = (convergeSequence ((realToFrac x - 0.5) :+ ( realToFrac y )) (0.0 :+ 0.0) 0)] constantC :: Float -> Float -> (Complex Float) constantC f1 f2 = f1 :+ f2 maxR :: Float maxR = 2.0 maxCount :: Int maxCount = 40 main = do (progname, _) <- getArgsAndInitialize createWindow "Julia" windowSize $= Size 800 800 displayCallback $= display mainLoop display =do clear [ColorBuffer] mapM_ pointColored (myPoints) flush pointColored :: MyPoint -> IO() pointColored mypt = do renderPrimitive Points $ do vertex((fst mypt)) color((snd mypt)) convergeSequence :: (Complex Float) -> (Complex Float) -> Int -> Int convergeSequence zConst z count |(magnitude z) >= maxR =count |count >= maxCount =count |otherwise = let newZ = z^2 + zConst in do convergeSequence zConst newZ (count+1) colorD :: Int -> (Color3 GLfloat) colorD a | (a < 35) = Color3 0.0 0.0 1.0 | (a >=35) = Color3 0.0 0.0 0.0