Starting Steps of Generative Art

29 Dec, 2019 - 3 minutes


Matthew Deig

Why this road

I got inspire by my visit up to the Vintage Computer Festival Midwest with their talk on the computer that made the Death Star plans graphics. Then later on this year I saw this post Functional Christmas Article on Generative Art and I recently was picking up Clojure and was thinking that I could use this to do something like I saw at the Festival. Turns out it wasn’t too bad to try to get something like it, because I found this video of retro computer graphics so I dug in.

First Attempt

I started out doing circles to get some polar coordinates down and some other functions but I ended up switching to lines and came up with this

Unfortunately I don’t have the code that made that video.

My other experiments

A few more of my experiments.

My Final Experiment of the Day

While I was working on the lines I decided to add more lines to the animation. When I was doing that it started to look like a ship scanning something so I ended up creating what I was seeing.

I do have the code for that

(defn polar-conv-x [r x]
  (* r (q/cos x)))
(defn polar-conv-y [r y]
  (* r (q/sin y)))

(defn parametic-fun-x [x]
  (+ (q/sin (/ x 10.5)) (q/cos (/ x 5.5))))

(defn parametic-fun-y [y]
  (+ (q/cos (/ y 2)) (q/sin (/ y 4))))

(defn setup []
  ; Set frame rate to 30 frames per second.
  (q/frame-rate 30)
  ; Set color mode to HSB (HSV) instead of default RGB.
  (q/color-mode :hsb)
  (q/background 0)
  ; setup function returns initial state. It contains
  ; circle color and position.
  {:color 0
   :t 0})

(defn update-state [state]
  ; Update sketch state by changing circle color and position.
  {:color (mod (+ (:color state) 0.7) 255)
   :t (+ (:t state) 0.1)})

(defn draw-state [state]
  ; Clear the sketch by filling it with light-grey color.
  (q/background 0)
  ; Set circle color.
  (q/stroke (:color state) 255 255)
  ; Calculate x and y coordinates of the circle.
  (let [t (:t state)
        x (polar-conv-x (* t 2) (parametic-fun-x t))
        y (polar-conv-y (* t 2) (parametic-fun-y t))]
    ; Move origin point to the center of the sketch.
    (q/with-translation [(/ (q/width) 2)
                         (/ (q/height) 2)]
      ; Draw the circle.
      (q/line x y (* -1 y) (* -1 x))
      (q/line (* -1 x) (* -1 y) (* -1 y) (* -1 x))
      (q/line x (* -1 y) (* -1 y) (* -1 x))
      (q/line (* -1 x) y (* -1 y) (* -1 x))
      (q/line x (* -1 y) (* -1 x) (* -1 y))
      (q/line x y (* -1 x) y)
      (q/line x (* -1 y) x y)
      (q/line (* -1 x) y (* -1 x) (* -1 y))