Animation 2

A triangle's symmetries

symmetry-triangle-actions.mp4

These are sparse samples decoded from the current MP4, not newly rendered illustrations. They can support checks of the sampled states and labels, but cannot establish continuous motion, timing, transitions, or the absence of problems between samples. Use the full MP4 when judging those properties.

900 × 620 · 18 fps · 20 s · 360 frames · 12 samples

MP4 SHA-256 d03afb8e8f4d486b40907a7d551496836714e27650b67037f92d42f2a7ee44a9

Frame manifest · Context markdown · Download complete review packet

Chapter context

Section: Discrete symmetries. Excerpts are verbatim; line numbers refer to the included chapter markdown.

Caption

A triangle's symmetries

Image description

Triangle symmetry actions

Before the animation

Chapter lines 40–46

We can see its obvious symmetry. To categorize its symmetry we can write down all the actions that leave it unchanged:

  1. Do nothing
  2. Rotate 120°
  3. Rotate 240°
  4. Flip along an axis
  5. Flip then rotate 120°
  6. Flip then rotate 240°

After the animation

Chapter lines 54–54

We say the triangle "belongs to the $D_3$ symmetry group." Any number of objects possess $D_3$ symmetry.

Generation source

Run the main script without arguments. It draws the triangle-action frames with Pillow and encodes them with FFmpeg, then writes a poster. It has no local Python imports or input movie.

Mapping evidence and limits

main() explicitly writes symmetry-triangle-actions.mp4; constants specify 900 x 620 at 18 fps. No matching validation JSON is present. Attribution is by source/output name and pipeline, not a recorded movie hash.

Source SHA-256 values identify the exact downloadable bytes in this packet. The source mapping and recorded checks explain the likely generation pipeline; they do not prove that these exact source bytes produced the movie. A GitHub link pinned to a commit is provided only when the delivered source bytes exactly match that path at the build's Git HEAD.

Decoded contact sheet

Extraction method: Twelve evenly spaced decoded frame indices, including first and last. Native-resolution JPEGs from the encoded MP4; timestamps read from FFmpeg showinfo. No source rerendering. Frame indices are zero-based. Sparse samples do not establish continuous motion or capture every transition.. Frame indices are zero-based.

Timestamped decoded frames from symmetry-triangle-actions.mp4
Open contact sheet at full size

Full-size sampled frames

Decoded frame from symmetry-triangle-actions.mp4 at 00:00.000 · frame 0
00:00.000 · frame 0 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:01.833 · frame 33
00:01.833 · frame 33 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:03.611 · frame 65
00:03.611 · frame 65 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:05.444 · frame 98
00:05.444 · frame 98 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:07.278 · frame 131
00:07.278 · frame 131 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:09.056 · frame 163
00:09.056 · frame 163 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:10.889 · frame 196
00:10.889 · frame 196 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:12.667 · frame 228
00:12.667 · frame 228 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:14.500 · frame 261
00:14.500 · frame 261 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:16.333 · frame 294
00:16.333 · frame 294 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:18.111 · frame 326
00:18.111 · frame 326 · Full-size frame
Decoded frame from symmetry-triangle-actions.mp4 at 00:19.944 · frame 359
00:19.944 · frame 359 · Full-size frame