{-|
Module      : Graphics.Mars.Example
Description : Provides code examples which can be studied or executed.
Copyright   : (c) Christopher Howard, 2016
License     : GPL-3
Maintainer  : ch.howard@zoho.com

Run an example function to view an image, or study the function source code for
to see how the library can be used.
-}
module Graphics.Mars.Example where

import Prelude(IO, (.), ($), writeFile)
import Graphics.Gloss (black)
import Data.Array.Unboxed (elems)
import Graphics.Mars.Paint
import Graphics.Mars.Graph
import Graphics.Mars.Display2D
import Graphics.Mars.Ply

-- |Generates an example random walk array and displays it as a 2-dimensional
-- intensity graph
--
-- @
-- example2D = do a <- graph height width radius walkfactor
--                           seed iterations scalefactor startingpoint
--                displayWindow (width, height) black "Mars"
--                  (toImage a (lightnessInt hue (minMax (elems a))))
--   where (width, height) = (300, 300)
--         radius = 30
--         walkfactor = 30
--         seed = 9484
--         hue = 272
--         iterations = 200
--         scalefactor = 1
--         startingpoint = (0, 0)
-- @
example2D :: IO()
example2D = do a <- graph height width radius walkfactor
                          seed iterations scalefactor startingpoint
               displayWindow (width, height) black "Mars"
                 (toImage a (lightnessInt hue (minMax (elems a))))
  where (width, height) = (300, 300)
        radius = 30
        walkfactor = 30
        seed = 9484
        hue = 272
        iterations = 200
        scalefactor = 1
        startingpoint = (0, 0)

-- |Generates a random walk array, converts it PLY ascii format, and output the
-- PLY to a file called \"out.ply\".
--
-- @
-- examplePly = do a <- graph height width radius walkfactor
--                            seed iterations scalefactor startingpoint
--                 writeFile "out.ply" $ (toPly . surface) a
--   where (width, height) = (400, 400)
--         radius = 10
--         walkfactor = 10
--         seed = 4748830300
--         iterations = 400
--         scalefactor = 1
--         startingpoint = (0, 0)
-- @
examplePly :: IO ()
examplePly = do a <- graph height width radius walkfactor
                           seed iterations scalefactor startingpoint
                writeFile "out.ply" $ (toPly . surface) a
  where (width, height) = (400, 400)
        radius = 10
        walkfactor = 10
        seed = 4748830300
        iterations = 400
        scalefactor = 1
        startingpoint = (0, 0)

examplePly2 :: IO ()
examplePly2 = do a <- graph height width radius walkfactor
                            seed iterations scalefactor startingpoint
                 writeFile "out2.ply" $ (toPly . surface) a
  where (width, height) = (400, 400)
        radius = 10
        walkfactor = 10
        seed = 84934
        iterations = 400
        scalefactor = 1
        startingpoint = (0, 0)

examplePly3 :: IO ()
examplePly3 = do a <- graph height width radius walkfactor
                            seed iterations scalefactor startingpoint
                 writeFile "out3.ply" $ (toPly . surface) a
  where (width, height) = (400, 400)
        radius = 10
        walkfactor = 10
        seed = 49409484
        iterations = 2000
        scalefactor = 1
        startingpoint = (0, 0)

examplePly4 :: IO ()
examplePly4 = do a <- graph height width radius walkfactor
                            seed iterations scalefactor startingpoint
                 writeFile "out4.ply" $ (toPly . surface) a
  where (width, height) = (600, 600)
        radius = 10
        walkfactor = 20
        seed = 1829384
        iterations = 4000
        scalefactor = 1
        startingpoint = (0, 0)

-- |Warning: Large output file with 1 million vertices! May take a
-- while to complete, with 40000 iterations.
examplePly5 :: IO ()
examplePly5 = do a <- graph height width radius walkfactor
                            seed iterations scalefactor startingpoint
                 writeFile "out5.ply" $ (toPly . surface) a
  where (width, height) = (1000, 1000)
        radius = 15
        walkfactor = 15
        seed = 74830949937
        iterations = 40000
        scalefactor = 0.5
        startingpoint = ((-250), 250)