{-|
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.

Please be aware that breaking API changes to the Example functions
will not be tracked in library version numbering. It is recommended
that you do not link to these functions from any production code.
-}
module Graphics.Mars.Example where

import Prelude(IO, (.), ($), writeFile, return, putStrLn)
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 :: IO()
-- example2D = do putStrLn \"Generating the graph. This may take a minute or two.\"
--                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 = 54844
--         hue = 272
--         iterations = 300
--         scalefactor = 1
--         startingpoint = (0, -80)
-- @
example2D :: IO()
example2D = do putStrLn "Generating the graph. This may take a minute or two."
               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 = 54844
        hue = 272
        iterations = 300
        scalefactor = 1
        startingpoint = (0, -80)

-- |Generates a random walk array, converts it PLY ascii format, and output the
-- PLY to a file called \"out.ply\".
--
-- @
-- examplePly :: IO ()
-- examplePly = do putStrLn \"Generating the graph. This may take a minute or two.\"
--                 a <- graph height width radius walkfactor
--                            seed iterations scalefactor startingpoint
--                 writeFile \"out.ply\" $ (toPly . surface) a
--                 putStrLn \"The file \'out.ply\' has been created in the current \\
--                          \\working directory.\"
--   where (width, height) = (300, 300)
--         radius = 30
--         walkfactor = 30
--         seed = 54844
--         iterations = 300
--         scalefactor = 1
--         startingpoint = (0, -80)
-- @
examplePly :: IO ()
examplePly = do putStrLn "Generating the graph. This may take a minute or two."
                a <- graph height width radius walkfactor
                           seed iterations scalefactor startingpoint
                writeFile "out.ply" $ (toPly . surface) a
                putStrLn "The file 'out.ply' has been created in the current \
                         \working directory."
  where (width, height) = (300, 300)
        radius = 30
        walkfactor = 30
        seed = 54844
        iterations = 300
        scalefactor = 1
        startingpoint = (0, -80)

-- |Similar to examplePly2, but generates two graphs and merges them together.
--
-- @
-- examplePly2 :: IO ()
-- examplePly2 = do putStrLn \"Generating two graphs and merging them. This may \\
--                           \\take a few minutes.\"
--                  a1 <- graph height width radius walkfactor
--                              seed1 iterations scalefactor startingpoint1
--                  a2 <- graph height width radius walkfactor
--                              seed2 iterations scalefactor startingpoint2
--                  let a3 = meldGraphs a1 a2
--                  let a4 = zRandomize 0.5 seed3 a3
--                  writeFile \"out2.ply\" $ (toPly . surface) a4
--                  putStrLn \"The file \'out2.ply\' has been created in the current \\
--                           \\working directory.\"
--   where (width, height) = (300, 300)
--         radius = 30
--         walkfactor = 30
--         iterations = 200
--         scalefactor = 1
--         seed1 = 3939423948
--         startingpoint1 = (0, 0)
--         seed2 = 34209809
--         startingpoint2 = (100, 100)
--         seed3 = 87484853049
-- @
examplePly2 :: IO ()
examplePly2 = do putStrLn "Generating two graphs and merging them. This may \
                          \take a few minutes."
                 a1 <- graph height width radius walkfactor
                             seed1 iterations scalefactor startingpoint1
                 a2 <- graph height width radius walkfactor
                             seed2 iterations scalefactor startingpoint2
                 let a3 = meldGraphs a1 a2
                 let a4 = zRandomize 0.5 seed3 a3
                 writeFile "out2.ply" $ (toPly . surface) a4
                 putStrLn "The file 'out2.ply' has been created in the current \
                          \working directory."
  where (width, height) = (300, 300)
        radius = 30
        walkfactor = 30
        iterations = 200
        scalefactor = 1
        seed1 = 3939423948
        startingpoint1 = (0, 0)
        seed2 = 34209809
        startingpoint2 = (100, 100)
        seed3 = 87484853049