Skip to content

Instantly share code, notes, and snippets.

@shspage
Last active December 1, 2020 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shspage/c75a2a3875366b1ad10c509ee24f066f to your computer and use it in GitHub Desktop.
Save shspage/c75a2a3875366b1ad10c509ee24f066f to your computer and use it in GitHub Desktop.
;; bezier_study
;; To Edit the Shape:
;; Click each "segment" at the end
;; of this code and drag the point.
(defn adjust_dir [p p1 p2]
(let [angle (vec2/angle (vec2/- p1 p))
len (vec2/dist p1 p2)]
(vec2/+ p1 (vec2/dir angle len))))
(defn ui_line [p0 p1]
{:type "path" :path (line p0 p1) :class "dashed"})
(defn ui_point [id p]
{:id id :type "point" :pos p})
(defn segment
{:handles
{:draw (fn {:params [p0 p1 p2]}
[(ui_line p0 p1)
(ui_line p1 p2)
(ui_point :ldir p0)
(ui_point :anc p1)
(ui_point :rdir p2)])
:drag (fn {:id id :pos p :params[p0 p1 p2]}
(case id
:ldir [p p1 (adjust_dir p p1 p2)]
:rdir [(adjust_dir p p1 p0) p1 p]
:anc (let [d (vec2/- p1 p)]
[(vec2/- p0 d) p (vec2/- p2 d)])))
}}
[p0 p1 p2]
{:p0 p0 :p1 p1 :p2 p2}
)
(defn bezier
[& segs]
(apply concat [:path :M (get (first segs) :p1)]
(for [n (range (dec (count segs)))]
[:C (get (nth segs n) :p2)
(get (nth segs (inc n)) :p0)
(get (nth segs (inc n)) :p1)])))
:start-sketch
(background "#fff")
(style (stroke "#888" 4)
(bezier
(segment [206.5501 144.5429] [141.8392 51.9955] [90.0704 -22.0424])
(segment [-11.9160 -40.0951] [-85.9539 11.6737] [-145.1843 53.0887])
(segment [-159.6264 134.6778] [-118.2114 193.9082] [-85.0794 241.2924])
(segment [-19.8081 252.8461] [27.5762 219.7141] [65.4836 193.2085])
(segment [74.7266 140.9915] [48.2210 103.0841] [27.0165 72.7581])
(segment [-14.7572 65.3638] [-45.0831 86.5682] [-69.3438 103.5318])
(segment [-75.2593 136.9507] [-58.2958 161.2115] [-44.7249 180.6201])
(segment [-17.9898 185.3525] [1.4188 171.7816] [16.9457 160.9249])))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment