diff --git a/frontend/js/labs/trigcircle.js b/frontend/js/labs/trigcircle.js
index 4674e03..66406e8 100644
--- a/frontend/js/labs/trigcircle.js
+++ b/frontend/js/labs/trigcircle.js
@@ -1184,15 +1184,24 @@ if (typeof window !== 'undefined') window.TrigCircleSim = TrigCircleSim;
};
const degStr = s.deg.toFixed(1) + '°';
- // Panel values (nice fractions)
- document.getElementById('trig-v-sin').textContent = _f(s.sin);
- document.getElementById('trig-v-cos').textContent = _f(s.cos);
- document.getElementById('trig-v-tan').textContent = _f(s.tan);
- document.getElementById('trig-v-cot').textContent = _f(s.cot);
+ // Значения — KaTeX для дробей/корней, текст для простых чисел (быстро при перетаскивании).
+ const setMathVal = (id, v) => {
+ const el = document.getElementById(id); if (!el) return;
+ const lx = _latexVal(v);
+ if (/\\tfrac|\\sqrt|\\text/.test(lx)) el.innerHTML = _tex(lx);
+ else el.textContent = lx;
+ };
+ setMathVal('trig-v-sin', s.sin);
+ setMathVal('trig-v-cos', s.cos);
+ setMathVal('trig-v-tan', s.tan);
+ setMathVal('trig-v-cot', s.cot);
- // Angle badge + котерминальные углы (+360°·k)
+ // Угол: KaTeX (град = π-доля) + радианы + котерминальные (+360°·k)
+ const al = _angleLatex(s.angle);
+ const head = al ? `${Math.round(s.deg)}^\\circ = ${al}` : `${degStr}`;
document.getElementById('trig-angle-badge').innerHTML =
- `${degStr} = ${s.radLabel}
${s.angle.toFixed(4)} рад` +
+ `
${_tex(head)}
` +
+ `${s.angle.toFixed(4)} рад` +
`
+ 360°·k (котерминальные)`;
// Опорный (острый) угол — guarded (панель может не иметь элемента)
@@ -1238,12 +1247,12 @@ if (typeof window !== 'undefined') window.TrigCircleSim = TrigCircleSim;
}
}
- // Stats bar (nice fractions)
+ // Stats bar — значения тоже KaTeX (дроби/корни)
document.getElementById('trigbar-angle').textContent = degStr;
- document.getElementById('trigbar-sin').textContent = _f(s.sin);
- document.getElementById('trigbar-cos').textContent = _f(s.cos);
- document.getElementById('trigbar-tan').textContent = _f(s.tan);
- document.getElementById('trigbar-cot').textContent = _f(s.cot);
+ setMathVal('trigbar-sin', s.sin);
+ setMathVal('trigbar-cos', s.cos);
+ setMathVal('trigbar-tan', s.tan);
+ setMathVal('trigbar-cot', s.cot);
document.getElementById('trigbar-quad').textContent = ['I', 'II', 'III', 'IV'][s.quadrant - 1];
}
@@ -1261,6 +1270,24 @@ if (typeof window !== 'undefined') window.TrigCircleSim = TrigCircleSim;
return v.toFixed(3);
}
+ /* Рендер LaTeX → HTML через KaTeX (с фолбэком на сырой LaTeX, если katex ещё не готов). */
+ function _tex(latex) {
+ const K = window.katex;
+ return K ? K.renderToString(latex, { throwOnError: false, strict: false, displayMode: false }) : latex;
+ }
+ /* Юникод-метка π-доли ('7π/6','π/4','π','0') → LaTeX. */
+ function _piLabelToLatex(l) {
+ if (l === '0') return '0';
+ const conv = s => s.replace('π', '\\pi');
+ if (l.indexOf('/') >= 0) { const p = l.split('/'); return `\\tfrac{${conv(p[0])}}{${p[1]}}`; }
+ return conv(l);
+ }
+ /* Радиан текущего угла → LaTeX красивой π-доли по таблице 16 углов (или null). */
+ function _angleLatex(rad) {
+ for (const n of _TC_NOTABLE) if (Math.abs(rad - n.a) < 1e-6) return _piLabelToLatex(n.l);
+ return null;
+ }
+
/* ── KaTeX live preview ── */
/** Convert user ascii expression LaTeX string for KaTeX preview */