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

4.6 KiB

Конструктор оптических систем (в составе оптической скамьи)

Цель: превратить режим «Цепочка линз» (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]

  • 1.1 Класс BenchSim: модель элементов, источник, выбор/перетаскивание (pointer-слушатели на canvas + capture, dispose).
  • 1.2 Трассировщик: линза (параксиальный кик, фокус в x+f — проверено численно), зеркало плоск./сфер. (разворот хода + кик, лимит отражений — без зацикливания), диафрагма (поглощение вне зазора), экран (фиксация точки); источники предмет/точка/параллель.
  • 1.3 Рендер: лучи по λ (_obRayColor), элементы с подписями, выделение, OB_FX-слой.
  • 1.4 Динамический инспектор: палитра «+ элемент» (линза/зеркало/диафрагма/экран/призма), список схемы, свойства выбранного, удаление. Слайдеры перерисовывают только холст (не ломают drag).
  • 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.