Skip to content

Instantly share code, notes, and snippets.

@baku89
Created March 11, 2021 02:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save baku89/2832cd4d516dac0fe5d9757c0589a59c to your computer and use it in GitHub Desktop.
Save baku89/2832cd4d516dac0fe5d9757c0589a59c to your computer and use it in GitHub Desktop.
(defn point-outside-circle [c r p]
(if (< (vec2/dist c p) r)
(vec2/scale (vec2/normalize (vec2/- p c)) r)
p))
(defn circle-tangent-point [c r b dir]
(let [B (point-outside-circle c r b)
cB (vec2/dist c B)
S (vec2/scale (vec2/normalize (vec2/- B c)) r)
beta (acos (/ r cB))]
(vec2/+ c (vec2/rotate [0 0] (* beta (if dir 1 -1)) S))))
(defn get-lerp-t [a b p]
(let [ab (vec2/- b a)]
(/ (vec2/dot (vec2/- p a) ab)
(vec2/sqr-len ab))))
(defn blob
{:doc "Creates a blob"
:params [{:type "vec2" :label "Center 1"}
{:type "vec2" :label "Center 2"}
{:type "number" :label "Radius 1"}
{:type "number" :label "Radius 2"}
{:type "vec2"}
{:type "vec2"}
{:type "number"}
{:type "number"}
{:type "number"}
{:type "number"}]
:transform (fn {:params [c1 c2 r1 r2 da db ta1 ta2 tb1 tb2]
:transform xform}
(let [trans (mat2d/extract-translate xform)]
{:replace [[0 (vec2/+ c1 trans)]
[1 (vec2/+ c2 trans)]
[4 (vec2/+ da trans)]
[5 (vec2/+ db trans)]]}))
:handles {:draw (fn {:params [c1 c2 r1 r2 da db ta1 ta2 tb1 tb2]}
(let [pa1 (circle-tangent-point c1 r1 da true)
pa2 (circle-tangent-point c2 r2 da false)
pb1 (circle-tangent-point c1 r1 db false)
pb2 (circle-tangent-point c2 r2 db true)]
[{:type "path" :class "dashed" :guide true
:path (polyline pa1 da pa2)}
{:type "path" :class "dashed" :guide true
:path (polyline pb1 db pb2)}
{:id :c1 :type "translate" :pos c1}
{:id :c2 :type "translate" :pos c2}
{:id :r1 :type "path" :path (circle c1 r1)}
{:id :r2 :type "path" :path (circle c2 r2)}
{:id :da :type "point" :pos da}
{:id :db :type "point" :pos db}
{:id :ta1 :type "arrow"
:pos (vec2/lerp pa1 da ta1)
:angle (vec2/angle (vec2/- da pa1))}
{:id :ta2 :type "arrow"
:pos (vec2/lerp pa2 da ta2)
:angle (vec2/angle (vec2/- da pa2))}
{:id :tb1 :type "arrow"
:pos (vec2/lerp pb1 db tb1)
:angle (vec2/angle (vec2/- db pb1))}
{:id :tb2 :type "arrow"
:pos (vec2/lerp pb2 db tb2)
:angle (vec2/angle (vec2/- db pb2))}]))
:drag (fn {:id id :pos pos
:params [c1 c2 r1 r2 da db ta1 ta2 tb1 tb2]}
(let [pa1 (circle-tangent-point c1 r1 da true)
pa2 (circle-tangent-point c2 r2 da false)
pb1 (circle-tangent-point c1 r1 db false)
pb2 (circle-tangent-point c2 r2 db true)]
(case id
:c1 {:replace [0 pos]}
:c2 {:replace [1 pos]}
:r1 {:replace [2 (vec2/dist c1 pos)]}
:r2 {:replace [3 (vec2/dist c2 pos)]}
:da {:replace [4 pos]}
:db {:replace [5 pos]}
:ta1 {:replace [6 (clamp 0 1 (get-lerp-t pa1 da pos))]}
:ta2 {:replace [7 (clamp 0 1 (get-lerp-t pa2 da pos))]}
:tb1 {:replace [8 (clamp 0 1 (get-lerp-t pb1 da pos))]}
:tb2 {:replace [9 (clamp 0 1 (get-lerp-t pb2 da pos))]})))}}
[c1 c2 ;; Center
r1 r2 ;; Radius
da db ta1 ta2 tb1 tb2]
(let [pa1 (circle-tangent-point c1 r1 da true)
pa2 (circle-tangent-point c2 r2 da false)
pb1 (circle-tangent-point c1 r1 db false)
pb2 (circle-tangent-point c2 r2 db true)
ma1 (vec2/lerp pa1 da ta1)
ma2 (vec2/lerp pa2 da ta2)
mb1 (vec2/lerp pb1 db tb1)
mb2 (vec2/lerp pb2 db tb2)]
(path/unite
(circle c1 r1)
(circle c2 r2)
[:path :M pa1
:C ma1 ma2 pa2
:L pb2
:C mb2 mb1 pb1
:Z])))
:start-sketch
(background "#190D96")
(style (fill "#FF1235")
(blob [-126.934 1.8116] [293.5409 -243.1625]
124.0453 88.6508
[245.9831 94.0655] [176.8081 72.4483] 0.5134 0.6716 0.5015 0.4245)
(blob [-126.934 1.8116] [-9.0542 437.5022]
124.0453 88.6508
[144.0922 146.2237] [176.8081 72.4483] 0.5134 0.6716 0.5015 0.4245)
(blob [417.3535 611.6687] [-9.0542 437.5022]
124.0453 88.6508
[72.0233 671.7262] [-150.1892 758.8094] 0.5134 0.6716 0.5015 0.4245)
(blob [417.3535 611.6687] [319.7601 209.284]
124.0453 191.5258
[611.0386 338.4074] [617.0444 377.4448] 0.5134 0.6716 0.5015 0.4245)
(blob [-673.8486 -80.3337] [-309.5784 -353.4101]
124.0453 111.8467
[-300.9315 11.9202] [-370.1065 -9.697] 0.5134 0.6716 0.5015 0.4245)
(blob [-989.4594 -255.4328] [-547.3674 -329.6312]
124.0453 88.6508
[-754.8923 -314.4992] [-757.054 -400.9679] 0.5134 0.6716 0.5015 0.4245))
(style (fill "#F7D5C4")
(blob [25.4879 -234.5156] [-231.7566 -604.1694]
124.0453 88.6508
[-143.1261 -392.321] [-69.6277 -459.3343] 0.5134 0.6716 0.5015 0.4245)
(blob [57.9137 -543.6413] [216.1611 -934.81]
78.5571 172.528
[-111.1518 -829.7095] [-219.2552 -919.7956] 0.5134 0.6716 0.5015 0.4245)
(blob [-566.6835 606.4584] [-408.4361 215.2897]
78.5571 172.528
[-159.1978 518.5797] [-372.4016 515.5768] 0.5134 0.6716 0.5015 0.4245))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment