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
- Host: GitHub
- URL: https://github.com/inconvergent/snek
- Owner: inconvergent
- License: other
- Archived: true
- Created: 2017-03-21T19:48:08.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-11-15T22:12:47.000Z (over 6 years ago)
- Last Synced: 2024-10-28T06:00:03.204Z (6 months ago)
- Topics: art, common-lisp, experimental, generative, generative-art, lisp, procedural, procedural-generation, procgen
- Language: Common Lisp
- Homepage:
- Size: 22 MB
- Stars: 742
- Watchers: 30
- Forks: 47
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
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.
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.
### 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.

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/jackrusherWho have provided me with useful hints and code feedback.