genartlib
A Clojure library with simple utilities for creating generative artwork.
This library is built around Quil, a Clojure wrapper around the Processing framework. However, most of the functions are just mathematical utilies that could be used idependently.
To see and read about my artwork, visit tylerxhobbs.com or follow me on Instagram or Twitter.
Usage
To install, add this to your dependencies in project.clj
:
[genartlib "1.1.1"]
Dependencies
This version of genartlib is compatible with Processing 4.x and Quil 4.x. It has been tested with JDK 21.
The previous 0.x versions of genartlib were compatible with Processing/Quil 3.x and JDK 1.8.
Contents
View the API Docs.
The genartlib library has the following tools:
Project Template
Under project-template/, you'll find the basic setup that I use for every new generative art project. This is geared towards creating static images.
genartlib.algebra
The following algebra-ish functions are defined:
avg
- averageinterpolate
/interpolate-multi
- linear interpolationrescale
- map from one range to anotherline-intersection
- find the intersection of two lineslines-intersection-point
- another way to find line intersectionsslope
/point-slope
- get the slope of a liney-intercept
- get the y intercept point of a lineangle
/point-angle
- get the angle between two points in radiansangular-coords
- calculate the offset location from a base point with angle and magnitudepoint-dist
- distance between two pointspoint-to-line-dist
- distance from a point to a line
genartlib.geometry
polygon-contains-point?
- a fast test for checking if a point falls inside a polygonrotate-polygon
- rotates around the average center of the polyshrink-polygon
- shrink by a ratio
genartlib.curves
chaikin-curve
- a curve-smoothing algorithmchaikin-curve-retain-ends
- a variation that preserves the original end pointscurve-length
- calculate the total length of a curvesplit-curve-with-step
- break up a curve into chunks with the given lengthsplit-curve-into-parts
- break up a curve into chunks with equal length, given a number of parts to haveinterpolate-curve
- find a point that is a given percentage along the length of a curveline-simplification
- an implementation of the Ramer-Douglas-Peucker line simplification algorithmtrim-curve-to-bounds
- returns a seq of sub-curves that are entirely within the bounds of the imagetrim-curve-start
- removes the specified length from the start of a curvetrim-curve-end
- removes the specified length from the end of a curve
genartlib.random
gauss
- sample a gaussian probability distributionabs-gauss
- basically shorthand for(abs (gauss ....))
gauss-range
- returns a seq of integers from zero to a value sampled from a Guassian distributiontriangular
- sample a triangular probability distributionsimple-triangular
- liketriangular
, but assumes a = 0 and b = cpareto-sampler
/pareto-sample
- sample a pareto probability distributionrandom-point-in-circle
- uniform sampling of points within a circleodds
- returns true or false with the given probabilitychoice
- pick from a list of items with uniform probabilityweighted-choice
- pick from a list of items, each with an assigned probabilityrepeatable-shuffle
- a version of shuffle that uses Processing's Random, in order to ensure repeatability with the same seedlimited-shuffle
- performsn
swaps on a seq in order to partially shuffle it
genartlib.plotter
sort-curves-for-plotting
- sorts a seq of curves in order to minimize plotter travel distance
genartlib.poisson-disc
poisson-disc-sample
- generate a seq of points from a Poisson disc set with a guaranteed minimum spacing
Capture
This namespace contains a set of macros that are useful for capturing draw operations in a sketch, and recording them (or translating) them to another format, such as an SVG that is suitable for plotting. The nice part is that the sketch will still function as normal.
with-plotter-svg-capture
- create an svg file representing all line and shape operations that is suitable for plotting with an Axidraw. Note that Processing functions other than these two (e.g. ellipse, or bezier curves, or transformations) are not yet supported and are ignored.with-command-capture
- captures many draw operations in an EDN format that is easy to manipulate with Clojurecommand-replay
/command-replay-file
- replays the results ofwith-command-capture
Utils
w
andh
- shorthand for expressing a length or position in terms of percentage of the image width or height - good for using a pseudo-vector approach to creating imagespi
- shorthand for(* Math.PI value)
set-color-mode
- set the color mode to HSV with ranges H [0, 360], S [0.0, 100.0], V [0.0, 100.0], alpha [0.0, 1.0]in?
/not-in?
- test if a seq contains an itembetween?
- is a value inside an inclusive range?enumerate
- turns a seq of items into a seq like ([0 item-0] [1 item-1] [2 item-2] ...)zip
- combine two or more seqs into tuplessnap-to
- snap a value to a given window size, kind of like configurable roundingvec-remove
- remove an item from a vectordistinct-key
- given a function f to uniquely identify items, extracts all of the distinct values in a collection
License
Copyright © Tyler Hobbs
Distributed under the MIT License.