# SNEK is Not an Acronym

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

## About

`snek` is a simple data structure for working with vertices and edges. More
importantly it is a programming pattern for applying changes to the structure.
It is specifically written to be useful for a broad range of ways in which i
usually write generative algorithms for creating art.

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
http://inconvergent.net/snek-is-not-an-acronym/.

Here is and example of manipulating a `snek` instance called `snk` using
`alterations`:

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

There are two more examples. They can be executed like this:

    ./run-slope.lisp res/slop.png
    ./run-lines.lisp res/lines.png

Notice that the resulting image will end up in `res`.

`snek` is used in

  - http://moment.inconvergent.net/
  - https://twitter.com/sandpaintbot
  - https://twitter.com/scratchpaintbot

## Dependencies

This code requires `Quicklisp` and `zpng`. Note that the The path to quicklisp
must be set in `src/load`. `zpng` is automatically installed via `quicklisp`.

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


## Run tests

There are some tests included. Run them like this:

    ./run-test.lisp


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


## On Use and Contributions

This code is a tool that I have written for my own use. I release it publicly
in case people find it useful. It is not however intended as a
collaboration/Open Source project. As such I am unlikely to accept PRs, reply
to issues, or take requests.


## Todo

 - Randomized order of alteration apply
 - Maintain list of singly-connected vertices?
 - zonemaps? kd-tree?


## Done

 - Reject/attract force move alterations, or force calc funcs? (sort of)

