User Rating 0.0
Total Usage 0 times
Is this tool helpful?

Your feedback helps us improve.

About

Jigsaw puzzle cutting patterns require precise geometric construction. Each interior edge must form a tab-and-socket pair using cubic Bézier curves, where control point placement determines whether pieces interlock without overlap or gap. Miscalculated offsets or excessive jitter produce tabs that collide with adjacent edges, rendering the pattern unusable for laser cutting or die manufacturing. This generator computes a full grid of edges with configurable tabSize, jitter, and tabOffset parameters, applying a seeded pseudo-random number generator so any pattern is fully reproducible. Boundary edges remain straight. The tool approximates ideal interlocking geometry assuming uniform rectangular tiles. Note: extreme parameter combinations (high jitter with large tab size) can produce self-intersecting paths. Inspect your output at the extremes before committing to physical production.

jigsaw puzzle pattern generator svg laser cutting bezier puzzle template

Formulas

Each jigsaw edge is constructed from a sequence of cubic Bézier curve segments. Given an edge of length L running from point A to point B, the tab protrudes perpendicular to the edge direction by a depth of d:

d = tabSize × L

The tab center is located at the midpoint of the edge, shifted by tabOffset:

tcenter = 0.5 + δ × tabOffset

where δ {−1, +1} is chosen randomly per edge. Jitter displaces each Bézier control point by a vector whose components are drawn from [jitter × L, +jitter × L]. The tab direction (protrusion vs. socket) is assigned a random sign s {−1, +1} per edge. The PRNG uses a Mulberry32 algorithm seeded from the user-provided seed value:

state = (state + 0x6D2B79F5) & 0xFFFFFFFF

where state is a 32-bit unsigned integer. This guarantees identical output for identical seeds across all platforms.

Variable legend: L = edge length, d = tab depth, tabSize = tab size parameter (0.1 - 0.5), tabOffset = positional shift fraction (0 - 0.15), jitter = control point noise fraction, δ = random direction sign, s = tab polarity.

Reference Data

ParameterRangeDefaultEffect
Columns2 - 5010Number of horizontal tile divisions
Rows2 - 508Number of vertical tile divisions
Tile Width20 - 200 px80Width of each puzzle piece
Tile Height20 - 200 px80Height of each puzzle piece
Tab Size0.1 - 0.50.3Fraction of edge length used for tab protrusion depth
Jitter0.0 - 0.150.04Random displacement of Bézier control points as fraction of edge length
Tab Offset0.0 - 0.150.0Shifts tab center away from midpoint of edge (random direction per edge)
Seed0 - 99999942Deterministic PRNG seed for reproducible patterns
Randomize JitterOn / OffOffEach edge gets a random jitter value between 0 and the max jitter
Randomize OffsetOn / OffOffEach edge gets a random offset between 0 and the max offset
Stroke Width0.5 - 5.0 px1.5Line thickness of the cut path
Show GridOn / OffOffOverlay faint grid lines showing tile boundaries

Frequently Asked Questions

When tabSize exceeds 0.4 and jitter exceeds 0.1 simultaneously, the Bézier control points can push the curve past the boundary of an adjacent tile. The protrusion depth d = tabSize × L combined with random displacement of up to jitter × L in each axis means the total excursion can reach (tabSize + jitter) × L ≈ 0.5L, which encroaches on the neighboring edge's tab zone. Reduce one or both parameters, or visually inspect the SVG before cutting.
The generator uses Mulberry32, a 32-bit integer-state PRNG that relies only on addition, multiplication, and bitwise shifts - operations that are deterministic across all JavaScript engines. Given identical seed values, the sequence of pseudo-random numbers (and therefore tab directions, offsets, and jitter displacements) will be identical on Chrome, Firefox, Safari, or any compliant engine.
Yes. The generated SVG uses stroke paths with no fill, which most laser cutter software (LightBurn, RDWorks, Inkscape+Gcode) interprets as vector cut lines. Set the stroke width to your kerf compensation value. The default coordinate system uses pixel units; scale the SVG in your cutting software to match your desired physical dimensions. Ensure your material thickness accommodates the tab depth.
Tab offset shifts the entire tab along the edge axis - moving the knob/socket center point away from the geometric midpoint by up to 15% of the edge length. This creates an asymmetric interlock. Jitter, by contrast, randomly displaces individual Bézier control points perpendicular and parallel to the edge, creating organic, irregular tab shapes. Offset affects position; jitter affects shape.
Boundary edges form the outer frame of the puzzle. Adding tabs to boundary edges would create protruding or recessed geometry on the puzzle perimeter, making it impossible to frame or align the completed puzzle against a flat surface. The generator detects edges where row = 0, row = maxRows, col = 0, or col = maxCols and renders them as simple straight line segments.
When "Randomize Jitter" is enabled, the slider value becomes the upper bound. Each edge independently receives a jitter value drawn uniformly from [0, sliderValue]. The same applies to "Randomize Offset". This prevents uniform patterns while still giving you control over the maximum distortion. The per-edge random value is drawn from the seeded PRNG, so toggling randomization with the same seed produces a deterministic result.