Skip to main content

OpenSimplex n-dimensional gradient noise function.

## Project description

OpenSimplex noise is an n-dimensional gradient noise function that was developed in order to overcome the patent-related issues surrounding Simplex noise, while continuing to also avoid the visually-significant directional artifacts characteristic of Perlin noise.

This is merely a python port of Kurt Spencer’s original code, released to the public domain, and neatly wrapped up in a package.

## USAGE

### Initialization:

>>> from opensimplex import OpenSimplex
>>> tmp = OpenSimplex()
>>> print (tmp.noise2d(x=10, y=10))
0.732051569572


Optionally, the class accepts a seed value:

>>> tmp = OpenSimplex(seed=1)
>>> print (tmp.noise2d(x=10, y=10))
-0.4790979022623557


The seed must be a valid python number. It’s used internally to generate some permutation arrays, which is used for the noise generation.

If it isn’t provided the class will default to use 0 as the seed.

### Available class methods:

OpenSimplex.noise2d(x, y)

Generate 2D OpenSimplex noise from X,Y coordinates.

OpenSimplex.noise3d(x, y, z)

Generate 3D OpenSimplex noise from X,Y,Z coordinates.

OpenSimplex.noise4d(x, y, z, w)

Generate 4D OpenSimplex noise from X,Y,Z,W coordinates.

## FAQ

• Is this relevantly different enough to avoid any real trouble with the original patent?

If you read the patent claims:

Claim #1 talks about the hardware-implementation-optimized gradient generator. Most software implementations of Simplex Noise don’t use this anyway, and OpenSimplex Noise certainly doesn’t.

Claim #2(&3&4) talk about using (x’,y’,z’)=(x+s,y+s,z+s) where s=(x+y+z)/3 to transform the input (render space) coordinate onto a simplical grid, with the intention to make all of the “scissor-simplices” approximately regular. OpenSimplex Noise (in 3D) uses s=-(x+y+z)/6 to transform the input point to a point on the Simplectic honeycomb lattice so that the simplices bounding the (hyper)cubes at (0,0,..,0) and (1,1,…,1) work out to be regular. It then mathematically works out that s=(x+y+z)/3 is needed for the inverse transform, but that’s performing a different (and opposite) function.

Claim #5(&6) are specific to the scissor-simplex lattice. Simplex Noise divides the (squashed) n-dimensional (hyper)cube into n! simplices based on ordered edge traversals, whereas OpenSimplex Noise divides the (stretched) n-dimensional (hyper)cube into n polytopes (simplices, rectified simplices, birectified simplices, etc.) based on the separation (hyper)planes at integer values of (x’+y’+z’+…).

Another interesting point is that, if you read all of the claims, none of them appear to apply to the 2D analogue of Simplex noise so long as it uses a gradient generator separate from the one described in claim #1. The skew function in Claim #2 only applies to 3D, and #5 explicitly refers to n>=3.

And none of the patent claims speak about using surflets / “spherically symmetric kernels” to generate the “images with texture that do not have visible grid artifacts,” which is probably the biggest similarity between the two algorithms.

## CREDITS

• Kurt Spencer - Original work

• A Svensson - Python port and package author

## LICENSE

While the original work was released to the public domain by Kurt, this package is using the MIT license. Please see the file LICENSE for details.

## Expected Output

2D noise (with default seed):

3D noise:

4D noise:

## Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

### Source Distribution

opensimplex-0.1.tar.gz (12.8 kB view hashes)

Uploaded source