{-# LANGUAGE Strict #-}
module Numeric.Noise.SuperSimplex (
noise2,
noise2Base,
) where
import Data.Bits
import Numeric.Noise.Internal
import Numeric.Noise.Internal.Math
noise2 :: (RealFrac a) => Noise2 a
noise2 :: forall a. RealFrac a => Noise2 a
noise2 = (Seed -> a -> a -> a) -> Noise2 a
forall a. (Seed -> a -> a -> a) -> Noise2 a
Noise2 Seed -> a -> a -> a
forall a. RealFrac a => Seed -> a -> a -> a
noise2Base
{-# INLINE noise2 #-}
noise2Base :: (RealFrac a) => Seed -> a -> a -> a
noise2Base :: forall a. RealFrac a => Seed -> a -> a -> a
noise2Base Seed
seed a
xo a
yo =
let f2 :: a
f2 = a
0.5 a -> a -> a
forall a. Num a => a -> a -> a
* (a
forall a. Fractional a => a
sqrt3 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
to :: a
to = (a
xo a -> a -> a
forall a. Num a => a -> a -> a
+ a
yo) a -> a -> a
forall a. Num a => a -> a -> a
* a
f2
x :: a
x = a
xo a -> a -> a
forall a. Num a => a -> a -> a
+ a
to
y :: a
y = a
yo a -> a -> a
forall a. Num a => a -> a -> a
+ a
to
fx :: Hash
fx = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
x
fy :: Hash
fy = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
y
xi :: a
xi = a
x a -> a -> a
forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral @Hash Hash
fx
yi :: a
yi = a
y a -> a -> a
forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral @Hash Hash
fy
i :: Hash
i = Hash
fx Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeX
j :: Hash
j = Hash
fy Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeY
i1 :: Hash
i1 = Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX
j1 :: Hash
j1 = Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY
t :: a
t = (a
xi a -> a -> a
forall a. Num a => a -> a -> a
+ a
yi) a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2
x0 :: a
x0 = a
xi a -> a -> a
forall a. Num a => a -> a -> a
- a
t
y0 :: a
y0 = a
yi a -> a -> a
forall a. Num a => a -> a -> a
- a
t
a0 :: a
a0 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x0 a -> a -> a
forall a. Num a => a -> a -> a
* a
x0 a -> a -> a
forall a. Num a => a -> a -> a
- a
y0 a -> a -> a
forall a. Num a => a -> a -> a
* a
y0
v0 :: a
v0 = (a
a0 a -> a -> a
forall a. Num a => a -> a -> a
* a
a0) a -> a -> a
forall a. Num a => a -> a -> a
* (a
a0 a -> a -> a
forall a. Num a => a -> a -> a
* a
a0) a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
i Hash
j a
x0 a
y0
v1 :: a
v1 =
let g2t :: a
g2t = a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2
a1 :: a
a1 =
(a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
g2t a -> a -> a
forall a. Num a => a -> a -> a
* (a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
2)) a -> a -> a
forall a. Num a => a -> a -> a
* a
t
a -> a -> a
forall a. Num a => a -> a -> a
+ ((-a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
g2t a -> a -> a
forall a. Num a => a -> a -> a
* a
g2t) a -> a -> a
forall a. Num a => a -> a -> a
+ a
a0)
x1 :: a
x1 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
- a
g2t
y1 :: a
y1 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
- a
g2t
in (a
a1 a -> a -> a
forall a. Num a => a -> a -> a
* a
a1) a -> a -> a
forall a. Num a => a -> a -> a
* (a
a1 a -> a -> a
forall a. Num a => a -> a -> a
* a
a1) a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
i1 Hash
j1 a
x1 a
y1
xmyi :: a
xmyi = a
xi a -> a -> a
forall a. Num a => a -> a -> a
- a
yi
~a
vgx
| a
xi a -> a -> a
forall a. Num a => a -> a -> a
+ a
xmyi a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
1 =
let ~a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
3 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
2)
~a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
3 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
a2 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x2 a -> a -> a
forall a. Num a => a -> a -> a
* a
x2 a -> a -> a
forall a. Num a => a -> a -> a
- a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a
y2
in if a
a2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed (Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeX Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)) (Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY) a
x2 a
y2
else a
0
| Bool
otherwise =
let ~a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
forall a. Fractional a => a
g2
~a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
a2 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x2 a -> a -> a
forall a. Num a => a -> a -> a
* a
x2 a -> a -> a
forall a. Num a => a -> a -> a
- a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a
y2
in if a
a2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
i (Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY) a
x2 a
y2
else a
0
~a
vgy
| a
yi a -> a -> a
forall a. Num a => a -> a -> a
- a
xmyi a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
1 =
let ~a
x3 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
3 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
y3 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
3 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
2)
~a
a3 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x3 a -> a -> a
forall a. Num a => a -> a -> a
* a
x3 a -> a -> a
forall a. Num a => a -> a -> a
- a
y3 a -> a -> a
forall a. Num a => a -> a -> a
* a
y3
in if a
a3 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a3 a -> a -> a
forall a. Num a => a -> a -> a
* a
a3)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a3 a -> a -> a
forall a. Num a => a -> a -> a
* a
a3)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed (Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX) (Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeY Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)) a
x3 a
y3
else a
0
| Bool
otherwise =
let ~a
x3 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
y3 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
forall a. Fractional a => a
g2
~a
a3 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x3 a -> a -> a
forall a. Num a => a -> a -> a
* a
x3 a -> a -> a
forall a. Num a => a -> a -> a
- a
y3 a -> a -> a
forall a. Num a => a -> a -> a
* a
y3
in if a
a3 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a3 a -> a -> a
forall a. Num a => a -> a -> a
* a
a3)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a3 a -> a -> a
forall a. Num a => a -> a -> a
* a
a3)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed (Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX) Hash
j a
x3 a
y3
else a
0
~a
vlx
| a
xi a -> a -> a
forall a. Num a => a -> a -> a
+ a
xmyi a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0 =
let ~a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
forall a. Fractional a => a
g2)
~a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
- a
forall a. Fractional a => a
g2
~a
a2 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x2 a -> a -> a
forall a. Num a => a -> a -> a
* a
x2 a -> a -> a
forall a. Num a => a -> a -> a
- a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a
y2
in if a
a2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed (Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeX) Hash
j a
x2 a
y2
else a
0
| Bool
otherwise =
let ~a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
forall a. Fractional a => a
g2
~a
a2 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x2 a -> a -> a
forall a. Num a => a -> a -> a
* a
x2 a -> a -> a
forall a. Num a => a -> a -> a
- a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a
y2
in if a
a2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed (Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX) Hash
j a
x2 a
y2
else a
0
~a
vly
| a
yi a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
xmyi =
let ~a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
- a
forall a. Fractional a => a
g2
~a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
- (a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
a2 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x2 a -> a -> a
forall a. Num a => a -> a -> a
* a
x2 a -> a -> a
forall a. Num a => a -> a -> a
- a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a
y2
in if a
a2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
i (Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeY) a
x2 a
y2
else a
0
| Bool
otherwise =
let ~a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
forall a. Fractional a => a
g2
~a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
~a
a2 = (a
2 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
3) a -> a -> a
forall a. Num a => a -> a -> a
- a
x2 a -> a -> a
forall a. Num a => a -> a -> a
* a
x2 a -> a -> a
forall a. Num a => a -> a -> a
- a
y2 a -> a -> a
forall a. Num a => a -> a -> a
* a
y2
in if a
a2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0
then
(a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* (a
a2 a -> a -> a
forall a. Num a => a -> a -> a
* a
a2)
a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
i (Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY) a
x2 a
y2
else a
0
v2 :: a
v2
| a
t a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
forall a. Fractional a => a
g2 = a
vgx a -> a -> a
forall a. Num a => a -> a -> a
+ a
vgy
| Bool
otherwise = a
vlx a -> a -> a
forall a. Num a => a -> a -> a
+ a
vly
in (a
v0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
v1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
v2) a -> a -> a
forall a. Num a => a -> a -> a
* a
18.24196194486065
{-# INLINE noise2Base #-}