diff --git a/src/aphorisms/eight.clj b/src/aphorisms/eight.clj index bac9416..8d26fa2 100644 --- a/src/aphorisms/eight.clj +++ b/src/aphorisms/eight.clj @@ -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]) diff --git a/src/aphorisms/eighteen.clj b/src/aphorisms/eighteen.clj new file mode 100644 index 0000000..8109393 --- /dev/null +++ b/src/aphorisms/eighteen.clj @@ -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]) diff --git a/src/aphorisms/eleven.clj b/src/aphorisms/eleven.clj index 211abf3..043bf90 100644 --- a/src/aphorisms/eleven.clj +++ b/src/aphorisms/eleven.clj @@ -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] diff --git a/src/aphorisms/nineteen.clj b/src/aphorisms/nineteen.clj new file mode 100644 index 0000000..fddc936 --- /dev/null +++ b/src/aphorisms/nineteen.clj @@ -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]) diff --git a/src/aphorisms/sixteen.clj b/src/aphorisms/sixteen.clj new file mode 100644 index 0000000..6f62d54 --- /dev/null +++ b/src/aphorisms/sixteen.clj @@ -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])