An open API service indexing awesome lists of open source software.

https://github.com/inconvergent/snek

See https://github.com/inconvergent/weir instead
https://github.com/inconvergent/snek

art common-lisp experimental generative generative-art lisp procedural procedural-generation procgen

Last synced: about 1 month ago
JSON representation

See https://github.com/inconvergent/weir instead

Awesome Lists containing this project

README

        

# SNEK-A System for Making Generative Systems

## About

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

![head](img/cells.lisp.png?raw=true "ex")

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.

![head](img/spline-script.lisp.png?raw=true "ex")

### About the Name

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

- https://inconvergent.net/2017/a-propensity-for-mistakes/ (indirectly about
`snek`)
- https://inconvergent.net/2017/a-method-for-mistakes/
- https://inconvergent.net/2017/arbitrary-alterations/
- https://inconvergent.net/2017/grains-of-sand/

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

```lisp
; 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
(snek:add-edge? v w))))
; 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.

![lines](img/lines.lisp.png?raw=true "ex")

![lines](img/grid-bz-walk.lisp.png?raw=true "ex")

Here are some plotted examples:

- https://inconvergent.net/2017/spline-script-plots/
- https://inconvergent.net/mechanical-plotter-drawings/
- https://inconvergent.net/mechanical-plotter-drawings/3/
- https://inconvergent.net/mechanical-plotter-drawings/5/

## 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`.

- https://www.quicklisp.org/beta/
- http://www.xach.com/lisp/zpng/

## 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:

- https://twitter.com/RainerJoswig
- https://twitter.com/paulg
- https://twitter.com/jackrusher

Who have provided me with useful hints and code feedback.