Stage aphorisms up until and including nineteen
This commit is contained in:
parent
d8b7bc3a02
commit
ef48c15e58
5 changed files with 225 additions and 1 deletions
|
|
@ -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
111
src/aphorisms/eighteen.clj
Normal 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])
|
||||
|
|
@ -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]
|
||||
|
|
|
|||
42
src/aphorisms/nineteen.clj
Normal file
42
src/aphorisms/nineteen.clj
Normal 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
67
src/aphorisms/sixteen.clj
Normal 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])
|
||||
Loading…
Add table
Add a link
Reference in a new issue