feat(trigcircle): Фаза 2 — точные значения + формулы приведения

При исследовании выяснилось: Пифагор (sin²+cos²=1, _pythBar) и знаки по четвертям
(_quadSigns) уже рисуются на canvas. Поэтому Фаза 2 даёт главное недостающее по программе —
блок «Точные значения · приведение»: для текущего угла показывает sin/cos/tg/ctg точными
значениями (½, √2/2, √3/2, √3/3, √3) и для нетривиальных четвертей — формулу приведения
к острому углу (напр. 150° = 180°−30°, cos 150° = −cos 30° = −√3/2). Нетабличный угол →
сообщение. Без KaTeX (чистый HTML + готовый форматтер _f), без новых зависимостей.

Verified: node --check; headless-смоук рендера 11/11 (150° приведение+знаки, 45° QI без
головы, 210° QIII tg+, 137° нетабличный). Эмодзи нет.

sec/csc (5-я/6-я функции) — вторичны для школьной программы, отложены (предложу опционально).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-24 10:30:02 +03:00
parent d395e1083b
commit 5eed248702
2 changed files with 30 additions and 0 deletions
+26
View File
@@ -1096,6 +1096,32 @@ if (typeof window !== 'undefined') window.TrigCircleSim = TrigCircleSim;
`<b style="color:#FFD166">tg ${s.tan === undefined ? '—' : sg(s.tan)}</b>`; `<b style="color:#FFD166">tg ${s.tan === undefined ? '—' : sg(s.tan)}</b>`;
} }
// Точные значения + формула приведения (только для табличных углов)
const fEl = document.getElementById('trig-formula');
if (fEl) {
const beta = Math.round(s.refDeg);
const degR = Math.round(s.deg);
const isTable = [0, 30, 45, 60, 90].some(b => Math.abs(s.refDeg - b) < 0.5);
if (!isTable) {
fEl.innerHTML = '<span style="color:var(--text-3);font-size:0.72rem;line-height:1.5">Нетабличный угол — точных значений нет, см. приближённые выше.</span>';
} else {
const reduce = (s.quadrant !== 1) && (beta === 30 || beta === 45 || beta === 60);
let head = '';
if (reduce) {
const wrap = s.quadrant === 2 ? `180° ${beta}°` : s.quadrant === 3 ? `180° + ${beta}°` : `360° ${beta}°`;
head = `<div style="font-weight:700;color:var(--violet);margin-bottom:5px">${degR}° = ${wrap} → приведение к ${beta}°</div>`;
}
const sgStr = v => (v !== undefined && v < -1e-9) ? '' : '';
const line = (nm, color, val) => {
const mid = reduce ? ` = ${sgStr(val)}${nm} ${beta}°` : '';
return `<div style="display:flex;justify-content:space-between;gap:8px;line-height:1.7">` +
`<span><b style="color:${color}">${nm} ${degR}°</b>${mid}</span><b>${_f(val)}</b></div>`;
};
fEl.innerHTML = head + line('sin', '#EF476F', s.sin) + line('cos', '#06D6E0', s.cos) +
line('tg', '#FFD166', s.tan) + line('ctg', '#7BF5A4', s.cot);
}
}
// Stats bar (nice fractions) // Stats bar (nice fractions)
document.getElementById('trigbar-angle').textContent = degStr; document.getElementById('trigbar-angle').textContent = degStr;
document.getElementById('trigbar-sin').textContent = _f(s.sin); document.getElementById('trigbar-sin').textContent = _f(s.sin);
+4
View File
@@ -578,6 +578,10 @@
<div id="trig-signs" style="text-align:center;font-size:0.72rem;color:var(--text-2)"></div> <div id="trig-signs" style="text-align:center;font-size:0.72rem;color:var(--text-2)"></div>
</div> </div>
<!-- Exact values + reduction formula (table angles) -->
<div class="gp-section-title" style="margin-bottom:8px">Точные значения · приведение</div>
<div id="trig-formula" style="margin-bottom:14px;font-size:0.78rem;color:var(--text);background:rgba(155,93,229,0.06);border:1px solid rgba(155,93,229,0.15);border-radius:10px;padding:9px 11px"></div>
<!-- Notable angles --> <!-- Notable angles -->
<div class="gp-section-title" style="margin-bottom:8px">Табличные углы</div> <div class="gp-section-title" style="margin-bottom:8px">Табличные углы</div>
<div style="display:flex;flex-wrap:wrap;gap:4px;margin-bottom:14px"> <div style="display:flex;flex-wrap:wrap;gap:4px;margin-bottom:14px">