arthur/docs
Your Name e7f5f82845 A drawing's origin is the middle of what it draws
A shape keyed from the bottom left to the top centre with a 360° turn on the way
left the stage completely in the middle of the spin and came back. The keys were
right and every frame between them was wrong, which is the signature of a wrong
pivot and a full turn: 0° and 360° are the only two frames where a wrong pivot
cannot be seen at all.

`paint/new-shape` stored a stroke EXACTLY AS DRAWN, in the containing symbol's
coordinates, and wrote no `pos`. So a drawing's origin was the SYMBOL's origin —
on the stage, its top-left corner. `node/local!` turns and scales about the
node's own origin and nothing else, deliberately, since `[:xform :anchor]` was
deleted in 925c12f. A node whose origin is nowhere near its content therefore
turns about nowhere near its content: the reported shape orbited at a radius of
126 px on a 320x200 stage.

It could not be seen while a drag was the only way to turn something, because
`gesture/about` solves for the `pos` that holds the chosen pivot still and
`turn` wrote it alongside the rotation — exactly right on the frame of the drag.
But that solution is `p' = c + R(θ)(p − c)`, an ARC, and `pos` interpolates along
the CHORD. Right on a drag, right on a key, wrong on every frame between two.

So `paint/centred` splits a stroke into a ring about its own middle and the `pos`
that puts it back, and `new-shape` is the one place every drawing is born — the
pen, the brush, and each piece the eraser leaves. The pivot rule is unchanged,
the middle of what the node draws; for a drawing that point is now its ORIGIN, so
`gesture/at-origin?` holds, `turn` writes `rot` alone, `scale` writes `scale`
alone, and a keyed turn is right on every frame. `pos` goes back to being the
motion path it reads as. Hand-authored scenes were always written this way:
`demo/scene.edn`'s card is `[-44 -30 44 -30 44 30 -44 30]` with its place in
`pos`.

NOT the universal rule, and `a-face-part-scales-about-its-own-middle` is why. A
measured part's points and position are dense tier-2 geometry in the footage's
space and cannot be re-originated, so its pivot is not its origin and `about` is
the only thing that will hold it; the same is true of an instance, whose origin
IS its symbol's coordinate system. Both still drag correctly about their middle,
both are inexact if that drag is keyed, and for both a pivot that has to persist
or be keyed is a peg — which is a node, so its pivot is its own origin, so it
collapses again one level up.

`cut/erase` took EVERY leftover piece back through `world⁻¹`, the cut shape's own
coordinates, and handed the offcuts to `new-shape`, which gives them a fresh
identity transform. Those two spaces coincide only while a shape has `pos [0 0]`,
which was every shape, so erasing anything that had been moved already scattered
its offcuts, silently. The kept piece comes back through `world⁻¹` and the new
ones through `parent⁻¹`, the space a node's `pos` lives in.

And `::adjust-last` re-traces the same stroke from stage pixels, so it goes
through `paint/place-points` rather than writing symbol-space points into a node
that now has a position of its own.

No schema change: the same fields, better values. An existing document keeps
evaluating exactly as it does now.

`a-keyed-turn-holds-its-pivot-between-its-keys` checks all 31 frames of the
tween. Checking the keys is what let this through. 604 CLJS tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-06 10:37:31 -04:00
..
animation-model.md A drawing's origin is the middle of what it draws 2026-10-06 10:37:31 -04:00
architecture.md grand unification of time 2026-10-01 01:47:08 -04:00
clipboard-plan.md perfect target area thing 2026-10-03 00:39:07 -04:00
correction-authoring-plan.md Unify cel editing in the timeline 2026-10-01 14:37:59 -04:00
creating-in.md fixed creating in 2026-10-03 02:15:27 -04:00
design.md Brows: traced ring, quantised raise 2026-09-24 18:11:25 -04:00
frame-selection.md Represent tracing media as symbols and add pool thumbnails 2026-10-04 00:02:12 -04:00
lane-handoff.md perfect target area thing 2026-10-03 00:39:07 -04:00
lane-is-a-view-notes.md perfect target area thing 2026-10-03 00:39:07 -04:00
lane-is-a-view-plan.md Loop is two things, and the one that matters is unreachable 2026-10-01 16:32:02 -04:00
lane-model.md perfect target area thing 2026-10-03 00:39:07 -04:00
lane-nesting-notes.md The timeline opens the whole document 2026-10-01 16:13:02 -04:00
multi-face-representation.md An occurrence is a node, with a clock of its own 2026-09-30 15:20:23 -04:00
one-grid-plan.md Unify timeline placement and gesture geometry 2026-10-01 23:35:22 -04:00
port-plan.md An anchor is a peg 2026-10-05 19:12:16 -04:00
time.md Unify root timing and persistent lane targets 2026-10-02 01:11:55 -04:00
timing-handoff.md Symbols, not timelines; no symbol is special 2026-09-29 12:46:42 -04:00
timing-model.md Represent tracing media as symbols and add pool thumbnails 2026-10-04 00:02:12 -04:00
tracing-symbol-plan.md Represent tracing media as symbols and add pool thumbnails 2026-10-04 00:02:12 -04:00