В balance-задании по мере ввода коэффициентов показывается счётчик атомов
каждого элемента слева=справа с ✓/✗ и бейджем «сбалансировано» (через
BIO.parseFormula). Обучающая обратная связь до отправки ответа.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(chemistry-8): не прокручивать страницу вниз при переключении параграфов
Автофокус поля ответа (renderTask) браузер сопровождал прокруткой к блоку
задач внизу секции, перебивая scrollTo(top:0). Добавлен focus({preventScroll:true}).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
Два edit'а Фазы 3 не применились в fc1139f (упали по отступу), запушив
сломанное состояние: lab.html убрал eager sim-скрипты, но open остался
синхронным -> ReferenceError при клике на любую симуляцию кроме graph.
ИСПРАВЛЕНО:
- _register-all.js: open-обёртка LabLoader.ensure(id).then(rawOpen) + sync-фолбэк
- lab-init.js openSim: обработка Promise от open() (.then -> lucide, .catch -> log)
E2E vm-harness: click->ensure->load->rawOpen после загрузки; pendulum/stereo:cube/
molphys(4 файла)/alias magnetic — ALL PASS; node --check OK.
Независимое ревью поймало этот блокер.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Старт /lab грузит только каркас (~530KB) вместо ~2.9MB + three.js(~600KB):
- _loader.js — LabLoader.ensure(id): грузит файлы симуляции по манифесту +
three.js при необходимости; кеш по URL; САМОВОССТАНОВЛЕНИЕ (если open-функция
не определена после загрузки — грузит все ленивые файлы -> корректность
гарантирована независимо от точности манифеста)
- _sim_deps.js — сгенерированный манифест SIM_DEPS{id:{open,files,three}} +
LAB_LAZY_FILES; three:true только для crystal/orbitals/stereo/periodic
- _register-all.js — open-обёртка: LabLoader.ensure(id).then(rawOpen)
- lab-init.js openSim — обработка Promise от open() (lucide после init)
- lab.html — убраны 45 ленивых <script> + three.js из eager; каркас: registry,
loader, sim_deps, fx-движки, общие визуалы, graph.js (GRID для 15 сим)
Проверка: vm-harness (per-sim load, three only 3D, кеш, self-heal) ALL PASS;
инвариант owner-in-files для всех 40; нет утечки ленивых в eager; node --check OK.
В БРАУЗЕРЕ НЕ ПРОВЕРЕНО.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 40 тел симуляций (~4420 строк) вынесены из lab.html в frontend/labs-bodies.html
- lab.html: 4880 -> 484 строк; тела заменены на #sim-bodies-host + синхронная
инъекция (XHR sync во время парсинга -> тела присутствуют до DOMContentLoaded,
сохраняя обработчики geometry.js и порядок инициализации)
- ctrl-бары и theory-panel ОСТАЮТСЯ в lab.html (в topbar)
- partial раздаётся существующим static middleware (frontendDir)
Гарантии: реконструкция before+region+after == оригинал побайтово;
id-мультимножество (newLab без host + partial) == оригинал; 40 sim-body div;
node --check glue/init OK. В БРАУЗЕРЕ НЕ ПРОВЕРЕНО (нужна ручная проверка).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Для «Предмет» + «Характ. лучи» (один предмет, одна линза):
- подписи лучей 1/2/3 у предмета
- точка изображения = пересечение финальных отрезков лучей 1 и 2
- стрелка-изображение (основание на оси → вершина в точке изображения)
- мнимое изображение: пунктирные продления расходящихся лучей назад к
мнимой точке (слева от линзы); подпись «изображение»/«мнимое изобр.»
- проверено численно: предмет за 2F → реальное справа, внутри F → мнимое слева
- bump opticsbench.js?v=10
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
lab.html подключает _pilots.js; файл попал в предыдущий коммит как удаление
(был в общем индексе от параллельной сессии). Возвращаю, чтобы не ломать
ссылку. Впредь коммичу строго по путям.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- источник «Предмет»: тумблер «Характ. лучи» (по умолчанию) / «Пучок»
- характеристические: 3 луча от вершины (параллельный→F', через центр,
через F→параллельно) + осевой от основания — как в учебнике; проверено
численно (F'=lensX+f, центр прямо, через F выход параллелен)
- пучок: прежний физичный веер + ползунок «Лучей» (густота) и «Раствор»
- setSource: rayMode как строковый ключ; bump opticsbench.js?v=9
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- источник можно двигать по вертикали: слайдер «Положение ↕» (для любого
типа) + вертикальное перетаскивание; эмиссия/отрисовка/хит-тест через _sy()
- фикс бага: FX-вспышка рисовалась на ay−source.h даже для точечного
источника (h оставалась 70) → «звезда» улетала вверх; теперь FX привязан
к реальной точке источника (поднятая вершина только у стрелки-предмета)
- object «Высота» → «Размер стрелки» (чтобы не путать с вертик. положением)
- bump opticsbench.js?v=8
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
В biochem-core.js добавлен расчёт химии из структуры (client-side, для всех
страниц): partialCharges (по разнице электроотрицательностей на связях),
dipole (векторная сумма q·r по 3D-координатам VSEPR), polarity (классификация
по дипольному моменту), massFractions, functionalGroups, analyze (единая точка).
chargeColor + поддержка opts.charges в render2D/render3D + стрелка диполя.
biochem.html: крудные эвристики _detectFG/_polarity/ATOMIC_MASS заменены на
BIO.analyze (−95 строк дублей); в панель свойств добавлен дипольный момент;
тумблер δ± — тепловая карта частичных зарядов (синий δ+/красный δ−) в 2D и 3D
плюс стрелка диполя.
Проверено: H2O O=−0.52/H=+0.26; CO2/CH4/CCl4 диполь 0 (неполярны);
H2O/CHCl3 полярны — симметрия гасит вектора за счёт настоящей 3D-геометрии.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ветка feature/lab-content-engine отделилась до Фазы 4 оптики, из-за чего
кнопки «+ Граница/+ Пластина» были без логики. Принёс полную Фазу 4
opticsbench.js с master (граница сред со Снеллиусом/ПВО, пластина, источники
луч/лазер, отсечение апертурой, F/2F, числовые слайдеры) и заново наложил
фикс выбора источника: постоянный чип «Источник» + выбор по умолчанию.
bump opticsbench.js?v=7
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- подключён _registry.js в lab.html (был отсутствует -> LabRegistry был undefined)
- регистрация 3 пилотов в _pilots.js (graph/quadratic/pendulum), подключён последним
- loadTheory (lab-glue.js) адаптирован: реестр в приоритете, иначе THEORY
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- выбор источника теперь всегда доступен: чип «Источник» в списке схемы
(раньше — только кликом по точке на холсте); источник выбран по умолчанию
- восстановлены потерянные кнопки палитры «+ Граница» / «+ Пластина»
- bump opticsbench.js?v=6
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Два дефекта, из-за которых 3D читался как плоская диаграмма:
- painter-сортировка была по возрастанию z (ближние первыми) — дальние
атомы рисовались поверх ближних. Теперь единый список примитивов
(атомы + половинки связей) сортируется по убыванию z (дальние первыми).
- связи были тонкими плоскими линиями. Теперь — затенённые «цилиндры»:
толстый штрих с поперечным градиентом (центр светлее, края темнее),
двухцветные (каждая половина под цвет своего атома) — фирменный вид
ball-and-stick. Ширина зависит от перспективы (ближе — толще).
- усилена перспектива (fov 900→700), добавлен тёмный ободок сфер для объёма.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Фаза 0.2 (DRY) + Фаза 1.5 (3D-превью) плана BIOCHEM_UPGRADE:
- library/properties/reactions подключают biochem-core.js; локальные
дубль-рендереры молекул заменены вызовами BIO.render2D; удалены
дублирующиеся таблицы ELEM_COLORS/CPK и hexToRgb/cpkColor (~250 строк).
- Библиотека: в детальной панели тумблер 2D/3D — вращающаяся VSEPR-модель
с подписью формы/гибридизации/угла.
- Свойства: на каждой карточке сравнения тумблер 2D/3D с вращением и
геометрией; thumbnail-и тоже через общий рендер.
- Fallback-и сохранены (колба в библиотеке, «?» в реакциях, «Нет
структуры» в свойствах).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
По итогам ревью системы прав:
- админка: переключатель режимов «По контенту» / «По классу»
- кнопки «Открыть всем классам» / «Закрыть у всех» (и зеркально по классу)
- бейджи N/M (сколько классов открыто) в списке контента
- эндпоинты /api/access/summary и /api/access/class/:id
- вкладка «Доступ к учебникам» перенесена к «Права доступа» (группа Пользователи)
- чистка content_access при удалении класса/ученика (нет FK)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Фаза 0 (фундамент) + Фаза 1 (3D) плана BIOCHEM_UPGRADE:
- Новый общий модуль frontend/js/biochem-core.js (window.BIO): реестр
элементов (CPK, масса, валентность, электроотрицательность, ковалентный/
ван-дер-ваальсов радиусы), hillFormula/molarMass/parseFormula/dbe,
нормализация связей (bF/bT/bO — чинит расхождение полей f/from, o/order),
render2D, vsepr (генератор 3D по ОЭПВО), render3D (ball-and-stick с
глубиной и затенением), safe (обёртка API с тостом), RING_TEMPLATES.
- biochem.html: подключён core; фейковый 3D (плоская проекция a.z||0)
заменён на честную VSEPR-геометрию через BIO.render3D; в панель свойств
добавлены форма молекулы, гибридизация и валентный угол; фикс бага
порядка связи в getBondSum.
VSEPR проверен: вода — угловая, метан — тетраэдр 109.5°, CO2 — линейная
180°, NH3 — пирамидальная; sp/sp2/sp3 верно.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- _drawScreenHits: светящиеся пятна (additive) в точках попадания лучей на
экран, по длине волны — видно формирование изображения и спектр
- benchExportPng + кнопка «Снимок PNG»; подсказка про λ/белый свет
- bump opticsbench.js?v=4
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- _prismInteract: тонкопризменное отклонение δ=(n−1)·A к основанию +
хроматическая дисперсия n(λ) через _nAtWavelength
- белый свет: пучки по OB_SPECTRAL, каждый луч красится по длине волны
(до призмы совпадают, после — расходятся в спектр); управление общим λ-баром
- _obRedraw для freebuild переключён на benchSim (был freeSim)
- сферические зеркала уже из Фазы 1; проверено численно (фиолет>красный)
- bump opticsbench.js?v=3
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Режим «Цепочка линз» → «Конструктор» на базе нового класса BenchSim:
- общий 2D-трассировщик: линза, зеркало (плоск./вогн./выпукл.), диафрагма,
экран; источники предмет/точка/параллель; лимит отражений
- фокус линзы в x+f и терминация зеркала проверены численно
- динамический инспектор: палитра элементов, список схемы, свойства
выбранного, удаление; слайдеры перерисовывают только холст (не ломают drag)
- pointer-слушатели на canvas (capture, dispose), выбор/перетаскивание
- пресеты: микроскоп/телескоп/проектор/зеркальная; сохранение состояния
в снимок (_obGetState/_obApplyState); bump opticsbench.js?v=2
- призма — пока грубый placeholder (Снеллиус/дисперсия в Фазе 2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1. БАГ В HillSlideSim (phys.js):
- При reset() начальное состояние x=0, h=hStart, v=0.
- Первый step(): dropped=0 → v=0 → x не растёт → h не падает → тележка
навсегда стоит на вершине (бесконечный нуль). Анимация ничего не показывала.
- Фикс: reset() даёт начальный толчок (x = L*0.01) и v по энергии для
этой малой высоты падения. step() теперь корректно ускоряет тележку.
- Тест node: за 2.05 с тележка проходит 11.7 м, h падает с 4.9 м до 0.86 м,
v растёт с 1.4 до 9.0 м/с. Е_полн ≈ const.
2. §22 «Сила тяжести» — новый IV-2 «Падение на 4 планетах»:
- SVG 4-колоночная сцена, 4 шарика стартуют с одной высоты.
- Slider высоты 2..20 м, кнопки «Уронить» / «Сброс».
- Свободное падение по h(t) = h₀ − gt²/2 для каждой планеты (Земля 9.8,
Луна 1.6, Марс 3.7, Юпитер 24.8).
- Видно: Юпитер падает первым, Луна последней; для каждого сохраняется
время падения √(2h/g) и итоговая v = g·t.
- Live info: текущее t, статус каждого шарика (падает / упал за X с,
v = Y м/с).
3. §24 «Вес тела» — переработан IV-1 «Лифт с динамометром»:
- Было: 4 статичных схемы покой/падение/верх/вниз.
- Стало: динамический симулятор. Кабина лифта со стрелкой ускорения
снаружи, внутри — груз на пружинном динамометре с шкалой.
- 2 slider'а: масса 0.5..10 кг, ускорение −10..+10 м/с².
- 4 кнопки-пресета: Покой / Едет вверх / Едет вниз / Свободное падение.
- Формула P = m(g + a) считается в реальном времени.
- 4 режима с автоопределением: ПОКОЙ / НЕВЕСОМОСТЬ / ПЕРЕГРУЗКА /
ПОНИЖЕННЫЙ ВЕС с разной цветовой индикацией.
- Пружина динамометра реально растягивается/сжимается в зависимости
от P; указатель и шкала тоже.
Parse OK, smoke (15 экспортов CH3) OK.
Карточка Физики 7 в каталоге показывалась с прозрачной обложкой и
нечитаемым (белым на светло-голубом) заголовком — потому что миграция
039_physics_7_hub.sql указывает color='sky', а класса .tb-cover.sky
в textbooks.html не было.
Добавлено 4 новых цвета в 3 секциях CSS (tb-cover / tb-progress / tb-btn.primary):
- sky (#0284c7) — для Физики 7 и других учебников с sky-палитрой
- red (#dc2626) — на будущее для огненных тем
- orange (#ea580c) — для активных физических курсов
- yellow (#ca8a04) — для математических курсов
Теперь карточка Физики 7 показывает читаемый белый текст на градиенте
sky-700 → sky-400, совпадающем с темой хаба физики 7.
ХАБ physics_7_hub.html:
- Подключён canvas-confetti с CDN (jsdelivr 1.6.0)
- Заменена старая ach-strip с одной ачивкой на полную панель .ach-section
с сеткой из 7 карточек: 5 ачивок глав + лаб + master
- Master-карточка выделена (grid-column: 1/-1, фиолетовый градиент при .lit)
- Каждая карточка: иконка (★ при .lit, ? до получения), название, описание условия
- Счётчик «N / 7 ачивок получено»
- renderAchievements() читает все 7 ключей из localStorage и подсвечивает
получённые, обновляется при focus
- При первом получении «Магистр физики 7» — confetti-залп в 3 волны (через
sessionStorage флаг, чтобы не запускать повторно при ре-открытии хаба)
- Текст финального аккордеона: «...по всем 5 главам» вместо «3»
ПЛАН plans/textbooks-7/PLAN_PHYSICS_7.md:
- Заголовок отмечен как «✅ ЗАВЕРШЁН» (Phase 0..8)
- Добавлена итоговая сводка реализации:
* Таблица 9 фаз с файлами, строками и коммитами
* Список 6 главных визуалов с указанием §
* Таблица 7 ачивок (slug / название / условие / XP)
* Оценка XP за полное прохождение (~3 550)
* Список фактически использованных хелперов phys.js
* Список уроков, учтённых с первого коммита (cache-busting, sidebar-фикс,
delimiters, скобки в KaTeX, self-sufficient миграция, без эмоджи)
Итог: 5-й физический курс в проекте, первый учебник 7 класса по физике.
8 фаз × несколько волн каждая = ~14 100 строк кода. Все интерактивы работают.
parse-check, smoke-test и pre-commit хуки пройдены на каждом этапе.
- _traceLine: p0 = основание перпендикуляра из начала координат (след
рисуется у фигуры, а не у далёкого пересечения с осью)
- фикс: после сброса/смены фигуры в пошаговом режиме step мог стать 0 →
сечение скрыто и шаги не рисуются; нормализация step≥1 в _drawSection3P
- подпись шага обновляется сразу после 3-го клика (в step-режиме)
- bump stereo.js?v=10
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Все 6 ЛР физики 7 закрыты. Файл phys7_lab_widgets.js (726 строк, 6 экспортов:
lr1..lr6). Палитра cyan. Подключение через обновлённый gen_phys7_lab.js:
script-тег + hook в goTo (удаление placeholder + вызов widgets).
Каждая ЛР содержит:
- Цель (goal card, голубая)
- Оборудование (equip card, оранжевая)
- Ход работы (steps card, фиолетовая) — пронумерованный список
- СИМ-виджет (интерактивная симуляция прибора)
- ТБЛ-виджет (таблица измерений)
- ВОПР-виджет (3 контрольных вопроса с авто-проверкой)
- Вывод (concl card, зелёная)
- Кнопка «Сдать ЛР» (+30 XP, localStorage-фиксация)
ЛР-1 «Цена деления» (§7):
- 4 виртуальных прибора (линейка/термометр/мензурка/динамометр) с SVG-шкалами
- Таблица C для всех 4
- 3 контрольных вопроса
ЛР-2 «Измерение длины» (§4, §7):
- 3 предмета на выбор (карандаш/тетрадь/брусок), SVG с линейкой ниже,
риска на длине + запись (l ± 0,5) мм
- Таблица 3 измерений
ЛР-3 «Объём вытеснением» (§4):
- 3 тела (камень/гайка/болт), 2 SVG-мензурки рядом (V1=100 и V2=100+V),
стрелка «опускаем» между ними, авто-расчёт V = V2 − V1
- Таблица 3 измерений
ЛР-4 «Неравномерное движение» (§18):
- Шарик на наклонной плоскости, slider угла 10..60°, кнопка «Запустить»,
анимация скатывания (квадратичная по времени, эмпирически быстрее на больших углах)
- Таблица 3 углов с разной средней скоростью
ЛР-5 «Плотность» (§20):
- 3 образца на выбор (54г/156г/272г, V=20 см³ каждый), SVG-весы+мензурка,
расчёт ρ = m/V и автоопределение материала (алюминий/железо/золото)
- Таблица плотностей 9 веществ
ЛР-6 «Сила трения» (§27):
- SVG: брусок с грузами, динамометр, разные поверхности из <select>
(дерево/пластик/резина/лёд: μ от 0.04 до 0.5)
- slider массы 100..500 г → авто N и Ftr через динамометр
- Таблица 5 измерений с разными грузами → видно Ftr ~ N
АЧИВКА «Лаборант 7 класса» +80 XP — автоматически при сдаче всех 6 ЛР
(проверка через localStorage в wireSubmit).
Парсинг OK, smoke (6 экспортов) OK.
Формулы в JS-литералах имели \\\\dfrac / \\\\\\\\dfrac (4/8 слэшей) вместо
\\dfrac (2). После JS-анескейпа KaTeX получал \\dfrac, трактовал \\ как
перенос строки и печатал dfrac/cdot/sqrt/pi как текст (карточка пирамиды и
конуса в geometry_11_ch2, и др.).
Схлопнуты прогоны слэшей кратные 4 перед LaTeX-командой -> 2. Прогоны из
3 слэшей (\\ перенос строки + \cmd в \begin{cases}) и перед x/цифрой не
тронуты. 150 правок в 7 файлах (algebra_11_ch1/ch2/ch3, geometry_11_ch1..ch4).
БД чиста: questions (1398) text/explanation/correct_text + options (5187) -
0 багов. Скрипт: backend/scripts/fix_overescaped_latex.js (идемпотентный,
dry-run по умолчанию, --apply, с KaTeX-валидацией).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Путь (b): надёжный полигон (есть) + аналитический след и вспом. точки.
- _traceLine(): след = π ∩ плоскость основания y=0 (проверено численно)
- _auxiliaryPoints(): продление сторон сечения до следа (dist=0 на следе)
- _hasBase()/_sameFace(): топология тел с основанием
- настоящий пошаговый _drawSection3PStep: 6 подписанных шагов, финал скрыт
до шага 5 (showFull); подписи в #sect3p-hint через _stepCaption
- scope: куб, параллелепипед, призма, пирамида, усеч. пирамида, тетраэдр
- bump stereo.js?v=9
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- openSim('stereo:<figure>') и /lab?stereofig=<figure> открывают нужное тело
(без изменения общего hash-роутера)
- клавиатура на canvas: стрелки=орбита, +/-=зум, R/Home=сброс
- aria-live на readout; bump stereo.js?v=8
- дробление файла на модули отложено по решению пользователя (в бэклоге)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- live-readout overlay: тип сечения, площадь, периметр, последнее измерение
(через info().readout; _notify добавлен в section/measure-пути)
- _raycastFace(): в режиме точек клик по грани ставит точку на поверхности
- подписи вершин сечения буквами K,L,M… (наклонное/произвольное/3-точки, ≤12 вершин)
- bump stereo.js?v=6
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Глава 3 «Движение и силы» закрыта целиком. Файл вырос с 1082 до 2124 строк
(+1042). Экспортирует 15 функций: p14..p27 + final3.
§21 Сила:
- 3 карточки (что такое сила / стрелка-вектор / 4 силы из жизни)
- IV-1 СИМ: интерактивная стрелка силы с slider модуля и угла (0..360°)
- DnD 8→4 (Ft/Fупр/Fтр/N) / квиз 4 / тренажёр 4
§22 Сила тяжести:
- 3 карточки + IV-1 КАЛЬК: 4 кнопки планет (Земля/Луна/Марс/Юпитер) + slider m
→ Ft = mg с правильным g, выводом и подписью планеты
- DnD 6→3 (1Н/10Н/100Н) / квиз 4 / тренажёр 5
§23 Сила упругости:
- 3 карточки (когда возникает / Гук качественно / примеры)
- IV-1 СИМ: SVG-пружина с подвешенным грузом, slider Δl=0..20 см → растягивается,
стрелки Fупр↑ (зелёная) и Fт↓ (фиолетовая)
- DnD 6→2 (есть/нет деформации) / квиз 3 / тренажёр 4
§24 Вес тела:
- 3 карточки (P vs Ft / невесомость / взвешивание)
- IV-1 СИМ: 4 ситуации (покой / падение / ускорение вверх=перегрузка / вниз),
для каждой — стрелки Ft (фиолет, на тело) и P (индиго, на опору)
- DnD 6→3 (Ft/P/P=0) / квиз 4 / тренажёр 4
§25 Динамометр:
- 3 карточки + IV-1 СИМ: использует window.PHYS.dynamometer из phys.js,
slider F и Fmax → SVG с пружиной, шкалой, указателем; warning при превышении
- IV-2 КАЛЬК m = F/g с выбором планеты
- DnD 6→3 (школьный/мед./пром.) / тренажёр 4
§26 СЛОЖЕНИЕ СИЛ — ГЛАВНЫЙ ВИЗУАЛ ГЛАВЫ 3:
- 3 карточки (равнодействующая / сонапр/противопол / перетягивание каната)
- IV-1 «Конструктор сил на теле»: 4 slider'а Ft↓ + N↑ + Fтяги→ + Fтр←,
SVG-сцена с цветными стрелками от центра кубика и большой красной стрелкой R;
вердикт «уравновешены / ускоряется вправо/влево/падает/подпрыгнет/под углом»
- IV-2 КАЛЬК сложения 2 сил с переключателем сонапр./противопол.
- IV-3 DnD 6→3 (R вправо/влево/0) / тренажёр 5
§27 Сила трения:
- 3 карточки (откуда / виды / польза vs вред)
- IV-1 СИМ-симулятор: slider m, F, выбор μ из 4 поверхностей (лёд / сталь /
дерево / резина-асфальт). SVG с бруском, стрелками F→ и Fтр←, вердикт
«ЕДЕТ / ПОКОИТСЯ» по сравнению F с μN
- DnD 6→2 (полезно/мешает) / квиз 4 / тренажёр 5
ФИНАЛ ГЛАВЫ 3 (10 боссов + ачивка «Мастер движения» +50 XP):
1. v = s/t (20 м/с)
2. Средняя скорость с равным временем (7 м/с)
3. Плотность бруска → железо (7.8 г/см³)
4. Ft на Земле (39.2 Н)
5. Ft того же тела на Луне (6.4 Н)
6. Динамометр → масса (750 г)
7. R двух сил противоположных (12 Н)
8. R трёх сил на одной прямой (10 Н)
9. Сила трения скольжения (6 Н)
10. Магистр: брусок едет, Fтр_max < F, R = ? (2 Н)
Все интерактивы wireDnd/wireQuiz/слайдеры/SVG привязаны. Parse OK, smoke OK.
- _sliceCurvedByNormal(): аналитическое сечение шара (окружность) и
цилиндра/конуса/усеч.конуса (гладкая кривая через точное y(θ)); старый
сэмплинг оставлен fallback'ом для почти вертикальных плоскостей
- _edgePickNDC(): корректный пикинг ребра по всей длине (было — по середине)
- _makeTextSprite: DPR-aware, аспект по тексту, обводка, анизотропия
- тип сечения кривых = окружность/эллипс; вершинные маркеры cap ≤12 точек
- bump stereo.js?v=5
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- lab-init: _pauseAllSims() паузит активный rAF-сим при переключении (раньше стерео рендерило невидимый canvas вечно)
- stereo: render-on-demand через _invalidate()/_needsRender, loop засыпает и просыпается по взаимодействию
- pointer/touch-слушатели перенесены с window на canvas (pointer-capture), трекаются и снимаются в dispose()
- обработка webglcontextlost/restored + метод dispose()
- _clearGroup стал рекурсивным (устранена утечка вложенных групп), a11y-атрибуты на canvas
- bump stereo.js?v=3
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>