module Main where import Control.Monad (unless) import Data.List (unfoldr, zip5) import System.Environment (getArgs) import Text.Printf (printf) import qualified System.Random.SplitMix as SM main :: IO () main = do args <- getArgs unless (null args) $ do let (g1 : g2 : g3 : g4 : _) = unfoldr (Just . SM.splitSMGen) (SM.mkSMGen 42) writeFile "gnuplot/linear.dat" $ unlines [ printf "%9.05f %9.05f %9.05f %9.05f" (x + dx) (y + dy) devX devY | (x, devX, devY, px, py) <- zip5 [ 1 .. 20 :: Double ] devsX devsY (normals (doubles g1)) (normals (doubles g2)) , let y = 3 * x + 5 , let dx = devX * px , let dy = devY * py ] writeFile "gnuplot/quad.dat" $ unlines [ printf "%9.05f %9.05f %9.05f %9.05f" (x + dx) (y + dy) devX devY | (x, devX, devY, px, py) <- zip5 [ 1 .. 20 :: Double ] devsX devsY (normals (doubles g3)) (normals (doubles g4)) , let y = 0.1 * x * x - 3 * x + 5 , let dx = devX * px , let dy = devY * py ] boxMuller :: Double -> Double -> (Double, Double) boxMuller u v = (x, y) where x = k * sin (2 * pi * v) y = k * cos (2 * pi * u) k = sqrt (negate 2 * log u) doubles :: SM.SMGen -> [Double] doubles g = let (d, g') = SM.nextDouble g in d : doubles g' normals :: [Double] -> [Double] normals [] = [] normals [_] = [] normals (u:v:ds) = let (x, y) = boxMuller u v in x : y : normals ds devsY :: [Double] devsY = 1.2 : 1.4 : 1.6 : devsY devsX :: [Double] devsX = 0.2 : 0.3 : devsX