-- Copyright (c) 2011, Colin Hill

--

-- Loosely based on implementation of libnoise by Jason Bevins Copyright (C) 2003, 2004

-- http://libnoise.sourceforge.net


-- | Contains 'Noise' class as well as a general coherent noise generating function which

-- the specific noise implementations are based on.

module Numeric.Noise (
    Point,
    Seed,
    Noise(noiseValue),
    pmap,
    clamp,
    coherentNoise
) where

import Data.Bits
import Data.Vector.Unboxed (Vector, fromList, (!))

-- | A point in 3-space.

type Point = (Double, Double, Double)

-- | A seed for a random function.

type Seed = Int

-- | Class of noise functions.

class Noise a where
    -- | Maps 3-space points to a noise value between -1 and 1 for the given noise function.

    noiseValue :: a -> Point -> Double

-- | Map a function on a 'Point'.

pmap :: (Double -> Double) -> Point -> Point
pmap :: (Double -> Double) -> Point -> Point
pmap Double -> Double
f (Double
x, Double
y, Double
z) = (Double -> Double
f Double
x, Double -> Double
f Double
y, Double -> Double
f Double
z)

-- | Returns a clamped value between a min and max value.

clamp :: Ord a => a -> a -> a -> a
clamp :: forall a. Ord a => a -> a -> a -> a
clamp a
v a
m a
m' = forall a. Ord a => a -> a -> a
max a
m (forall a. Ord a => a -> a -> a
min a
m' a
v)

-- | Returns a coherent noise value between -1 and 1 given a seed and a point in 3-space.

coherentNoise :: Seed -> Point -> Double
coherentNoise :: Int -> Point -> Double
coherentNoise Int
seed (Double
x, Double
y, Double
z) = forall a. Ord a => a -> a -> a -> a
clamp Double
noise (-Double
1) Double
1
    where (Double
ox, Double
oy, Double
oz) = (Double -> Double
clampToIntRange Double
x, Double -> Double
clampToIntRange Double
y, Double -> Double
clampToIntRange Double
z)
          x0 :: Int
x0           = forall a b. (RealFrac a, Integral b) => a -> b
floor Double
ox
          x1 :: Int
x1           = Int
x0 forall a. Num a => a -> a -> a
+ Int
1
          y0 :: Int
y0           = forall a b. (RealFrac a, Integral b) => a -> b
floor Double
oy
          y1 :: Int
y1           = Int
y0 forall a. Num a => a -> a -> a
+ Int
1
          z0 :: Int
z0           = forall a b. (RealFrac a, Integral b) => a -> b
floor Double
oz
          z1 :: Int
z1           = Int
z0 forall a. Num a => a -> a -> a
+ Int
1
          sx :: Double
sx           = Double -> Double
scurve (Double
ox forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x0)
          sy :: Double
sy           = Double -> Double
scurve (Double
oy forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
y0)
          sz :: Double
sz           = Double -> Double
scurve (Double
oz forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
z0)
          n0 :: Double
n0           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x0 Int
y0 Int
z0
          n1 :: Double
n1           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x1 Int
y0 Int
z0
          n2 :: Double
n2           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x0 Int
y1 Int
z0
          n3 :: Double
n3           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x1 Int
y1 Int
z0
          n4 :: Double
n4           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x0 Int
y0 Int
z1
          n5 :: Double
n5           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x1 Int
y0 Int
z1
          n6 :: Double
n6           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x0 Int
y1 Int
z1
          n7 :: Double
n7           = Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
ox Double
oy Double
oz Int
x1 Int
y1 Int
z1
          ix0 :: Double
ix0          = Double -> Double -> Double -> Double
lerp Double
sx Double
n0 Double
n1
          ix1 :: Double
ix1          = Double -> Double -> Double -> Double
lerp Double
sx Double
n2 Double
n3
          ix2 :: Double
ix2          = Double -> Double -> Double -> Double
lerp Double
sx Double
n4 Double
n5
          ix3 :: Double
ix3          = Double -> Double -> Double -> Double
lerp Double
sx Double
n6 Double
n7
          iy0 :: Double
iy0          = Double -> Double -> Double -> Double
lerp Double
sy Double
ix0 Double
ix1
          iy1 :: Double
iy1          = Double -> Double -> Double -> Double
lerp Double
sy Double
ix2 Double
ix3
          noise :: Double
noise        = Double -> Double -> Double -> Double
lerp Double
sz Double
iy0 Double
iy1

-- | Returns a gradient noise value given a seed, a point in 3-space, and a nearby integer

-- point in 3-space.

gradientNoise :: Seed -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise :: Int -> Double -> Double -> Double -> Int -> Int -> Int -> Double
gradientNoise Int
seed Double
fx Double
fy Double
fz Int
ix Int
iy Int
iz = Double
2.12 forall a. Num a => a -> a -> a
* (Double
gx forall a. Num a => a -> a -> a
* Double
ox forall a. Num a => a -> a -> a
+ Double
gy forall a. Num a => a -> a -> a
* Double
oy forall a. Num a => a -> a -> a
+ Double
gz forall a. Num a => a -> a -> a
* Double
oz)
    where (Double
gx, Double
gy, Double
gz) = (Vector Double
vectorTable forall a. Unbox a => Vector a -> Int -> a
! forall a. Bits a => a -> Int -> a
shiftL Int
i Int
2,
                          Vector Double
vectorTable forall a. Unbox a => Vector a -> Int -> a
! (forall a. Bits a => a -> Int -> a
shiftL Int
i Int
2 forall a. Num a => a -> a -> a
+ Int
1),
                          Vector Double
vectorTable forall a. Unbox a => Vector a -> Int -> a
! (forall a. Bits a => a -> Int -> a
shiftL Int
i Int
2 forall a. Num a => a -> a -> a
+ Int
2))
          (Double
ox, Double
oy, Double
oz) = (Double
fx forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ix,
                          Double
fy forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
iy,
                          Double
fz forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
iz)
          i :: Int
i            = (Int
i' forall a. Bits a => a -> a -> a
`xor` forall a. Bits a => a -> Int -> a
shiftR Int
i' Int
8) forall a. Bits a => a -> a -> a
.&. Int
0xff
          i' :: Int
i'           = (Int
1619 forall a. Num a => a -> a -> a
* Int
ix forall a. Num a => a -> a -> a
+ Int
31337 forall a. Num a => a -> a -> a
* Int
iy forall a. Num a => a -> a -> a
+ Int
6971 forall a. Num a => a -> a -> a
* Int
iz forall a. Num a => a -> a -> a
+ Int
1013 forall a. Num a => a -> a -> a
* Int
seed) forall a. Bits a => a -> a -> a
.&. Int
0xffffffff

-- | Returns the linearly interpolated value between two values given a delta.

lerp :: Double -> Double -> Double -> Double
lerp :: Double -> Double -> Double -> Double
lerp Double
t Double
a Double
b = (Double
1.0 forall a. Num a => a -> a -> a
- Double
t) forall a. Num a => a -> a -> a
* Double
a forall a. Num a => a -> a -> a
+ Double
t forall a. Num a => a -> a -> a
* Double
b

-- | Maps a value onto a quintic s-curve.

scurve :: Double -> Double
scurve :: Double -> Double
scurve Double
a = (Double
6.0 forall a. Num a => a -> a -> a
* Double
a5) forall a. Num a => a -> a -> a
- (Double
15.0 forall a. Num a => a -> a -> a
* Double
a4) forall a. Num a => a -> a -> a
+ (Double
10.0 forall a. Num a => a -> a -> a
* Double
a3)
    where a3 :: Double
a3 = Double
a forall a. Num a => a -> a -> a
* Double
a forall a. Num a => a -> a -> a
* Double
a
          a4 :: Double
a4 = Double
a3 forall a. Num a => a -> a -> a
* Double
a
          a5 :: Double
a5 = Double
a4 forall a. Num a => a -> a -> a
* Double
a

-- | Clamps a 'Double' to the range of an 'Int'.

clampToIntRange :: Double -> Double
clampToIntRange :: Double -> Double
clampToIntRange Double
n | Double
n forall a. Ord a => a -> a -> Bool
>= Double
maxInt    = Double
2.0 forall a. Num a => a -> a -> a
* Double -> Double -> Double
fmod Double
n Double
maxInt forall a. Num a => a -> a -> a
- Double
maxInt
                  | Double
n forall a. Ord a => a -> a -> Bool
<= (-Double
maxInt) = Double
2.0 forall a. Num a => a -> a -> a
* Double -> Double -> Double
fmod Double
n Double
maxInt forall a. Num a => a -> a -> a
+ Double
maxInt
                  | Bool
otherwise            = Double
n
    where maxInt :: Double
maxInt = Double
1073741824.0 -- Max 32 bit signed Int.  Should not be hardcoded.


-- | Floating point modulus function.

fmod :: Double -> Double -> Double
fmod :: Double -> Double -> Double
fmod Double
x Double
y = Double
x forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a b. (RealFrac a, Integral b) => a -> b
floor (Double
x forall a. Fractional a => a -> a -> a
/ Double
y) :: Int) forall a. Num a => a -> a -> a
* Double
y

-- | Table of random normalized vectors.

vectorTable :: Vector Double
vectorTable :: Vector Double
vectorTable = forall a. Unbox a => [a] -> Vector a
fromList [
    -Double
0.763874, -Double
0.596439, -Double
0.246489, Double
0.0,
    Double
0.396055, Double
0.904518, -Double
0.158073, Double
0.0,
    -Double
0.499004, -Double
0.8665, -Double
0.0131631, Double
0.0,
    Double
0.468724, -Double
0.824756, Double
0.316346, Double
0.0,
    Double
0.829598, Double
0.43195, Double
0.353816, Double
0.0,
    -Double
0.454473, Double
0.629497, -Double
0.630228, Double
0.0,
    -Double
0.162349, -Double
0.869962, -Double
0.465628, Double
0.0,
    Double
0.932805, Double
0.253451, Double
0.256198, Double
0.0,
    -Double
0.345419, Double
0.927299, -Double
0.144227, Double
0.0,
    -Double
0.715026, -Double
0.293698, -Double
0.634413, Double
0.0,
    -Double
0.245997, Double
0.717467, -Double
0.651711, Double
0.0,
    -Double
0.967409, -Double
0.250435, -Double
0.037451, Double
0.0,
    Double
0.901729, Double
0.397108, -Double
0.170852, Double
0.0,
    Double
0.892657, -Double
0.0720622, -Double
0.444938, Double
0.0,
    Double
0.0260084, -Double
0.0361701, Double
0.999007, Double
0.0,
    Double
0.949107, -Double
0.19486, Double
0.247439, Double
0.0,
    Double
0.471803, -Double
0.807064, -Double
0.355036, Double
0.0,
    Double
0.879737, Double
0.141845, Double
0.453809, Double
0.0,
    Double
0.570747, Double
0.696415, Double
0.435033, Double
0.0,
    -Double
0.141751, -Double
0.988233, -Double
0.0574584, Double
0.0,
    -Double
0.58219, -Double
0.0303005, Double
0.812488, Double
0.0,
    -Double
0.60922, Double
0.239482, -Double
0.755975, Double
0.0,
    Double
0.299394, -Double
0.197066, -Double
0.933557, Double
0.0,
    -Double
0.851615, -Double
0.220702, -Double
0.47544, Double
0.0,
    Double
0.848886, Double
0.341829, -Double
0.403169, Double
0.0,
    -Double
0.156129, -Double
0.687241, Double
0.709453, Double
0.0,
    -Double
0.665651, Double
0.626724, Double
0.405124, Double
0.0,
    Double
0.595914, -Double
0.674582, Double
0.43569, Double
0.0,
    Double
0.171025, -Double
0.509292, Double
0.843428, Double
0.0,
    Double
0.78605, Double
0.536414, -Double
0.307222, Double
0.0,
    Double
0.18905, -Double
0.791613, Double
0.581042, Double
0.0,
    -Double
0.294916, Double
0.844994, Double
0.446105, Double
0.0,
    Double
0.342031, -Double
0.58736, -Double
0.7335, Double
0.0,
    Double
0.57155, Double
0.7869, Double
0.232635, Double
0.0,
    Double
0.885026, -Double
0.408223, Double
0.223791, Double
0.0,
    -Double
0.789518, Double
0.571645, Double
0.223347, Double
0.0,
    Double
0.774571, Double
0.31566, Double
0.548087, Double
0.0,
    -Double
0.79695, -Double
0.0433603, -Double
0.602487, Double
0.0,
    -Double
0.142425, -Double
0.473249, -Double
0.869339, Double
0.0,
    -Double
0.0698838, Double
0.170442, Double
0.982886, Double
0.0,
    Double
0.687815, -Double
0.484748, Double
0.540306, Double
0.0,
    Double
0.543703, -Double
0.534446, -Double
0.647112, Double
0.0,
    Double
0.97186, Double
0.184391, -Double
0.146588, Double
0.0,
    Double
0.707084, Double
0.485713, -Double
0.513921, Double
0.0,
    Double
0.942302, Double
0.331945, Double
0.043348, Double
0.0,
    Double
0.499084, Double
0.599922, Double
0.625307, Double
0.0,
    -Double
0.289203, Double
0.211107, Double
0.9337, Double
0.0,
    Double
0.412433, -Double
0.71667, -Double
0.56239, Double
0.0,
    Double
0.87721, -Double
0.082816, Double
0.47291, Double
0.0,
    -Double
0.420685, -Double
0.214278, Double
0.881538, Double
0.0,
    Double
0.752558, -Double
0.0391579, Double
0.657361, Double
0.0,
    Double
0.0765725, -Double
0.996789, Double
0.0234082, Double
0.0,
    -Double
0.544312, -Double
0.309435, -Double
0.779727, Double
0.0,
    -Double
0.455358, -Double
0.415572, Double
0.787368, Double
0.0,
    -Double
0.874586, Double
0.483746, Double
0.0330131, Double
0.0,
    Double
0.245172, -Double
0.0838623, Double
0.965846, Double
0.0,
    Double
0.382293, -Double
0.432813, Double
0.81641, Double
0.0,
    -Double
0.287735, -Double
0.905514, Double
0.311853, Double
0.0,
    -Double
0.667704, Double
0.704955, -Double
0.239186, Double
0.0,
    Double
0.717885, -Double
0.464002, -Double
0.518983, Double
0.0,
    Double
0.976342, -Double
0.214895, Double
0.0240053, Double
0.0,
    -Double
0.0733096, -Double
0.921136, Double
0.382276, Double
0.0,
    -Double
0.986284, Double
0.151224, -Double
0.0661379, Double
0.0,
    -Double
0.899319, -Double
0.429671, Double
0.0812908, Double
0.0,
    Double
0.652102, -Double
0.724625, Double
0.222893, Double
0.0,
    Double
0.203761, Double
0.458023, -Double
0.865272, Double
0.0,
    -Double
0.030396, Double
0.698724, -Double
0.714745, Double
0.0,
    -Double
0.460232, Double
0.839138, Double
0.289887, Double
0.0,
    -Double
0.0898602, Double
0.837894, Double
0.538386, Double
0.0,
    -Double
0.731595, Double
0.0793784, Double
0.677102, Double
0.0,
    -Double
0.447236, -Double
0.788397, Double
0.422386, Double
0.0,
    Double
0.186481, Double
0.645855, -Double
0.740335, Double
0.0,
    -Double
0.259006, Double
0.935463, Double
0.240467, Double
0.0,
    Double
0.445839, Double
0.819655, -Double
0.359712, Double
0.0,
    Double
0.349962, Double
0.755022, -Double
0.554499, Double
0.0,
    -Double
0.997078, -Double
0.0359577, Double
0.0673977, Double
0.0,
    -Double
0.431163, -Double
0.147516, -Double
0.890133, Double
0.0,
    Double
0.299648, -Double
0.63914, Double
0.708316, Double
0.0,
    Double
0.397043, Double
0.566526, -Double
0.722084, Double
0.0,
    -Double
0.502489, Double
0.438308, -Double
0.745246, Double
0.0,
    Double
0.0687235, Double
0.354097, Double
0.93268, Double
0.0,
    -Double
0.0476651, -Double
0.462597, Double
0.885286, Double
0.0,
    -Double
0.221934, Double
0.900739, -Double
0.373383, Double
0.0,
    -Double
0.956107, -Double
0.225676, Double
0.186893, Double
0.0,
    -Double
0.187627, Double
0.391487, -Double
0.900852, Double
0.0,
    -Double
0.224209, -Double
0.315405, Double
0.92209, Double
0.0,
    -Double
0.730807, -Double
0.537068, Double
0.421283, Double
0.0,
    -Double
0.0353135, -Double
0.816748, Double
0.575913, Double
0.0,
    -Double
0.941391, Double
0.176991, -Double
0.287153, Double
0.0,
    -Double
0.154174, Double
0.390458, Double
0.90762, Double
0.0,
    -Double
0.283847, Double
0.533842, Double
0.796519, Double
0.0,
    -Double
0.482737, -Double
0.850448, Double
0.209052, Double
0.0,
    -Double
0.649175, Double
0.477748, Double
0.591886, Double
0.0,
    Double
0.885373, -Double
0.405387, -Double
0.227543, Double
0.0,
    -Double
0.147261, Double
0.181623, -Double
0.972279, Double
0.0,
    Double
0.0959236, -Double
0.115847, -Double
0.988624, Double
0.0,
    -Double
0.89724, -Double
0.191348, Double
0.397928, Double
0.0,
    Double
0.903553, -Double
0.428461, -Double
0.00350461, Double
0.0,
    Double
0.849072, -Double
0.295807, -Double
0.437693, Double
0.0,
    Double
0.65551, Double
0.741754, -Double
0.141804, Double
0.0,
    Double
0.61598, -Double
0.178669, Double
0.767232, Double
0.0,
    Double
0.0112967, Double
0.932256, -Double
0.361623, Double
0.0,
    -Double
0.793031, Double
0.258012, Double
0.551845, Double
0.0,
    Double
0.421933, Double
0.454311, Double
0.784585, Double
0.0,
    -Double
0.319993, Double
0.0401618, -Double
0.946568, Double
0.0,
    -Double
0.81571, Double
0.551307, -Double
0.175151, Double
0.0,
    -Double
0.377644, Double
0.00322313, Double
0.925945, Double
0.0,
    Double
0.129759, -Double
0.666581, -Double
0.734052, Double
0.0,
    Double
0.601901, -Double
0.654237, -Double
0.457919, Double
0.0,
    -Double
0.927463, -Double
0.0343576, -Double
0.372334, Double
0.0,
    -Double
0.438663, -Double
0.868301, -Double
0.231578, Double
0.0,
    -Double
0.648845, -Double
0.749138, -Double
0.133387, Double
0.0,
    Double
0.507393, -Double
0.588294, Double
0.629653, Double
0.0,
    Double
0.726958, Double
0.623665, Double
0.287358, Double
0.0,
    Double
0.411159, Double
0.367614, -Double
0.834151, Double
0.0,
    Double
0.806333, Double
0.585117, -Double
0.0864016, Double
0.0,
    Double
0.263935, -Double
0.880876, Double
0.392932, Double
0.0,
    Double
0.421546, -Double
0.201336, Double
0.884174, Double
0.0,
    -Double
0.683198, -Double
0.569557, -Double
0.456996, Double
0.0,
    -Double
0.117116, -Double
0.0406654, -Double
0.992285, Double
0.0,
    -Double
0.643679, -Double
0.109196, -Double
0.757465, Double
0.0,
    -Double
0.561559, -Double
0.62989, Double
0.536554, Double
0.0,
    Double
0.0628422, Double
0.104677, -Double
0.992519, Double
0.0,
    Double
0.480759, -Double
0.2867, -Double
0.828658, Double
0.0,
    -Double
0.228559, -Double
0.228965, -Double
0.946222, Double
0.0,
    -Double
0.10194, -Double
0.65706, -Double
0.746914, Double
0.0,
    Double
0.0689193, -Double
0.678236, Double
0.731605, Double
0.0,
    Double
0.401019, -Double
0.754026, Double
0.52022, Double
0.0,
    -Double
0.742141, Double
0.547083, -Double
0.387203, Double
0.0,
    -Double
0.00210603, -Double
0.796417, -Double
0.604745, Double
0.0,
    Double
0.296725, -Double
0.409909, -Double
0.862513, Double
0.0,
    -Double
0.260932, -Double
0.798201, Double
0.542945, Double
0.0,
    -Double
0.641628, Double
0.742379, Double
0.192838, Double
0.0,
    -Double
0.186009, -Double
0.101514, Double
0.97729, Double
0.0,
    Double
0.106711, -Double
0.962067, Double
0.251079, Double
0.0,
    -Double
0.743499, Double
0.30988, -Double
0.592607, Double
0.0,
    -Double
0.795853, -Double
0.605066, -Double
0.0226607, Double
0.0,
    -Double
0.828661, -Double
0.419471, -Double
0.370628, Double
0.0,
    Double
0.0847218, -Double
0.489815, -Double
0.8677, Double
0.0,
    -Double
0.381405, Double
0.788019, -Double
0.483276, Double
0.0,
    Double
0.282042, -Double
0.953394, Double
0.107205, Double
0.0,
    Double
0.530774, Double
0.847413, Double
0.0130696, Double
0.0,
    Double
0.0515397, Double
0.922524, Double
0.382484, Double
0.0,
    -Double
0.631467, -Double
0.709046, Double
0.313852, Double
0.0,
    Double
0.688248, Double
0.517273, Double
0.508668, Double
0.0,
    Double
0.646689, -Double
0.333782, -Double
0.685845, Double
0.0,
    -Double
0.932528, -Double
0.247532, -Double
0.262906, Double
0.0,
    Double
0.630609, Double
0.68757, -Double
0.359973, Double
0.0,
    Double
0.577805, -Double
0.394189, Double
0.714673, Double
0.0,
    -Double
0.887833, -Double
0.437301, -Double
0.14325, Double
0.0,
    Double
0.690982, Double
0.174003, Double
0.701617, Double
0.0,
    -Double
0.866701, Double
0.0118182, Double
0.498689, Double
0.0,
    -Double
0.482876, Double
0.727143, Double
0.487949, Double
0.0,
    -Double
0.577567, Double
0.682593, -Double
0.447752, Double
0.0,
    Double
0.373768, Double
0.0982991, Double
0.922299, Double
0.0,
    Double
0.170744, Double
0.964243, -Double
0.202687, Double
0.0,
    Double
0.993654, -Double
0.035791, -Double
0.106632, Double
0.0,
    Double
0.587065, Double
0.4143, -Double
0.695493, Double
0.0,
    -Double
0.396509, Double
0.26509, -Double
0.878924, Double
0.0,
    -Double
0.0866853, Double
0.83553, -Double
0.542563, Double
0.0,
    Double
0.923193, Double
0.133398, -Double
0.360443, Double
0.0,
    Double
0.00379108, -Double
0.258618, Double
0.965972, Double
0.0,
    Double
0.239144, Double
0.245154, -Double
0.939526, Double
0.0,
    Double
0.758731, -Double
0.555871, Double
0.33961, Double
0.0,
    Double
0.295355, Double
0.309513, Double
0.903862, Double
0.0,
    Double
0.0531222, -Double
0.91003, -Double
0.411124, Double
0.0,
    Double
0.270452, Double
0.0229439, -Double
0.96246, Double
0.0,
    Double
0.563634, Double
0.0324352, Double
0.825387, Double
0.0,
    Double
0.156326, Double
0.147392, Double
0.976646, Double
0.0,
    -Double
0.0410141, Double
0.981824, Double
0.185309, Double
0.0,
    -Double
0.385562, -Double
0.576343, -Double
0.720535, Double
0.0,
    Double
0.388281, Double
0.904441, Double
0.176702, Double
0.0,
    Double
0.945561, -Double
0.192859, -Double
0.262146, Double
0.0,
    Double
0.844504, Double
0.520193, Double
0.127325, Double
0.0,
    Double
0.0330893, Double
0.999121, -Double
0.0257505, Double
0.0,
    -Double
0.592616, -Double
0.482475, -Double
0.644999, Double
0.0,
    Double
0.539471, Double
0.631024, -Double
0.557476, Double
0.0,
    Double
0.655851, -Double
0.027319, -Double
0.754396, Double
0.0,
    Double
0.274465, Double
0.887659, Double
0.369772, Double
0.0,
    -Double
0.123419, Double
0.975177, -Double
0.183842, Double
0.0,
    -Double
0.223429, Double
0.708045, Double
0.66989, Double
0.0,
    -Double
0.908654, Double
0.196302, Double
0.368528, Double
0.0,
    -Double
0.95759, -Double
0.00863708, Double
0.288005, Double
0.0,
    Double
0.960535, Double
0.030592, Double
0.276472, Double
0.0,
    -Double
0.413146, Double
0.907537, Double
0.0754161, Double
0.0,
    -Double
0.847992, Double
0.350849, -Double
0.397259, Double
0.0,
    Double
0.614736, Double
0.395841, Double
0.68221, Double
0.0,
    -Double
0.503504, -Double
0.666128, -Double
0.550234, Double
0.0,
    -Double
0.268833, -Double
0.738524, -Double
0.618314, Double
0.0,
    Double
0.792737, -Double
0.60001, -Double
0.107502, Double
0.0,
    -Double
0.637582, Double
0.508144, -Double
0.579032, Double
0.0,
    Double
0.750105, Double
0.282165, -Double
0.598101, Double
0.0,
    -Double
0.351199, -Double
0.392294, -Double
0.850155, Double
0.0,
    Double
0.250126, -Double
0.960993, -Double
0.118025, Double
0.0,
    -Double
0.732341, Double
0.680909, -Double
0.0063274, Double
0.0,
    -Double
0.760674, -Double
0.141009, Double
0.633634, Double
0.0,
    Double
0.222823, -Double
0.304012, Double
0.926243, Double
0.0,
    Double
0.209178, Double
0.505671, Double
0.836984, Double
0.0,
    Double
0.757914, -Double
0.56629, -Double
0.323857, Double
0.0,
    -Double
0.782926, -Double
0.339196, Double
0.52151, Double
0.0,
    -Double
0.462952, Double
0.585565, Double
0.665424, Double
0.0,
    Double
0.61879, Double
0.194119, -Double
0.761194, Double
0.0,
    Double
0.741388, -Double
0.276743, Double
0.611357, Double
0.0,
    Double
0.707571, Double
0.702621, Double
0.0752872, Double
0.0,
    Double
0.156562, Double
0.819977, Double
0.550569, Double
0.0,
    -Double
0.793606, Double
0.440216, Double
0.42, Double
0.0,
    Double
0.234547, Double
0.885309, -Double
0.401517, Double
0.0,
    Double
0.132598, Double
0.80115, -Double
0.58359, Double
0.0,
    -Double
0.377899, -Double
0.639179, Double
0.669808, Double
0.0,
    -Double
0.865993, -Double
0.396465, Double
0.304748, Double
0.0,
    -Double
0.624815, -Double
0.44283, Double
0.643046, Double
0.0,
    -Double
0.485705, Double
0.825614, -Double
0.287146, Double
0.0,
    -Double
0.971788, Double
0.175535, Double
0.157529, Double
0.0,
    -Double
0.456027, Double
0.392629, Double
0.798675, Double
0.0,
    -Double
0.0104443, Double
0.521623, -Double
0.853112, Double
0.0,
    -Double
0.660575, -Double
0.74519, Double
0.091282, Double
0.0,
    -Double
0.0157698, -Double
0.307475, -Double
0.951425, Double
0.0,
    -Double
0.603467, -Double
0.250192, Double
0.757121, Double
0.0,
    Double
0.506876, Double
0.25006, Double
0.824952, Double
0.0,
    Double
0.255404, Double
0.966794, Double
0.00884498, Double
0.0,
    Double
0.466764, -Double
0.874228, -Double
0.133625, Double
0.0,
    Double
0.475077, -Double
0.0682351, -Double
0.877295, Double
0.0,
    -Double
0.224967, -Double
0.938972, -Double
0.260233, Double
0.0,
    -Double
0.377929, -Double
0.814757, -Double
0.439705, Double
0.0,
    -Double
0.305847, Double
0.542333, -Double
0.782517, Double
0.0,
    Double
0.26658, -Double
0.902905, -Double
0.337191, Double
0.0,
    Double
0.0275773, Double
0.322158, -Double
0.946284, Double
0.0,
    Double
0.0185422, Double
0.716349, Double
0.697496, Double
0.0,
    -Double
0.20483, Double
0.978416, Double
0.0273371, Double
0.0,
    -Double
0.898276, Double
0.373969, Double
0.230752, Double
0.0,
    -Double
0.00909378, Double
0.546594, Double
0.837349, Double
0.0,
    Double
0.6602, -Double
0.751089, Double
0.000959236, Double
0.0,
    Double
0.855301, -Double
0.303056, Double
0.420259, Double
0.0,
    Double
0.797138, Double
0.0623013, -Double
0.600574, Double
0.0,
    Double
0.48947, -Double
0.866813, Double
0.0951509, Double
0.0,
    Double
0.251142, Double
0.674531, Double
0.694216, Double
0.0,
    -Double
0.578422, -Double
0.737373, -Double
0.348867, Double
0.0,
    -Double
0.254689, -Double
0.514807, Double
0.818601, Double
0.0,
    Double
0.374972, Double
0.761612, Double
0.528529, Double
0.0,
    Double
0.640303, -Double
0.734271, -Double
0.225517, Double
0.0,
    -Double
0.638076, Double
0.285527, Double
0.715075, Double
0.0,
    Double
0.772956, -Double
0.15984, -Double
0.613995, Double
0.0,
    Double
0.798217, -Double
0.590628, Double
0.118356, Double
0.0,
    -Double
0.986276, -Double
0.0578337, -Double
0.154644, Double
0.0,
    -Double
0.312988, -Double
0.94549, Double
0.0899272, Double
0.0,
    -Double
0.497338, Double
0.178325, Double
0.849032, Double
0.0,
    -Double
0.101136, -Double
0.981014, Double
0.165477, Double
0.0,
    -Double
0.521688, Double
0.0553434, -Double
0.851339, Double
0.0,
    -Double
0.786182, -Double
0.583814, Double
0.202678, Double
0.0,
    -Double
0.565191, Double
0.821858, -Double
0.0714658, Double
0.0,
    Double
0.437895, Double
0.152598, -Double
0.885981, Double
0.0,
    -Double
0.92394, Double
0.353436, -Double
0.14635, Double
0.0,
    Double
0.212189, -Double
0.815162, -Double
0.538969, Double
0.0,
    -Double
0.859262, Double
0.143405, -Double
0.491024, Double
0.0,
    Double
0.991353, Double
0.112814, Double
0.0670273, Double
0.0,
    Double
0.0337884, -Double
0.979891, -Double
0.196654, Double
0.0]