Stage aphorisms up until and including nineteen

This commit is contained in:
arne 2021-06-14 11:34:52 +02:00
commit ef48c15e58
5 changed files with 225 additions and 1 deletions

View file

@ -37,6 +37,6 @@
:setup setup
:update update-state
:draw draw-state
:renderer :p3d
:renderer :opengl
:features [:keep-on-top :no-bind-output]
:middleware [qm/pause-on-error qm/fun-mode])

111
src/aphorisms/eighteen.clj Normal file
View file

@ -0,0 +1,111 @@
(ns aphorisms.eighteen
(:require [quil.core :as q]
[quil.middleware :as qm]
[thi.ng.geom.vector :as v]
[thi.ng.geom.rect :as r]
[thi.ng.geom.core :as g]
[thi.ng.math.core :as m]))
(def bounds (r/rect 500))
(defn arc [c start end]
{:c c
:start start
:end end})
(defn radians [arc start-or-end]
(g/angle-between (:c arc) (get arc start-or-end)))
(defn radius [arc]
(m/mag (m/- (:c arc) (:start arc))))
(comment
(def tmp (arc (v/vec2 0 0) (v/vec2 -100 0) (v/vec2 0 100)))
(radians tmp :start) ;; => 3.141592653589793
(radians tmp :end) ;; => 1.5707963267948966
(radius tmp) ;; => 100.0
)
;; a random sample inside bounds separates the space into four parts
;; i want to get the biggest part
(identity bounds)
;; => {:p [0.0 0.0], :size [500.0 500.0]}
(g/random-point-inside bounds)
;; => [3.722300840831416 95.03615495022028]
(defn subdivide-at [rect p]
[(r/rect (:p rect) p)
(r/rect (v/vec2 (:x p) (r/bottom rect)) (v/vec2 (r/right rect) (:y p)))
(r/rect (v/vec2 (r/left rect) (:y p)) (v/vec2 (:x p) (r/top rect)))
(r/rect (v/vec2 (:x p) (:y p)) (v/vec2 (r/top rect) (r/right rect)))])
(let [division bounds
p (g/random-point-inside division)
biggest-division (->> (subdivide-at bounds p)
(sort-by (comp - g/area))
(first))]
[p
biggest-division
(-> (g/translate biggest-division (m/- p))
(g/scale 0.66)
(g/translate p))])
(defn reset-state [& _]
(let [p (g/random-point-inside bounds)
start (m/+ p (v/randvec2 50))
end (-> (g/translate start (m/- p))
(g/rotate (rand m/HALF_PI))
(g/translate p))]
{:arcs [(arc p start end)]}))
(defn setup []
(q/frame-rate 1)
(q/rect-mode :center)
(q/ellipse-mode :center)
(q/color-mode :hsb 360 100 100)
(q/background 10 20 100)
(reset-state))
(defn update-state [state]
state)
(defn draw-state [state]
(q/background 10 20 100)
(q/stroke 200 80 100)
(q/no-fill)
(doseq [{[x y] :c :as arc} (:arcs state)
:let [start (radians arc :start)
end (radians arc :end)]]
(q/ellipse x y 5 5)
(q/line (:c arc) (:start arc))
(q/line (:c arc) (:end arc))
(q/arc x y (radius arc) (radius arc) (min start end) (max start end))))
(defn origin-at-bottom-left
"Make processing and thi.ng use the same coordinate system, with the orgin
at the bottom left."
[options]
;; note that this usually doesn't make any difference, but we're using
;; "r/bottom" and "r/top" here soooo… let's be consistent
(update options :draw (fn [draw]
(fn [& args]
(q/translate 0 (get-in options [:size 1]))
(q/scale 1 -1)
(apply draw args)))))
#_:clj-kondo/ignore
(q/defsketch eighteen
:title "Eighteen"
:size (:size bounds)
:settings #(q/pixel-density (q/display-density))
:setup setup
:update update-state
:mouse-pressed reset-state
:draw draw-state
;; :renderer :p2d
:middleware [qm/pause-on-error qm/fun-mode origin-at-bottom-left])

View file

@ -41,6 +41,10 @@
(apply q/vertex pt)))
(q/end-shape :close))))
(defn settings []
(q/pixel-density (q/display-density))
(q/smooth 2))
(q/defsketch eleven
:title "Eleven"
:size [500 500]

View file

@ -0,0 +1,42 @@
(ns aphorisms.nineteen
(:require [quil.core :as q]
[quil.middleware :as qm]
[thi.ng.geom.rect :as r]
[thi.ng.geom.core :as g]
[thi.ng.math.core :as m]))
(def bounds (r/rect 500 500))
(defn setup []
(q/frame-rate 1)
(q/rect-mode :center)
(q/ellipse-mode :center)
(q/color-mode :hsb 360 100 100)
(q/background 10 20 100)
{})
(defn update-state [state]
state)
(defn draw-state [state]
(let [canvas (g/scale (:size bounds) 0.92)]
(q/background 40 10 100)
(q/no-fill)
(q/with-translation [250 250]
(doseq [i (range 100)
:let [norm (* 0.01 i)
x (m/map-interval i [0 99] [(* -0.5 (:x canvas)) (* 0.5 (:x canvas))])
x-off (m/map-interval (q/sin (* norm q/PI)) [-1 1] [-50 50])]]
(q/line (+ x x-off) -20 (+ x x-off) 20)))))
#_:clj-kondo/ignore
(q/defsketch eighteen
:title "Eighteen"
:size (:size bounds)
:settings #(q/pixel-density (q/display-density))
:setup setup
:update update-state
:draw draw-state
;; :renderer :p2d
:middleware [qm/pause-on-error qm/fun-mode])

67
src/aphorisms/sixteen.clj Normal file
View file

@ -0,0 +1,67 @@
(ns aphorisms.sixteen
(:require [thi.ng.math.core :as m]
[thi.ng.geom.core :as g]
[thi.ng.geom.vector :as v]
[thi.ng.geom.line :as l]
[thi.ng.math.noise :as n]
[thi.ng.geom.rect :as r]
[quil.core :as q]
[quil.middleware :as qm]))
(defn setup []
(q/frame-rate 30)
(q/color-mode :hsb 360 100 100)
(q/rect-mode :center)
(q/ellipse-mode :center)
(q/background 180 10 90)
{})
(defn update-state [state]
state)
(defn grid [r divisions]
(->>
(g/subdivide r {:num divisions})
(map (comp v/vec2 (juxt r/left r/top)))
#_(take (inc (* divisions divisions)))))
(def grid-points
(->> (g/subdivide (r/rect [72 72] [428 428]) {:num 25})
(map g/edges)
(apply concat)
(apply concat)
(dedupe)
(map v/vec2)))
(defn line-crossing [v length]
(l/line2 (m/- v (v/vec2 [(* length 0.5) 0]))
(m/+ v (v/vec2 [(* length 0.5) 0]))))
(defn draw-state [state]
(q/background 180 10 90)
(q/no-fill)
(doseq [[p1 p2 :as pt] grid-points
:let [length (m/map-interval p2 [72 428] [3 18])
[[x1 y1] [x2 y2]] (-> (line-crossing pt length)
(g/translate (m/- pt))
(g/rotate (+ m/QUARTER_PI
(* (n/noise2 (* 0.52 p1) (* 0.02 p2)) m/QUARTER_PI)))
(g/translate pt)
(g/vertices))]]
(q/line x1 y1 x2 y2)
(q/stroke-cap :round)
(q/stroke-weight 1.2)
(q/stroke 340 20 90)))
#_:clj-kondo/ignore
(q/defsketch sixteen
:title "Sixteen"
:size [500 500]
:settings #(q/pixel-density (q/display-density))
:setup setup
:update update-state
:draw draw-state
:renderer :p2d
:features [:keep-on-top :no-bind-output]
:middleware [qm/pause-on-error qm/fun-mode])