Awesome Open Source
Awesome Open Source

# SNEK-A System for Making Generative Systems

This library is specifically written to be useful for a broad range of ways in which I create art using various generative algorithms.

In short snek is four things:

1. A simple (graph) data structure for working with vertices and edges The structure is named snek; the name is explained below. This structure is combined with a programming pattern for applying changes to the structure. The pattern relies on alterations, see below.

2. A series of useful data structures and tools. E.g. a 2D vector vec, a package for generating different kinds of random numbers: rnd, as well as tools for handling colors (pigment), splines (bzspl), and various vector an path functionality (math, lin-path).

3. A tool for drawing things called sandpaint. sandpaint uses random sampling to draw its primitives. This creates a fairly distinct and gritty look in many cases.

4. A tool for drawing svg files (draw-svg). Mainly svg files that are good for plotting.

A while back someone on Twitter suggested that if Python 3 was named "snek" it would avoid naming confusion. I found that amusing at the time, and picked snek as the placeholder name for this project. I've been looking for a better name, but I haven't found one yet.

## Alterations

The pattern depends on the concept of alterations. In short: an alteration is a change that will be applied to the structure at the end of a given context. alterations are further described in https://inconvergent.net/2017/snek-is-not-an-acronym/.

I have also written about things related to snek at

Here is and example of manipulating a snek instance called snk using alterations. Alteration constructors are postfixed with ?.

; context start
(snek:with (snk)
; iterate vertices
(snek:itr-verts (snk v)
; move alteration
(snek:move-vert? v (rnd:in-circ 1d0))
; w will be an arbitrary
; vertex in snk
(snek:with-rnd-vert (snk w)
; join v and w if they are closer than d
(if (< (snek:edge-length snk v w) d)
; join vertices alteration
; context end
; alterations have been applied

You can also manipulate the state directly. These functions are postfixed with !. Eg. (snek:move-vert! ...).

## Examples

There are some examples included. All examples are in the examples folder.

If you don't provide a filename (with full or relative path) as the first argument, the resulting file will be named ./tmp.png.

### Custom alterations

You can define your own arbitrary alterations. There is an example of this in ex/custom-alt.lisp. I have also written about it here: https://inconvergent.net/2017/arbitrary-alterations/

## Usage

I use snek for most of the work that I post online (https://twitter.com/inconvergent). Both for generating raster images as well as vector images for plotter drawings.

Here are some plotted examples:

## Dependencies

This code requires libpng-dev, Quicklisp, zpng, cl-svg and cl-png. The path to quicklisp must be set in src/load. zpng, cl-svg and cl-png are automatically installed via quicklisp.

## Tests

There are some tests included, see the test folder.

## Stability, Changes and Versioning

This code is highly experimental on my part. It is likely to change with no warning or explanation. I will keep a note of the version number in src/load.lisp.

## Thanks

I would like to thank:

Who have provided me with useful hints and code feedback.

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
common-lisp (377
lisp (123
art (108
procedural-generation (87
generative-art (63
procedural (47
experimental (44
generative (28