/
simplex.py
95 lines (86 loc) · 2.68 KB
/
simplex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Python implementation of simplex noise, based on this implementation:
# https://github.com/SRombauts/SimplexNoise/blob/master/references/SimplexNoise.java
# Original code by Stefan Gustavson
# Port by Adrian Cheater (c 2021)
# This code is licened LGPL
from math import *;
p = [151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]
perm = p*2;
permMod12 = [i % 12 for i in perm]
F2 = 0.5*(sqrt(3.0)-1.0)
G2 = (3.0-sqrt(3.0))/6.0
F3 = 1.0/3.0
G3 = 1.0/6.0
F4 = (sqrt(5.0)-1.0)/4.0
G4 = (5.0-sqrt(5.0))/20.0
class Grad:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
grad3 = [Grad(1,1,0),Grad(-1,1,0),Grad(1,-1,0),Grad(-1,-1,0),
Grad(1,0,1),Grad(-1,0,1),Grad(1,0,-1),Grad(-1,0,-1),
Grad(0,1,1),Grad(0,-1,1),Grad(0,1,-1),Grad(0,-1,-1)]
def dot( g, x, y ):
return g.x*x + g.y*y
def fastfloor(x):
xi = int(x)
if x<xi:
return xi-1
else:
return xi
def noise(xin, yin):
s = (xin+yin)*F2
i = fastfloor(xin+s)
j = fastfloor(yin+s)
t = (i+j)*G2
X0 = i-t
Y0 = j-t
x0 = xin-X0
y0 = yin-Y0
if(x0>y0):
i1=1
j1=0
else:
i1=0
j1=1
x1 = x0 - i1 + G2
y1 = y0 - j1 + G2
x2 = x0 - 1.0 + 2.0 * G2
y2 = y0 - 1.0 + 2.0 * G2
ii = i & 255;
jj = j & 255;
gi0 = permMod12[ii+perm[jj]];
gi1 = permMod12[ii+i1+perm[jj+j1]];
gi2 = permMod12[ii+1+perm[jj+1]];
t0 = 0.5 - x0*x0-y0*y0
if(t0<0):
n0 = 0.0;
else:
t0 *= t0
n0 = t0 * t0 * dot(grad3[gi0], x0, y0)
t1 = 0.5 - x1*x1-y1*y1
if(t1<0):
n1 = 0.0
else:
t1 *= t1
n1 = t1 * t1 * dot(grad3[gi1], x1, y1)
t2 = 0.5 - x2*x2-y2*y2
if(t2<0):
n2 = 0.0
else:
t2 *= t2
n2 = t2 * t2 * dot(grad3[gi2], x2, y2)
return 70.0 * (n0 + n1 + n2)