--- name: project_optics_constructor description: Конструктор оптических систем в оптической скамье (BenchSim) — что это и как устроено metadata: node_type: memory type: project originSessionId: e04a2ab1-2fce-4387-9ec4-7f3f2fb6d65c --- Оптическая скамья (`frontend/js/labs/opticsbench.js`, ~4600+ строк) — это **7 режимов-вкладок**, каждый отдельный класс/canvas/панель: линза (`ThinLensSim`), зеркало (`MirrorSim`), преломление (`RefractionSim`), **Конструктор** (`BenchSim`), призма (`PrismSim`), интерференция (`InterferenceSim`), волны (`DiffractionSim`). Переключение — `obSwitchMode(mode)`. **Конструктор оптических систем** (май 2026, коммиты 832efc0…1c7d8e9) — режим `freebuild`, вкладка «Конструктор» (бывш. «Цепочка линз»). Класс `BenchSim` — общий 2D-трассировщик: - Элементы по `xf` (0..1), центр на оси: линза (f, ap), зеркало (kind plane/concave/convex, R, ap), диафрагма (gap), экран, призма (apex, n, size), **граница сред** (n1|n2, Снеллиус+ПВО), **стеклянная пластина** (n, t, параллельный сдвиг). Источник: предмет/точка/параллель/**одиночный луч**/**лазер**, с углом прицеливания `ang`. Линза/зеркало отсекают лучи вне апертуры (виньетирование); у собирающей линзы метки F/2F. - Трассировка `_traceRay`: ближайший элемент по ходу → `_interact` → дальше; лимит отражений (зеркала разворачивают ход). Линза — параксиальный кик θ'=θ−y/f (фокус в x+f). Призма — тонкопризменное δ=(n−1)·A + дисперсия `_nAtWavelength(n,λ)`. - Белый свет (общий λ-бар скамьи, `window._obWhiteLight`): пучки по `OB_SPECTRAL`, каждый луч красится `wavelengthToRGB(wl)` → после призмы спектр. Экран ловит изображение — светящиеся пятна (`_drawScreenHits`, additive). - UI: динамический инспектор (`_benchUpdateUI`, `bench-list`/`bench-props`), палитра `benchAdd(type)`, `benchSelect/benchUpdate/benchRemove`, пресеты `benchPreset` (микроскоп/телескоп/проектор/зеркальная), `benchExportPng`. ВАЖНО: слайдеры свойств вызывают `updateElement`→`_redraw` (только холст), НЕ `_changed` — иначе пересборка панели ломает drag слайдера. - Состояние: `benchSim.getState/setState`, проброшено в `_obGetState/_obApplyState` (снимок/embed). Старый `FreeBuildSim`/`freeSim` и функции `freeAddLens/freeLensF` — legacy, не используются (панель переведена на bench*). Ревью скамьи и план — `plans/OPTICS_CONSTRUCTOR.md`. Бэклог: точная двухгранная призма (Снеллиус на гранях), апертурное отсечение лучей вне линзы (сейчас проходят прямо), профиль интенсивности на экране, поворот элементов. Правило: при правке opticsbench.js поднимать `?v=N` у `