Point Scatter
Generate N points from a shape — scattered inside the fill region, along the perimeter, or from the existing vertices.
Category: Points Menu path: Points > Point Scatter
Ports
| Port | Type | Direction | Description |
|---|---|---|---|
shape_in | shape | input | Source shape to scatter from |
out | points | output | Generated points |
Parameters
| Param | Type | Default | Description |
|---|---|---|---|
mode | enum | Fill | Where to place points: Fill (inside filled region), Boundary (along perimeter), Vertices (random picks from source vertices) |
count | scalar | 100 | Number of points to emit. Keyframeable. Clamped to 100,000 (rejection-sampling safety cap). |
seed | scalar | 0 | Integer seed for deterministic random placement (Fill, Vertices) |
Expose Channels
When enabled (E button on node header), adds input ports that override params via edge connections:
| Port | Type | Overrides |
|---|---|---|
count_in | scalar | count |
seed_in | scalar | seed |
Useful for time-driven point counts (e.g. Time → count_in for a growing scatter) or randomizing seed from a vector field.
How It Works
Fill
Rejection-sampling inside the shape's AABB: generates candidate points, keeps the ones that pass a ray-casting point-in-polygon test. Uses even-odd winding across all paths, so shapes with holes (e.g. a donut from ShapeBoolean(Subtract)) are respected — points stay in the filled region and avoid interior holes.
Seeds produce deterministic output — animating seed over time gives a reshuffled scatter each frame; keeping seed fixed gives a stable distribution.
Rejection attempts are capped at count × 50; shapes with tiny fill area (e.g. very thin strokes treated as filled) may emit fewer points than count.
Boundary
Distributes count points uniformly along the combined arc-length of all closed paths. Beziers are subdivided before measuring so curved shapes get accurate arc-length parameterization. Points from multi-path shapes are shared proportionally to each path's perimeter contribution.
Unlike Fill, Boundary is deterministic without a seed — the same shape + count always gives the same output positions.
Vertices
Pulls count points from the shape's existing vertex list, hash-shuffled by seed. If count is smaller than the source vertex count, each output is a random (deterministic) pick. If count exceeds the vertex count, it wraps — each output slot gets hash(seed, i) % vertex_count, so duplicates are expected at high counts.
Attributes
All modes write the standard index attribute (0..N-1) on the output points, so downstream PointAttributes(source=Index) works immediately for per-point styling ramps.
Source-shape vertex attributes are not propagated to scatter output — Fill and Boundary points are fabricated from scratch. If you need source attributes on downstream scatter points, use ImageSample + a renderable representation of the shape to sample back.
Usage Examples
Fill with circles
Circle (radius: 200) → PointScatter (mode: Fill, count: 500, seed: 0) → DrawPoints → OutputDense scatter inside a circle — foundation for dust, confetti, particle emitters.
Boundary for perimeter effects
Polygon (sides: 6) → PointScatter (mode: Boundary, count: 60) → PointAttributes (target: Color, source: Index, ramp: red→blue) → DrawPoints60 colored dots evenly spaced around a hexagon, colored by position along the perimeter.
Clone shapes onto scatter
Circle → PointScatter (Fill, 200) → CloneToPoints ← Star200 stars scattered randomly inside a circle mask.
Advect scattered points
Circle → PointScatter (Fill, 500) → PointAdvect ← Noise.vectorField → PointTrail → DrawShapeClassic "fluid inside a container" effect — particles start inside a circle and advect through a noise field.
Density-driven look via upstream shape
ImageSample (from a silhouette texture) → Threshold/ShapeOp → ... → PointScatter (Fill)Feed any shape into scatter — text from TextToShape, extracted contours from ContourExtract, boolean compositions, anything that produces closed paths.
Vertices mode for mesh-like effects
EditableShape (hand-drawn) → PointScatter (Vertices, count=10, seed=0) → DrawPointsPick 10 random vertices from a hand-drawn shape — deterministic "interesting points" for accents.
Boolean + scatter
Shape A ─┐
├→ ShapeBoolean (Subtract) → PointScatter (Fill) → DrawPoints
Shape B ─┘Points only in the subtracted region — holes in shape B are preserved as empty zones in the scatter.
Tips
- Boundary is deterministic, Fill and Vertices need a seed. Animating
seedon Fill is the easiest way to get twinkling / reshuffling scatter. - Count is keyframeable — animating from 10 → 500 gives a progressive density reveal. Works especially well paired with PointAttributes for per-point animation.
- Rejection sampling slowdown: Fill mode on very thin shapes (e.g. a 1px line treated as filled) may emit fewer points than requested because the AABB is mostly empty. Use Boundary instead for thin shapes.
- Self-intersecting shapes work under even-odd winding — a figure-8 scatters in the two lobes, avoids the crossing.
- For dense scatter with high visual uniformity, see the Sunflower pattern on
Grid— it's deterministic phyllotaxis, no gaps or clusters.
Related Nodes
- Grid — regular point distributions (Grid / Radial / Hex / Sunflower / Jittered / Concentric); complements PointScatter for non-shape-driven point sources
- ShapeBoolean — compose shapes before scattering for complex fill regions
- ContourExtract — field-driven shapes as scatter source
- CloneToPoints — instance shapes at scattered point positions
- PointAdvect — animate scattered points through vector fields
- PointAttributes — style scattered points via fields or index ramps