Files
Learn_System/plans/OPTICS_CONSTRUCTOR.md
T
Maxim Dolgolyov 832efc0907 feat(opticsbench): конструктор оптических систем — Фаза 1 (общий трассировщик)
Режим «Цепочка линз» → «Конструктор» на базе нового класса 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>
2026-05-30 12:35:41 +03:00

44 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Конструктор оптических систем (в составе оптической скамьи)
Цель: превратить режим «Цепочка линз» (`FreeBuildSim`, только линзы) в полноценный **конструктор оптических систем** на базе общего 2D-трассировщика лучей с разнотипными элементами.
Файлы: `frontend/js/labs/opticsbench.js` (новый класс `BenchSim`), панель `#ob-ctrl-freebuild` и canvas `ob-free-canvas` в `frontend/lab.html`, вкладка `ob-tab-freebuild` (переименовать «Конструктор»).
Опирается на: реестр состояния `_registerSimState('opticsbench', …)`, OB_FX-слой, инфраструктуру вкладок `obSwitchMode`.
Статус: [ ] todo · [~] в работе · [x] готово
## Архитектура — общий 2D-трассировщик
- Сцена: горизонтальная ось, элементы на позициях `xf` (0..1 по ширине), центр на оси.
- Луч `{x,y, dx,dy(ед.), wl, alive, bounces}`; трассировка: найти ближайший элемент по ходу → применить взаимодействие → продолжить (до выхода за холст / поглощения / лимита отражений).
- Источники: предмет-стрелка, точечный, параллельный пучок.
- Элементы (interact-функции):
- **Линза** (f, апертура): параксиальный «кик» θ' = θ y/f.
- **Зеркало** (плоское/вогнутое/выпуклое, R): разворот хода + кик θ' для сферического (f=R/2).
- **Диафрагма/щель** (зазор): поглощает вне зазора.
- **Экран/детектор**: поглощает, фиксирует точку (пятно/профиль).
- **Призма** (угол при вершине, n): преломление по Снеллиусу на двух гранях + дисперсия по λ.
## Фазы
### Фаза 1 — Ядро трассировщика + линза/зеркало/диафрагма/экран + источники — [x]
- [x] 1.1 Класс `BenchSim`: модель элементов, источник, выбор/перетаскивание (pointer-слушатели на canvas + capture, dispose).
- [x] 1.2 Трассировщик: линза (параксиальный кик, фокус в `x+f` — проверено численно), зеркало плоск./сфер. (разворот хода + кик, лимит отражений — без зацикливания), диафрагма (поглощение вне зазора), экран (фиксация точки); источники предмет/точка/параллель.
- [x] 1.3 Рендер: лучи по λ (`_obRayColor`), элементы с подписями, выделение, OB_FX-слой.
- [x] 1.4 Динамический инспектор: палитра «+ элемент» (линза/зеркало/диафрагма/экран/призма), список схемы, свойства выбранного, удаление. Слайдеры перерисовывают только холст (не ломают drag).
- [x] 1.5 Встроено в режим `freebuild` (вкладка «Конструктор»), пресеты систем (микроскоп/телескоп/проектор/зеркальная), сохранение состояния в снимок.
- Призма пока — грубый дефлектор-placeholder (настоящий Снеллиус в 2.2).
### Фаза 2 — Сферические зеркала + призма + дисперсия — [ ]
- [ ] 2.1 Вогнутое/выпуклое зеркало (кик f=R/2, разворот хода, лимит отражений).
- [ ] 2.2 Призма: Снеллиус на 2 гранях, дисперсия по длине волны, белый свет.
### Фаза 3 — Сохранение состояния + полировка — [ ]
- [ ] 3.1 Расширить `_obGetState/_obApplyState` на конструктор (снимок/embed).
- [ ] 3.2 Пресеты систем (микроскоп, телескоп, глаз, проектор), экспорт PNG.
- [ ] 3.3 Полировка: апертурное отсечение, подписи, тач, a11y.
---
История: создан 2026-05-30.