§1 · Что такое AnimaGeo

AnimaGeo — Python-библиотека, которая переводит геометрические конструкции (написанные в Python-DSL или импортированные из .ggb) в SVG и MP4-анимации типографского качества. Ядро — поверх manim community, но весь пользовательский слой — про геометрию: Point, Polygon, Angle, а не про Mobject/Animation.

Что решает AnimaGeo

Типичный сценарий — у вас есть .ggb-файл из GeoGebra (учитель, методист, автор учебника) и нужен из него качественный SVG для статьи или MP4 для урока. Ручной перевод в manim — долго и хрупко: каждая точка, сегмент, угол требует отдельного Mobject, стили копируются вручную, подписи накладываются друг на друга.

AnimaGeo делает две вещи:

Пайплайн

Пайплайн: .ggb → ggb_parser → Construction → applyStyle → CreateMObject → SVG/MP4
Путь от .ggb до SVG/MP4. Стили применяются в applyStyle поверх распарсенной конструкции.
ШагКодЧто делает
1. Parseparsers/ggb_parser.py или parsers/dsl/XML из .ggb или Python-DSL (exec-движок) → список команд и сырых стилей (elem.ggb_raw)
2. Buildgeo/construction.pyТопологическая сортировка, ленивое построение: Point → Segment → Angle → …
3. StyleapplyStyle + ImportPolicyJSON-правила → elem.style. Политики решают, как конвертировать GGB-значения.
4. RenderCreateMObject + exportSVG / manimЭлементы → manim Mobject → Cairo (SVG) или manim-рендерер (MP4)

Во что выводит

Из одной конструкции AnimaGeo получает три рода вывода:

ДорожкаФорматыКогда
Статический векторSVG · PDF · EPS · TikZкниги, статьи, печать, LaTeX
RenderPNG · GIF · MP4 · WebM · MOVобучающие видео, анимированные доказательства
Интерактивный webJSXGraph (живой SVG)подвижные чертежи на сайте: тяни точки/слайдеры

Статика и render разбираются в §9 · Экспорт, интерактивные подвижные чертежи — в §10 · Веб-экспорт.

Hello World

Самая короткая программа — треугольник с подписями и углами. Попробуйте поменять координаты или удалить beta, нажмите Run.

hello.py
A = Point(-4.5, -2)
B = Point(4.5, -2)
C = Point(-0.5, 2.8)
p, a, b, c = Polygon(A, B, C)
alpha = Angle(B, A, C)
beta  = Angle(C, B, A)
gamma = Angle(A, C, B)

style(A, B, C, label_visible=True)
alpha.style.label_text = r'$\alpha$'
beta.style.label_text = r'$\beta$'
gamma.style.label_text = r'$\gamma$'
Базовый треугольник
Скачать: 01-basic.py guide_style.json

Ключевые моменты:

Меняем стили на лету

Тот же треугольник, но с явными overrides через elem.style. Любой элемент сцены имеет словарь style, в который можно положить 'stroke', 'fill', 'stroke_width_px', 'stroke_dash_ratio' и ещё десяток ключей.

styled.py · правьте геометрию, стили применяются через пример-шаблон
A = Point(-4, -1.8)
B = Point(4, -1.8)
C = Point(-0.8, 2.6)
p, a, b, c = Polygon(A, B, C)

style(A, B, C, label_visible=True)
p.style.fill = '#d6e5f6'
p.style.fill_opacity = 0.55
p.style.stroke = '#4d87c6'
p.style.stroke_width_px = 2.0
a.style.stroke_dash_ratio = 0.5
c.style.stroke = '#f15b5b'
Треугольник со стилями
Скачать: guide_style.json

В собственном скрипте (не в интерактиве) то же самое пишется напрямую в elem.style — после putCode:

scene.putCode("""
A = Point(-4, -1.8)
B = Point(4, -1.8)
C = Point(-0.8, 2.6)
p, a, b, c = Polygon(A, B, C)
""")

scene.element('p').style['fill'] = '#d6e5f6'
scene.element('p').style['fill_opacity'] = 0.55
scene.element('p').style['stroke'] = '#4d87c6'
scene.element('p').style['stroke_width_px'] = 2.0
scene.element('a').style['stroke_dash_ratio'] = 0.5
scene.element('c').style['stroke'] = '#f15b5b'
DSL внутри putCode принимает только геометрические конструкторы — Point, Segment, Polygon и т.д. Присваивания вида elem.style[...] = ... — обычный Python, пишутся после putCode(), через scene.element(name). В интерактивных примерах гайда стили передаются через data-example.overrides.

Подписи и автораскладка

В AnimaGeo подписи — не часть элемента, а отдельный Tex, размещённый рядом. Положение задаётся парой: якорь (9-точечная сетка TL/TC/TR…BR) и pixel-offset. Проблема: если подписей много, они перекрывают геометрию. Решение — scene.autoPlaceLabels(): жадный решатель, 8 кандидатов на каждую подпись, приоритет по степени свободы.

autolayout.py
A = Point(-2, 1.5)
B = Point(2, 1.5)
C = Point(0, -1.5)
s1 = Segment(A, C)
s2 = Segment(B, C)
s3 = Segment(A, B)
M = Midpoint(A, B)
D = Midpoint(A, C)
E = Midpoint(B, C)

style(A, B, C, D, E, M, label_visible=True)
Авто-раскладка подписей
Скачать: guide_style.json

Включение авто-раскладки описано в JSON-стиле под ключом overlay.label_placement — либо вызовом scene.autoPlaceLabels() напрямую. Полное описание — §6.

Что дальше

Следующие разделы гайда раскроют каждый шаг пайплайна подробнее: