From 5eed248702f3626744530f7649240cad5873f4b7 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 24 Jun 2026 10:30:02 +0300 Subject: [PATCH] =?UTF-8?q?feat(trigcircle):=20=D0=A4=D0=B0=D0=B7=D0=B0=20?= =?UTF-8?q?2=20=E2=80=94=20=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20+=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D1=83=D0=BB=D1=8B=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При исследовании выяснилось: Пифагор (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) --- frontend/js/labs/trigcircle.js | 26 ++++++++++++++++++++++++++ frontend/labs-bodies.html | 4 ++++ 2 files changed, 30 insertions(+) diff --git a/frontend/js/labs/trigcircle.js b/frontend/js/labs/trigcircle.js index 7381563..cadb45b 100644 --- a/frontend/js/labs/trigcircle.js +++ b/frontend/js/labs/trigcircle.js @@ -1096,6 +1096,32 @@ if (typeof window !== 'undefined') window.TrigCircleSim = TrigCircleSim; `tg ${s.tan === undefined ? '—' : sg(s.tan)}`; } + // Точные значения + формула приведения (только для табличных углов) + 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 = 'Нетабличный угол — точных значений нет, см. приближённые выше.'; + } 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 = `
${degR}° = ${wrap} → приведение к ${beta}°
`; + } + const sgStr = v => (v !== undefined && v < -1e-9) ? '−' : ''; + const line = (nm, color, val) => { + const mid = reduce ? ` = ${sgStr(val)}${nm} ${beta}°` : ''; + return `
` + + `${nm} ${degR}°${mid}${_f(val)}
`; + }; + 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) document.getElementById('trigbar-angle').textContent = degStr; document.getElementById('trigbar-sin').textContent = _f(s.sin); diff --git a/frontend/labs-bodies.html b/frontend/labs-bodies.html index b7cebcf..9a4ed74 100644 --- a/frontend/labs-bodies.html +++ b/frontend/labs-bodies.html @@ -578,6 +578,10 @@
+ +
Точные значения · приведение
+
+
Табличные углы