Created
March 11, 2021 02:56
-
-
Save baku89/2832cd4d516dac0fe5d9757c0589a59c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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