Triangular · Square · Hexagonal lattices · Drag-edit an edge and watch its tessellating partner update
Drag the highlighted dots on the top and right edge of the outlined base tile. The left/bottom edges of every tile update automatically so the shape still tiles the plane exactly.
This simulator has two real, mechanically distinct tiling engines. Regular Lattice Tiling computes triangular, square and hexagonal tessellations directly from two lattice basis vectors e₁, e₂ — every tile position is the integer combination i·e₁ + j·e₂, and rotating the angle slider rotates the basis itself, not just the drawing. Escher Edge Editor implements the genuine technique Escher used to build his interlocking animal tilings: you deform one edge of a base tile, and the opposite edge is generated automatically — by translation or by mirror reflection about the shared boundary line — so the tile is provably guaranteed to tessellate no matter how wild the edge gets.
M. C. Escher had no formal mathematics training, yet he independently rediscovered several of the 17 wallpaper groups by studying Moorish tilework at the Alhambra in 1936. His interlocking animals all rely on exactly the two edge-matching rules modelled here: translate the edited edge across the tile, or reflect it about the boundary it shares with its neighbour — both guarantee a perfect, gap-free tiling by construction.
This is a 2D companion to the Tessellations simulator, built around real tiling geometry rather than a fixed picture. The lattice engine places every tile at i·e₁ + j·e₂ for integer i, j; the Escher engine derives the left and bottom edges of every tile from the top and right edges you draw, using either a pure translation or a reflection about the shared tile boundary — the same two edge-matching moves that make any interlocking tessellation actually close up without gaps.
Regular mode: triangular, square and hexagonal tilings generated from rotated lattice basis vectors, with an optional overlay of the vectors themselves. Escher mode: a deformable base tile whose right and top edges you edit directly on the canvas; the left edge is the right edge translated by −e₁ (or mirrored about the tile boundary), and the bottom edge is the top edge translated by e₂, so every tile edge matches its neighbour exactly.
Pick a mode, then a tiling type or symmetry group. Drag the small dots on the base tile's top/right edge in Escher mode — perpendicular displacement only, so the curve can never self-intersect. Randomize edges for a quick organic tile, or reset to a plain square. Drag empty space to pan either mode.
A wallpaper group describes exactly how a repeating 2D pattern's symmetries (translations, reflections, rotations, glides) combine; there are only 17 possible such groups in the plane, and Escher's sketchbooks worked through examples of most of them by hand decades before mathematicians catalogued his tilings group by group.
The original renders regular tilings and a Penrose aperiodic tiling on a fixed set of shapes. This 2D companion adds a genuine Escher-style editor: you deform an edge yourself, and the opposite edge is computed live by translation or reflection, so you can watch a tile go from a plain square to an interlocking organic shape while it stays provably tileable.
Each control point is constrained to move only away from or toward its straight-edge position, at a fixed position along the edge. That keeps the curve from folding back on itself, which would make the tile self-intersect and stop being a valid simple polygon.
Translation (wallpaper group p1) copies the edited top and right edges straight across the tile by the lattice vectors, so every tile is an identical, unrotated copy. Reflection (group pm) mirrors alternating columns of tiles across their shared vertical boundary, so the edited edge and its mirror image lock together exactly along that shared line.
Yes. Every tile position is computed as an integer combination of two basis vectors, and rotating the Lattice Angle slider applies a real 2D rotation matrix to those basis vectors before the grid is generated, so the whole tiling turns as a rigid lattice rather than being redrawn approximately.
No — by construction. The left and bottom edges are never drawn independently; they are always derived from the top and right edges through an exact translation or reflection, so any edge you draw automatically has a matching partner edge and the tiling never leaves a gap.