Skip to main content
https://img.shields.io/pypi/v/opensimplex-loops https://img.shields.io/pypi/pyversions/opensimplex-loops https://img.shields.io/badge/code%20style-black-000000.svg https://img.shields.io/badge/License-MIT-purple.svg https://zenodo.org/badge/DOI/10.5281/zenodo.13304280.svg

OpenSimplex Loops

This library provides higher-level functions that can generate seamlessly-looping animated images and closed curves, and seamlessy-tileable images. It relies on 4D OpenSimplex noise, which is a type of gradient noise that features spatial coherence.

This library is an extension to the OpenSimplex Python library by lmas.

Inspiration taken from Coding Challenge #137: 4D OpenSimplex Noise Loop by The Coding Train.

Demos

looping_animated_2D_image()

looping_animated_2D_image

Seamlessly-looping animated 2D images.

Code: demos/demo_looping_animated_2D_image.py

looping_animated_closed_1D_curve()

looping_animated_circle looping_animated_closed_1D_curve

Seamlessly-looping animated 1D curves, each curve in turn also closing up seamlessly back-to-front.

Code: demos/demo_looping_animated_circle.py

Code: demos/demo_looping_animated_closed_1D_curve.py

tileable_2D_image()

tileable_2D_image

Seamlessly-tileable 2D image.

Code: demos/demo_tileable_2D_image.py

Installation

pip install opensimplex-loops

This will install the following dependencies:

  • opensimplex

  • numpy

  • numba

  • numba-progress

Notes:

  • The OpenSimplex library by lmas does not enforce the use of the numba package, but is left optional instead. Here, I have set it as a requirement due to the heavy computation required by these highler-level functions. I have them optimized for numba which enables multi-core parallel processing within Python, resulting in major speed improvements compared to as running without. I have gotten computational speedups by a factor of ~200.

  • Note that the very first call of each of these OpenSimplex functions will take a longer time than later calls. This is because numba needs to compile this Python code to bytecode specific to your platform, once.

  • The numba-progress package is actually optional. When present, a progress bar will be shown during the noise generation.

API

looping_animated_2D_image(...)

Generates a stack of seamlessly-looping animated 2D raster images drawn from 4D OpenSimplex noise.

The first two OpenSimplex dimensions are used to describe a plane that gets projected onto a 2D raster image. The last two dimensions are used to describe a circle in time.

Args:
N_frames (int, default = 200)

Number of time frames

N_pixels_x (int, default = 1000)

Number of pixels on the x-axis

N_pixels_y (int | None, default = None)

Number of pixels on the y-axis. When set to None N_pixels_y will be set equal to N_pixels_x.

t_step (float, default = 0.1)

Time step

x_step (float, default = 0.01)

Spatial step in the x-direction

y_step (float | None, default = None)

Spatial step in the y-direction. When set to None y_step will be set equal to x_step.

dtype (type, default = numpy.double)

Return type of the noise array elements. To reduce the memory footprint one can change from the default numpy.double to e.g. numpy.float32.

seed (int, default = 3)

Seed value for the OpenSimplex noise

verbose (bool, default = True)

Print ‘Generating noise…’ to the terminal? If the numba_progress package is present a progress bar will also be shown.

Returns:

The 2D image stack as 3D array [time, y-pixel, x-pixel] containing the OpenSimplex noise values as floating points. The output is garantueed to be in the range [-1, 1], but the exact extrema cannot be known a-priori and are probably quite smaller than [-1, 1].

looping_animated_closed_1D_curve(...)

Generates a stack of seamlessly-looping animated 1D curves, each curve in turn also closing up seamlessly back-to-front, drawn from 4D OpenSimplex noise.

The first two OpenSimplex dimensions are used to describe a circle that gets projected onto a 1D curve. The last two dimensions are used to describe a circle in time.

Args:
N_frames (int, default = 200)

Number of time frames

N_pixels_x (int, default = 1000)

Number of pixels of the curve

t_step (float, default = 0.1)

Time step

x_step (float, default = 0.01)

Spatial step in the x-direction

dtype (type, default = numpy.double)

Return type of the noise array elements. To reduce the memory footprint one can change from the default numpy.double to e.g. numpy.float32.

seed (int, default = 3)

Seed value for the OpenSimplex noise

verbose (bool, default = True)

Print ‘Generating noise…’ to the terminal? If the numba_progress package is present a progress bar will also be shown.

Returns:

The 1D curve stack as 2D array [time, x-pixel] containing the OpenSimplex noise values as floating points. The output is garantueed to be in the range [-1, 1], but the exact extrema cannot be known a-priori and are probably quite smaller than [-1, 1].

tileable_2D_image(...)

Generates a seamlessly-tileable 2D raster image drawn from 4D OpenSimplex noise.

The first two OpenSimplex dimensions are used to describe a circle that gets projected onto the x-axis of the 2D raster image. The last two dimensions are used to describe another circle that gets projected onto the y-axis of the 2D raster image.

Args:
N_pixels_x (int, default = 1000)

Number of pixels on the x-axis

N_pixels_y (int | None, default = None)

Number of pixels on the y-axis. When set to None N_pixels_y will be set equal to N_pixels_x.

x_step (float, default = 0.01)

Spatial step in the x-direction

y_step (float | None, default = None)

Spatial step in the y-direction. When set to None y_step will be set equal to x_step.

dtype (type, default = numpy.double)

Return type of the noise array elements. To reduce the memory footprint one can change from the default numpy.double to e.g. numpy.float32.

seed (int, default = 3)

Seed value for the OpenSimplex noise

verbose (bool, default = True)

Print ‘Generating noise…’ to the terminal? If the numba_progress package is present a progress bar will also be shown.

Returns:

The 2D image as 2D array [y-pixel, x-pixel] containing the OpenSimplex noise values as floating points. The output is garantueed to be in the range [-1, 1], but the exact extrema cannot be known a-priori and are probably quite smaller than [-1, 1].

Changelog

1.0.1 (2024-08-12)

  • Obtained a DOI from Zenodo

1.0.0 (2023-08-27)

  • Stable release

  • Added looping animated circle demo

0.1.3 (2023-01-27)

  • Fixed wrong docstr description on the return value of tileable_2D_image()

  • Generalized the internal functions

0.1.2 (2023-01-26)

  • Using raw.githubusercontent.com for the images in README to show up in PyPi

0.1.0 (2023-01-26)

  • First release on PyPI

Download files

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

Source Distribution

opensimplex_loops-1.0.1.tar.gz (3.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opensimplex_loops-1.0.1-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file opensimplex_loops-1.0.1.tar.gz.

File metadata

  • Download URL: opensimplex_loops-1.0.1.tar.gz
  • Upload date:
  • Size: 3.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for opensimplex_loops-1.0.1.tar.gz
Algorithm Hash digest
SHA256 70f49e79c2f1ac9451118f6145d01f340ea83137bfbec1ae29b800d036fc2801
MD5 bd73afe2dce998d6823a4ca4e4288f14
BLAKE2b-256 d0d21a31e2cccfbe6c57ae70e8aa30b8c6a4fb6c69adc02a59e707960d1c1662

See more details on using hashes here.

File details

Details for the file opensimplex_loops-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for opensimplex_loops-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 955e23ffde0933ff977b8f41219c97d6b0015dba390c4b970ecf9c011dc7925c
MD5 d5419bf060ca78df0e3df902c8eb2a05
BLAKE2b-256 104ee8981e0d8bf49ae1f06ba7b5d1611c7e58facb2143b2a658bdce0f9dde87

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 files

1.0.0

2 files

0.1.3

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page