fix(opticsbench): призма теперь даёт радугу — фикс геометрии + белый свет по умолчанию
Причины 'один луч, работает неправильно': 1. tangDir = efVec/efLen давал тангенциальное направление, при котором преломлённый луч внутри призмы уходил вниз в основание (sFace > 1), а не в выходную правую грань → внешнего луча не было 2. По умолчанию был включён моно-режим — пользователь видел один луч без дисперсии Исправлено: - tangDir = 90° по часовой от efNorm (efNorm.y, -efNorm.x) — теперь падающий луч при стандартных углах попадает в выходную грань правильно - При первом входе в режим призмы window._obWhiteLight = true → 6 спектральных лучей сразу видны (расхождение цветов) - Добавлена кнопка 'Белый / Моно' в панель призмы для переключения
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -3173,6 +3173,11 @@
|
||||
<input type="range" id="sl-prism-inc" min="0" max="75" step="1" value="30" oninput="prismParam('incAngle',this.value)" style="flex:1">
|
||||
</div>
|
||||
<div class="pp-hint" style="margin-bottom:8px">Тащи призму мышью: ← → вращение, ↕ угол луча</div>
|
||||
<div class="gp-section-title" style="margin-bottom:6px">Свет</div>
|
||||
<div style="display:flex;gap:5px;margin-bottom:10px">
|
||||
<button class="preset-btn active" id="ob-prism-white-btn" onclick="prismToggleWhite(true,this)" style="flex:1">Белый</button>
|
||||
<button class="preset-btn" id="ob-prism-mono-btn" onclick="prismToggleWhite(false,this)" style="flex:1">Моно</button>
|
||||
</div>
|
||||
<div class="gp-section-title" style="margin-bottom:6px">Пресеты</div>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px">
|
||||
<button class="preset-btn" onclick="prismPreset(1.5,30)">Стекло (n=1.5)</button>
|
||||
|
||||
Reference in New Issue
Block a user