Click empty space: add point.
Drag from empty space: add segment (its two endpoints are attached immediately).
Click an empty part of a segment: attach another slider point there (a segment can hold any number of them).
Drag an empty part of a segment: reshape the whole segment, keeping the grabbed point under the cursor.
Drag a point: move it (slider points slide along their segment).
Enter: copy last-moved slider point to a free point.
Right-click a point: remove it (its segment stays).
Right-click a segment: remove it and all its attached points.
Right-click empty space: clear everything.
Ctrl-drag anywhere: pan the view.
Shift-drag anywhere: always adds a new segment, never moves existing points/segments.
Scroll / trackpad pinch: zoom in and out, centered on the cursor.
Intersection generations: each generation adds a (purple, non-editable) point everywhere a segment crosses a circumcircle, then retriangulates including those before the next generation - fully derived, so it stays live as you edit anything.
Intersection type - Simple: circles come from the full current triangulation (real + already-generated points), retriangulated fresh each generation. First order: circles come only from the free-point cloud's own triangulation (never other segments' points, never regenerated) - this is the actual "as a point slides from one segment endpoint to the other, the triangulation changes at these crossings" construction; each segment is checked independently, so it's a one-shot computation (the slider's exact value beyond 1 doesn't matter). Second order: segment-segment interaction - for each first-order point, actually inserts it into the free-point cloud, keeps only the genuinely new triangles that insertion creates (discarding the degenerate leftover that shares the point's own origin circle), and checks every *other* segment against those; also includes the direct crossing point wherever two input segments physically cross, attached to both; also one-shot.
Hypothesis test: for each segment, walks its attached points in order and checks each consecutive pair against the Delaunay triangulation's actual edges - the fraction is how many of those subedges were found; ✓ only when every one was. Click the ✗ to zoom to a failing subedge (it pulses red once you arrive); click again to zoom back out to fit everything and advance to the next one.
Undo / Redo: step through every change, including clears, randomizes, and the slider above.
Share config: Save fills the box with the current points/segments/view/settings as JSON (and tries to copy it to your clipboard) - paste that text to someone else, or into a chat with Claude as debug material. Load reads whatever JSON is currently in the box and replaces the scene with it.