Platform
Resources
Pricing
Sign in
Contact us
Sundar Singh
playing with space, shape, colour & composition
Workspace
Fork
Published
playground
By
Sundar Singh
Edited
Apr 14, 2022
1 fork
playground
Simple canvas particle system
word distribution experimental visuals
Harmonic Oscillations: An Interactive Canvas of Dynamic Shapes
Canvas dynamic pattern
Simple canvas polygon
Random force network
its 100.0% rectangle square
using date as seed for view
SVG hexbin image render
word cloud alternative
random city landscape
Sol LeWitt Wall Drawing
Strange Attractors v1
Morphological Table
D3 | parametric equations
I am inexpressible
Team clusters using circle packing
Team grouping
Team waffle
Laurie Anderson quotes — type play
poly-linear scale with css radial gradient
Interpolate along line
V60 coffee | James Hoffmann recipe
waffle time
SVG clipPath using d3
columns/divisons
UK waffle map
force animation
Cluster packing
interpolating two strings
Insert cell
Insert cell
{
const
svg
=
d3
.
create
(
"svg"
)
.
attr
(
'width'
,
width
/
2
)
.
attr
(
"viewBox"
,
"0 0 100 100"
)
;
svg
.
append
(
"clipPath"
)
.
attr
(
"id"
,
"myClip"
)
.
append
(
"circle"
)
// Everything outside the circle will be clipped and therefore invisible.
.
attr
(
"cx"
,
40
)
.
attr
(
"cy"
,
35
)
.
attr
(
"r"
,
35
)
;
// The original black heart, for reference
svg
.
append
(
"path"
)
.
attr
(
"id"
,
"heart"
)
.
attr
(
'd'
,
heartPath
)
;
// "M10,30 A20,20,0,0,1,50,30 A20,20,0,0,1,90,30 Q90,60,50,90 Q10,60,10,30 Z"
// Only the portion of the red heart
// inside the clip circle is visible.
svg
.
append
(
"use"
)
// https://developer.mozilla.org/en-US/docs/Web/SVG/Element/use
.
attr
(
"clip-path"
,
"url(#myClip)"
)
.
attr
(
"href"
,
"#heart"
)
.
attr
(
"fill"
,
"red"
)
;
return
svg
.
node
(
)
;
}
Insert cell
<
style
>
/* With a touch of CSS for browsers who *
* implemented the r Geometry Property. */
@keyframes
openYourHeart
{
from
{
r
:
0
}
to
{
r
:
60
px
}
}
#
myClip
circle
{
animation
:
openYourHeart
15
s
infinite
;
}
</
style
>
Insert cell
Insert cell
Insert cell
{
const
svg
=
d3
.
create
(
"svg"
)
.
attr
(
'width'
,
width
/
2
)
.
attr
(
"viewBox"
,
"0 0 100 100"
)
;
const
defs
=
svg
.
append
(
"defs"
)
// the clipPath, whatever shape you want to be the mask
defs
.
append
(
"clipPath"
)
.
attr
(
"id"
,
"myClipV2"
)
.
append
(
"path"
)
.
attr
(
'd'
,
heartPath
)
;
// heart shape
// only whatever parts of the shape inside the clipPath are visible
svg
.
append
(
"circle"
)
.
attr
(
"clip-path"
,
"url(#myClipV2)"
)
.
attr
(
"cx"
,
40
)
.
attr
(
"cy"
,
35
)
.
attr
(
"r"
,
radius
)
.
attr
(
"fill"
,
"red"
)
;
// redrawing the heart so we can see the mask shape (not needed)
svg
.
append
(
"path"
)
.
attr
(
'd'
,
heartPath
)
.
attr
(
"fill"
,
"none"
)
.
attr
(
"stroke"
,
"#ccc"
)
.
attr
(
"stroke-dasharray"
,
"0.5, 0.5"
)
.
attr
(
"stroke-width"
,
"0.5px"
)
;
return
svg
.
node
(
)
;
}
Insert cell
Insert cell
heartPath
=
"M10,30 A20,20,0,0,1,50,30 A20,20,0,0,1,90,30 Q90,60,50,90 Q10,60,10,30 Z"
Insert cell
Purpose-built for displays of data
Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Try it for free
Learn more
Fork
View
Export
Edit
Add comment
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
Add comment
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
Add comment
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
Edit
Add comment
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
radius
Edit
Add comment
Copy import
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
Add comment
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
Edit
Add comment
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML
heartPath
Add comment
Copy import
Select
Duplicate
Copy link
Embed
Delete
JavaScript
Markdown
HTML