| name | math2ggb |
|---|---|
| description | Turn a math problem (especially geometry) into GeoGebra .ggb files. For each figure it produces THREE deliverables from the SAME dependency-constrained construction: a 静态复刻图 (static faithful reproduction that exactly matches the printed figure), a 干净可交互图 (clean interactive figure — same print-identical look, no text/aids, fully draggable with every condition preserved), and a 动态理解图 (dynamic teaching figure adding auxiliary lines, annotations, and live angle/length readouts on a toggle). All encode the problem's conditions as real constraints, so dragging a driver point keeps every condition satisfied. Use when the user wants a GeoGebra file or .ggb, asks to turn a geometry/math problem or figure into GeoGebra, wants an interactive GeoGebra applet / 动态几何 / 几何画板, or mentions GeoGebra, ggb, or 动态几何. Drives the real GeoGebra engine in a browser and exports via getBase64. |
Math → GeoGebra (.ggb)
For each figure in the problem, produce three files, all built from the SAME dependency-constrained construction. In all three the base visible content equals the printed figure — exactly the same points, segments, and angle marks: no more, no less (only the 动态理解图 adds aids, and only on a toggle that defaults off).
- 静态复刻图 (static faithful) — the printed figure reproduced exactly: only the original's points, segments, and its own angle ticks; no axes/grid, no extra labels or auxiliary lines. The clean, print-matching reference still.
- 干净可交互图 (clean interactive) — visually identical to the original (same marks; no text, no annotations, no visible auxiliary / locus / hidden circle), but the full interactive construction: helper constraint objects (e.g. the circumcircle a point rides on) are kept but hidden, so dragging a driver point keeps every condition satisfied. For hands-on exploration of the original figure itself.
- 动态理解图 (dynamic teaching) — the SAME construction PLUS teaching aids
(the revealed hidden circle, the fold, medians, a locus, annotations, live
Angle/Distancereadouts) on a single toggleable layer (a显示辅助checkbox). Unchecking it returns the view to the exact original.
Relationship: 1 and 2 show the identical clean content (= the print) — 静态复刻图 is
the faithful still, 干净可交互图 is the same figure meant to be dragged; 3 = the
干净可交互图 plus the toggle-gated teaching layer. Suggested filenames per figure:
<fig>_static.ggb, <fig>_clean.ggb, <fig>_dynamic.ggb.
Hard rules
- Never hand-write
geogebra.xml. Drive the real GeoGebra engine in a browser (its JS API) and export withgetBase64()— the only way to guarantee a valid file. (Hand XML breaks on internal command names, path parameters, perspectives.) - Encode the problem's conditions as real dependencies — in all three files. A figure is NOT a pile of free points. Only the genuine degrees of freedom are draggable (driver points); every other point is derived by a construction that enforces a condition (concyclic, on-line, intersection, reflection/fold, midpoint, perpendicular, given angle/length, locus…). Dragging any driver point must move the whole figure while every condition stays satisfied. This includes the 静态复刻图 — it is a clean render of the constrained construction, not free dots.
- Match the original exactly by measuring it — never eyeball coordinates.
Point coordinates, segment lengths, and angle ratios must equal the printed
figure. Crop + zoom each subfigure, read precise pixel coordinates of every
labeled point, convert to a clean coordinate frame, and verify lengths/angles
before AND after building. Driver points take the measured coordinates, so the
constrained construction reproduces the drawing.
Exception: when a figure is a 示意图 (explicitly not to scale) yet the problem
gives exact metric values (e.g.
∠BAC=90°,BC=8), honor the given values (they define the true figure) and use measurement for orientation/layout and for the positions of genuinely-free points. - Final content = the original, no more no less — verify, then delete the
scaffolding. You MAY temporarily add measurement objects (extra
Angle/Distance, ratio checks) to confirm coordinates, segment lengths, and angle ratios match the image; once confirmed you MUSTDelete(...)every such verification object before export (delete, NOT hide — a hidden object still lives in the file). Keep three object categories straight: original marks → shown · construction helpers that enforce conditions → kept but hidden · verification scaffolding → deleted. Teaching aids exist only in the 动态理解图, gated behind the显示辅助toggle. See recipes §4c–§4d.
Requirements
- A browser tool: navigate, evaluate JavaScript (CDP
Runtime.evaluate), screenshot. - Internet (generator page loads GeoGebra from geogebra.org's CDN).
python3(helper server + measuring the image).
Stage checklist
- [ ] A. Understand + measure: solve; write the CONDITION LIST; MEASURE the image (crop+zoom, read pixel coords of every labeled point); convert to clean coords; verify lengths/angles.
- [ ] B. Model as a constraint graph: split driver (free) vs derived points; map each condition to a construction; plan the three renders (静态复刻=faithful still, 干净可交互=clean+draggable, 动态理解=+toggle aids). Only true DOF draggable.
- [ ] C. Generate via the GeoGebra engine (server + browser); export all three .ggb per figure.
- [ ] D. Validate: compare coords/lengths/angles vs the image; DRAG-TEST every condition holds; confirm no leftover aids/verification marks; round-trip re-open.
- [ ] E. Deliver: list files (three per figure) + the sandbox-safe way to open them.
A. Understand & measure the original
- Solve the geometry (exact positions, invariants, answer). Verify with a
quick
python3script when there is real computation (loci, minima, lengths). - Write the condition list — every relationship the problem states or
implies. Example:
∠ADB=∠ACB ⇒ A,B,C,D concyclic;E = AD ∩ BC;fold ⇒ F = reflection of D over BC;H = midpoint AC;△BEK∼△AEH;∠BAC=90°, ∠ACB=30°, BC=8. This list drives Stage B. - Measure the image (mandatory — no eyeballing). For each subfigure: crop it and upscale ≥4×; read the pixel coordinates of every labeled point; convert to a clean frame (flip y, anchor one point at the origin, choose a scale so a key length is round); record all coordinates. Then verify the measured coords reproduce the drawn shape (segment-length ratios, angles) and fit the condition list. See recipes §4a.
B. Model as a constraint graph (per figure)
- Classify points using the condition list:
- Driver (free) points — the minimal set with genuine freedom (often the
triangle's vertices, plus one point constrained to a circle/line, e.g.
D=Point(c)). Place drivers at the measured coordinates. - Derived points — everything a condition determines (
Intersect,Reflect,Midpoint, spiral similarity,Locus…). Lock them to the conditions; never leave them free. - Map each condition → a construction (recipes §4b table).
- Driver (free) points — the minimal set with genuine freedom (often the
triangle's vertices, plus one point constrained to a circle/line, e.g.
- Three renders from the SAME graph:
- 静态复刻图: hide helper-only objects (a circle used only to constrain a
point, helper lines used only for
Intersect); show ONLY the original's points + segments + its own angle ticks; axes/grid off; no annotations. The faithful print-matching still. - 干净可交互图: the same clean content as the 静态复刻图 (helpers hidden;
only the original's marks; no text, no aids, no visible auxiliary/locus/hidden
circle), delivered as the full interactive construction — dragging a driver
keeps all conditions. In practice: the 动态理解图 with its teaching layer
removed (no
显示辅助checkbox, all aids hidden), or the 静态复刻图 explicitly presented for dragging. - 动态理解图: build the teaching aids (revealed hidden circle, fold,
medians, locus, descriptive
Text, liveAngle/Distance) and gate them all on one显示辅助checkbox (SetConditionToShowObject— recipes §4d), so the view collapses to the exact original when unchecked. Color by role. - For all three, delete all verification scaffolding before export (rule 4, recipes §4c).
- 静态复刻图: hide helper-only objects (a circle used only to constrain a
point, helper lines used only for
- Only true degrees of freedom are movable; derived points must not be free. Pick a clean view (axes off; ~1.34 aspect — recipes §3).
C. Generate the .ggb (reliable, verified path)
Start the server (serves the generator page, receives exports):
python3 scripts/ggb_server.py <OUTPUT_DIR> 8777
Run it in the background; it prints the URL and save location.
Open
http://localhost:8777/generator.html; evaluate the "wait until ready" snippet (recipes §1).Build → verify → clean → frame → export, once per render (three per figure). Evaluate a
(function(){var g=window.ggbApplet; … })()that resets, runs theevalCommandlist, and styles. Then:- Verify (scaffolding): optionally add temp
Angle/Distanceobjects and read them (getValue) to confirm lengths/angles match the measured image. - Clean per render:
Delete(...)every verification object (recipes §4c). · 静态复刻图 & 干净可交互图 → hide all helper/auxiliary objects (setVisible(false)), show only the original's marks, add NO text/aids/toggle. · 动态理解图 → gate teaching aids on the显示辅助checkbox (recipes §4d). setAxesVisible(false,false),setGridVisible(false),setCoordSystem(...), return a status. Screenshot — it must show only the original's marks (for the 动态理解图, also screenshot with hints OFF to confirm it equals the original). Then save:
fetch('/save?name=<figure>_<static|clean|dynamic>.ggb',{method:'POST',body:window.ggbApplet.getBase64()}).then(r=>r.text())
references/example-hidden-circle.mdhas complete, verified build blocks (静态复刻图 + 干净可交互图 + 动态理解图, with verify→delete and the toggle) to adapt.- Verify (scaffolding): optionally add temp
D. Validate
- Compare to the image: screenshot each figure and check point arrangement, segment lengths/ratios, and angle marks against the original crop. Fix until it matches.
- Marks = original, no more no less: every final file must show exactly the
original's points/segments/angle ticks — no leftover verification objects, no
visible auxiliary/locus/hidden circle, no stray marks. The 静态复刻图 and the
干净可交互图 show only the original's marks; for the 动态理解图, toggling
显示辅助OFF must reproduce the original exactly. - Drag-test the conditions (esp. the 干净可交互图 and 动态理解图): move each
driver point and confirm the whole figure follows and every condition still holds
(e.g.
∠ADBstays=∠ACB,Fstays the reflection,Kstays on its locus). If moving a "point" leaves the rest still, it was wrongly left free — turn it into a derived object. - Round-trip the most complex file (recipes §1);
unzip -l file.ggbshowsgeogebra.xml.
E. Deliver
- List each figure's three
.ggb: 静态复刻图 / 干净可交互图 / 动态理解图, and what's draggable. - How to open (macOS): the App Store GeoGebra Classic 6 is sandboxed and shows a blank window if a file is double-clicked or passed on the command line ("Cannot open file"). Open via ☰ menu → Open (打开) → From this device → pick the file, or drag the .ggb onto the GeoGebra window. The web app (geogebra.org/classic) and non-sandboxed desktop builds open files normally. (Details: recipes §5.6.)
Key gotchas (full list in references/geogebra-recipes.md §5)
- Use the 'AG' applet, never graphics-only 'G' — 'G' exports a broken perspective that opens blank on desktop.
- Export via the POST server; don't return base64 to yourself.
Reflect,Rotate,Dilate,Locus,Point(circle),Intersect,Midpointall work viaevalCommandinput syntax.- Spiral similarity:
K=Rotate(Dilate(H,Distance(E,B)/Distance(E,A),E), Angle(Vector(E,B))-Angle(Vector(E,A)), E), thenLocus(K,D). - Hidden ≠ removed: helper/auxiliary objects a construction depends on (the path circle,
Locus) must be hidden (setVisible false) in the 静态复刻图 / 干净可交互图, never deleted; only verification scaffolding is deleted. - Set axes off before export so a fresh open stays clean.
Resources
references/geogebra-recipes.md— commands, JS API, image-measuring recipe, condition→constraint table, gotchas.references/example-hidden-circle.md— a complete verified example (静态复刻图 + 干净可交互图 + 动态理解图, for 2 figures).scripts/ggb_server.py— serve generator + receive exported.ggb.templates/generator.html— loads the real GeoGebra engine (AG layout).
