Skip to content

Instantly share code, notes, and snippets.

@baku89
Created August 20, 2020 00:52
Show Gist options
  • Save baku89/5659c9da1d95e4c7119d0cb699e9e420 to your computer and use it in GitHub Desktop.
Save baku89/5659c9da1d95e4c7119d0cb699e9e420 to your computer and use it in GitHub Desktop.
(defn round-rect
{:doc "Draw a round rect"
:handles
{:draw (fn [e]
(let [params (get e :params)
[pos rect r] params
top-left (rect2d/point rect)
rect2d-e {:params [rect]}]
`[~{:type "path" :guide true
:class "dashed"
:path (line top-left
(vec2/+ top-left [r r]))}
~@(apply-draw-handle rect2d rect2d-e)
~{:id :radius
:type "arrow"
:angle (deg 45)
:pos (vec2/+ top-left [r r])}
~{:id :pos
:type "translate"
:pos pos}]))
:drag (fn [e]
(let [params (get e :params)
id (get e :id)
pos (get e :pos)
[_ rect r] params
rect2d-e (assoc e :params [rect])]
(case id
:pos
{:replace [0 pos]}
:radius
{:replace [2 (clamp 0
(/ (min (rect2d/width rect)
(rect2d/height rect))
2)
(- (.x pos) (rect2d/left rect)))]}
{:replace [1 (first (apply-drag-handle rect2d rect2d-e))]})))
}}
[pos [left top w h] r]
(let [right (+ left w)
bottom (+ top h)]
(path/unite
(let [center (rect2d/center [left top w h])
perp (->> (vec2/- pos center)
(vec2/normalize )
(vec2/rotate [0 0] (deg 90)))]
(polygon pos
(vec2/scale-add center perp 100)
(vec2/scale-add center perp -100)))
(path/join
(line [(+ left r) top] [(- right r) top])
(arc [(- right r) (+ top r)] r (deg -90) 0)
(line [right (+ top r)] [right (- bottom r)])
(arc [(- right r) (- bottom r)] r 0 (deg 90))
(line [(- right r) bottom] [(+ left r) bottom])
(arc [(+ left r) (- bottom r)] r (deg 90) (deg 180))
(line [left (- bottom r)] [left (+ top r)])
(arc [(+ left r) (+ top r)] r (deg 180) (deg 270))))))
(style (stroke "#3CD2D2" 25.6)
(round-rect [-232.7999 889.6818]
[-743.5691 -61.9409 832.666 609.4693]
136.8044))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment