import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import Data.Complex type MyPoint = ((Vertex3 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 :: Float -> Float -> [MyPoint] myPoints f1 f2 = [((Vertex3 x y 0.0) , (colorD ex)) | x <-mx , y <-my ,let ex = (convergeSequence (constantC f1 f2) ((realToFrac x) :+ (realToFrac y)) 0)] constantC :: Float -> Float -> Complex Float constantC f1 f2 = f1 :+ f2 maxR :: Float maxR = 2.0 maxCount :: Int maxCount = 40 main = do putStrLn "Input constant complex number's real part" constantC1 <- getLine putStrLn "Input constant complex number's image part" constantC2 <- getLine (progname, _) <- getArgsAndInitialize createWindow "Julia" windowSize $= Size 800 800 displayCallback $= display (read constantC1 :: Float) (read constantC2 ::Float) mainLoop display :: Float -> Float -> IO() display f1 f2 = do clear [ColorBuffer] mapM_ pointColored (myPoints f1 f2 ) 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 convergeSequence zConst newZ (count+1) 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