From 970276915c8b2fa9850c5a824100d5156b4ed5fc Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Tue, 26 May 2026 18:45:06 +0300 Subject: [PATCH] =?UTF-8?q?fix(opticsbench):=20=D0=BF=D1=80=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B4?= =?UTF-8?q?=D0=B0=D1=91=D1=82=20=D1=80=D0=B0=D0=B4=D1=83=D0=B3=D1=83=20?= =?UTF-8?q?=E2=80=94=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=B3=D0=B5=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=B8=20+=20=D0=B1=D0=B5=D0=BB=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=81=D0=B2=D0=B5=D1=82=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Причины 'один луч, работает неправильно': 1. tangDir = efVec/efLen давал тангенциальное направление, при котором преломлённый луч внутри призмы уходил вниз в основание (sFace > 1), а не в выходную правую грань → внешнего луча не было 2. По умолчанию был включён моно-режим — пользователь видел один луч без дисперсии Исправлено: - tangDir = 90° по часовой от efNorm (efNorm.y, -efNorm.x) — теперь падающий луч при стандартных углах попадает в выходную грань правильно - При первом входе в режим призмы window._obWhiteLight = true → 6 спектральных лучей сразу видны (расхождение цветов) - Добавлена кнопка 'Белый / Моно' в панель призмы для переключения --- frontend/js/labs/opticsbench.js | 20 +++++++++++++++++++- frontend/lab.html | 5 +++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/frontend/js/labs/opticsbench.js b/frontend/js/labs/opticsbench.js index 0181e1b..8d57a76 100644 --- a/frontend/js/labs/opticsbench.js +++ b/frontend/js/labs/opticsbench.js @@ -2614,7 +2614,9 @@ class PrismSim { efNorm = { x: -efNorm.x, y: -efNorm.y }; } const eX = (v[0].x + v[2].x) / 2, eY = (v[0].y + v[2].y) / 2; - const tangDir = { x: efVec.x / efLen, y: efVec.y / efLen }; + /* tangDir = 90° CW rotation of efNorm so that positive incAngle + tilts the ray toward the apex side (natural source-from-left setup) */ + const tangDir = { x: efNorm.y, y: -efNorm.x }; const incRad = this.incAngle * Math.PI / 180; /* incDir = propagation direction (INTO the prism) */ const incDir = { @@ -3306,6 +3308,12 @@ function obSwitchMode(mode, silent) { if (!prismSim) { const cv = document.getElementById('ob-prism-canvas'); if (cv) prismSim = new PrismSim(cv); + /* enable white-light dispersion by default on first prism entry */ + if (window._obWhiteLight === false) { + window._obWhiteLight = true; + const wlBtn = document.getElementById('ob-prism-white-btn'); + if (wlBtn) wlBtn.classList.add('active'); + } } if (prismSim) { prismSim.fit(); prismSim.draw(); } _obDrawSpectrometer(); @@ -3459,6 +3467,16 @@ function prismPreset(n0, incAngle) { if (prismSim) prismSim.setParams({ n0, incAngle }); } +function prismToggleWhite(on, btn) { + window._obWhiteLight = !!on; + const wb = document.getElementById('ob-prism-white-btn'); + const mb = document.getElementById('ob-prism-mono-btn'); + if (wb) wb.classList.toggle('active', !!on); + if (mb) mb.classList.toggle('active', !on); + if (prismSim) prismSim.draw(); + _obDrawSpectrometer(); +} + /* ── Thin Lens controls ── */ function lensParam(name, val) { const v = parseFloat(val); diff --git a/frontend/lab.html b/frontend/lab.html index 54eb690..b73bcc6 100644 --- a/frontend/lab.html +++ b/frontend/lab.html @@ -3173,6 +3173,11 @@
Тащи призму мышью: ← → вращение, ↕ угол луча
+
Свет
+
+ + +
Пресеты