feat(alg10 W4): §9-§12 главы 1 (формулы преобразования)

Реализованы 4 формуло-ёмких параграфа главы 1:

§9 Формулы приведения:
- SVG единичной окружности с 4 цветными четвертями и знаками
  всех 4 функций в каждой (380x360, заголовочная плашка)
- Правило двух шагов с разбором примера cos(3π/2 − α) = −sin α
- Полная таблица 28 формул (4 функции × 7 видов аргумента)
- Интерактив 1: 8 заданий «приведи к острому»
- Интерактив 2: 8 заданий «вычисли значение»
- Босс §9: 5 этапов

§10 Сумма и разность углов:
- SVG-плакат с 8 формулами 580x280 (sin/cos зелёным+фиолетовым,
  tg в отдельной янтарной плашке)
- Мнемоника: знаки совпадают в sin, чередуются в cos
- Спойлер с классическим доказательством для cos(α−β) через
  теорему косинусов
- Применение к «нестандартным» углам (75°, 15°, 105°)
- Интерактив 1: 6 вычислений нестандартных углов
- Интерактив 2: 5 упрощений выражений
- Босс §10: 5 этапов

§11 Двойной аргумент:
- SVG окружности с углами α=35° и 2α=70° (одна над другой
  с разными цветными секторами)
- Формулы sin 2α, cos 2α (три формы!), tg 2α
- Когда какую форму cos 2α использовать
- Формулы понижения степени sin²α, cos²α
- Интерактив 1: 6 заданий на вычисление через данную sin/cos α
- Интерактив 2: 5 упрощений с двойным углом
- Босс §11: 5 этапов

§12 Преобразование суммы в произведение:
- SVG-плакат с 4 формулами + мнемоника
- Применение к решению уравнения sin 3x + sin x = 0
- Применение для упрощения дробей
- Интерактив 1: 5 преобразований
- Интерактив 2: 4 задачи «сколько корней у sin x ± sin nx = 0»
- Босс §12: 4 этапа (этот § покороче)

Обновлены ACH_LABELS (+p9-p12_done), bumpProgress, BUILDERS,
SIDEBARS (4 шпаргалки), TIPS (4 подсказки).

Глава 1 теперь готова на 12 из 13 параграфов — остался
только финал главы (6 боссов).

Файл вырос со 160 KB до 221 KB (2189 → 2998 строк).
This commit is contained in:
Maxim Dolgolyov
2026-05-29 11:19:56 +03:00
parent c590c32b41
commit 0903ef640a
+582 -4
View File
@@ -256,6 +256,10 @@ const ACH_LABELS = {
p6_done:'Графики tg x и ctg x — знаешь!',
p7_done:'Обратные тригонометрические — освоены!',
p8_done:'Тригонометрические уравнения — решаешь!',
p9_done:'Формулы приведения — мастер!',
p10_done:'Сумма и разность — твои!',
p11_done:'Двойной аргумент — лёгкость!',
p12_done:'Преобразование суммы — освоено!',
ch1_done:'Глава 1 — Тригонометрия пройдена!',
};
@@ -287,6 +291,10 @@ function bumpProgress(key, delta){
else if(key==='p6') achievement('p6_done');
else if(key==='p7') achievement('p7_done');
else if(key==='p8') achievement('p8_done');
else if(key==='p9') achievement('p9_done');
else if(key==='p10') achievement('p10_done');
else if(key==='p11') achievement('p11_done');
else if(key==='p12') achievement('p12_done');
else if(key==='final1') achievement('ch1_done');
}
}
@@ -364,10 +372,7 @@ function buildParaSelector(){
const BUILT=new Set();
const BUILDERS = { p1:()=>buildP1(), p2:()=>buildP2(), p3:()=>buildP3(), p4:()=>buildP4(),
p5:()=>buildP5(), p6:()=>buildP6(), p7:()=>buildP7(), p8:()=>buildP8(),
p9:()=>buildStub('p9','§9 — Формулы приведения'),
p10:()=>buildStub('p10','§10 — Синус, косинус, тангенс суммы и разности'),
p11:()=>buildStub('p11','§11 — Формулы двойного аргумента'),
p12:()=>buildStub('p12','§12 — Преобразование суммы в произведение'),
p9:()=>buildP9(), p10:()=>buildP10(), p11:()=>buildP11(), p12:()=>buildP12(),
final1:()=>buildStub('final1','Финал главы 1 — 6 боссов')
};
function ensureBuilt(id){ if(BUILT.has(id)) return; const fn=BUILDERS[id]; if(fn){ fn(); BUILT.add(id); } }
@@ -458,6 +463,43 @@ const SIDEBARS = {
['$\\cos x = 0$','$x = \\frac{\\pi}{2} + \\pi n$'],
['$\\cos x = 1$','$x = 2\\pi n$'],
]},
p9:{title:'Шпаргалка §9',rows:[
['Шаг 1','Знак — по четверти исх. функции'],
['Шаг 2','Имя меняется при $\\frac{\\pi}{2} \\pm \\alpha$, $\\frac{3\\pi}{2} \\pm \\alpha$'],
['','Не меняется при $\\pi \\pm \\alpha$, $2\\pi \\pm \\alpha$'],
['$\\sin(\\frac{\\pi}{2} - \\alpha)$','$= \\cos\\alpha$'],
['$\\cos(\\frac{\\pi}{2} - \\alpha)$','$= \\sin\\alpha$'],
['$\\sin(\\pi - \\alpha)$','$= \\sin\\alpha$'],
['$\\cos(\\pi - \\alpha)$','$= -\\cos\\alpha$'],
['$\\sin(\\pi + \\alpha)$','$= -\\sin\\alpha$'],
['$\\cos(\\pi + \\alpha)$','$= -\\cos\\alpha$'],
]},
p10:{title:'Шпаргалка §10',rows:[
['$\\sin(\\alpha + \\beta)$','$= \\sin\\alpha\\cos\\beta + \\cos\\alpha\\sin\\beta$'],
['$\\sin(\\alpha - \\beta)$','$= \\sin\\alpha\\cos\\beta - \\cos\\alpha\\sin\\beta$'],
['$\\cos(\\alpha + \\beta)$','$= \\cos\\alpha\\cos\\beta - \\sin\\alpha\\sin\\beta$'],
['$\\cos(\\alpha - \\beta)$','$= \\cos\\alpha\\cos\\beta + \\sin\\alpha\\sin\\beta$'],
['$\\tg(\\alpha + \\beta)$','$= \\frac{\\tg\\alpha + \\tg\\beta}{1 - \\tg\\alpha\\tg\\beta}$'],
['$\\tg(\\alpha - \\beta)$','$= \\frac{\\tg\\alpha - \\tg\\beta}{1 + \\tg\\alpha\\tg\\beta}$'],
['Пример','$\\sin 75° = \\sin(45° + 30°)$'],
]},
p11:{title:'Шпаргалка §11',rows:[
['$\\sin 2\\alpha$','$= 2\\sin\\alpha\\cos\\alpha$'],
['$\\cos 2\\alpha$','$= \\cos^2\\alpha - \\sin^2\\alpha$'],
['','$= 1 - 2\\sin^2\\alpha$'],
['','$= 2\\cos^2\\alpha - 1$'],
['$\\tg 2\\alpha$','$= \\frac{2\\tg\\alpha}{1 - \\tg^2\\alpha}$'],
['$\\sin^2\\alpha$','$= \\frac{1 - \\cos 2\\alpha}{2}$'],
['$\\cos^2\\alpha$','$= \\frac{1 + \\cos 2\\alpha}{2}$'],
]},
p12:{title:'Шпаргалка §12',rows:[
['$\\sin\\alpha + \\sin\\beta$','$= 2\\sin\\frac{\\alpha+\\beta}{2}\\cos\\frac{\\alpha-\\beta}{2}$'],
['$\\sin\\alpha - \\sin\\beta$','$= 2\\sin\\frac{\\alpha-\\beta}{2}\\cos\\frac{\\alpha+\\beta}{2}$'],
['$\\cos\\alpha + \\cos\\beta$','$= 2\\cos\\frac{\\alpha+\\beta}{2}\\cos\\frac{\\alpha-\\beta}{2}$'],
['$\\cos\\alpha - \\cos\\beta$','$= -2\\sin\\frac{\\alpha+\\beta}{2}\\sin\\frac{\\alpha-\\beta}{2}$'],
['Польза','решение уравнений'],
['Пример','$\\sin 3x + \\sin x$ → произведение'],
]},
};
const TIPS=[
@@ -469,6 +511,10 @@ const TIPS=[
{sec:'p6',html:'<b>tg x</b> имеет вертикальные асимптоты в $\\frac{\\pi}{2} + \\pi n$ (там, где $\\cos x = 0$). <b>ctg x</b> — в $\\pi n$ (там, где $\\sin x = 0$). Период <b>$\\pi$</b>, а не $2\\pi$ — это короче, чем у sin/cos.'},
{sec:'p7',html:'Главные значения: $\\arcsin$ и $\\arctg$ — <b>от $-\\frac{\\pi}{2}$ до $\\frac{\\pi}{2}$</b>; $\\arccos$ и $\\arcctg$ — <b>от $0$ до $\\pi$</b>. Это всегда!'},
{sec:'p8',html:'Перед формулой проверь: <b>$|a| > 1$ для sin и cos — корней НЕТ</b>. Если $a = 0, \\pm 1$ — используй <b>особые случаи</b>, они проще общих формул.'},
{sec:'p9',html:'Шаг 1: <b>знак</b> в правой части — по знаку исходной функции в той четверти, куда попадает аргумент при <b>остром $\\alpha$</b>. Шаг 2: <b>имя</b> меняется при $\\frac{\\pi}{2} \\pm \\alpha$ и $\\frac{3\\pi}{2} \\pm \\alpha$, не меняется при $\\pi \\pm \\alpha$ и $2\\pi \\pm \\alpha$.'},
{sec:'p10',html:'Запомнить помогает мнемоника: <b>знаки повторяются в sin</b> (sin·cos + cos·sin) и <b>чередуются в cos</b> (cos·cos sin·sin). Для разности — наоборот.'},
{sec:'p11',html:'Три формы $\\cos 2\\alpha$ нужны для разных задач: $\\cos^2 - \\sin^2$ — для упрощения; $1 - 2\\sin^2$ — когда задан $\\sin\\alpha$; $2\\cos^2 - 1$ — когда задан $\\cos\\alpha$.'},
{sec:'p12',html:'4 формулы — все имеют вид «2 · функция полусуммы · функция полуразности». Знаки и тип функции в правой части смотри по таблице (или по правилу для каждой формулы).'},
];
function buildSidebar(id){
@@ -2242,6 +2288,538 @@ function buildP8(){
wireReadBtn('p8');
}
/* ============================================================
§ 9 — Формулы приведения
============================================================ */
function buildP9(){
const box = document.getElementById('p9-body');
const A = window.ALG10;
let html = '';
/* === SVG: единичная окружность со знаками по четвертям === */
let svgSigns = '';
if(A){
const c = A.tri.canvas({id:'p9-q', W:380, H:360, R:130});
let s = c.open
/* Заголовок */
+ '<rect x="0" y="0" width="'+c.W+'" height="44" fill="rgba(8,145,178,.08)"/>'
+ '<text x="'+(c.W/2)+'" y="22" text-anchor="middle" font-size="13" font-family="Unbounded,Inter,sans-serif" font-weight="800" fill="#0e7490">ЗНАКИ ТРИГОНОМЕТРИЧЕСКИХ ФУНКЦИЙ ПО ЧЕТВЕРТЯМ</text>'
+ '<text x="'+(c.W/2)+'" y="38" text-anchor="middle" font-size="10" font-family="Inter,sans-serif" font-style="italic" fill="#64748b">Шаг 1 правила приведения: какой знак ставить?</text>'
+ c.quadrant(1, {fill:'rgba(16,185,129,.16)'})
+ c.quadrant(2, {fill:'rgba(245,158,11,.16)'})
+ c.quadrant(3, {fill:'rgba(239,68,68,.13)'})
+ c.quadrant(4, {fill:'rgba(124,58,237,.13)'})
+ c.axes()
+ c.circle({width:2.5})
+ c.quadrantLabels()
/* Подписи знаков в каждой четверти */
/* I (правый верх) */
+ '<text x="270" y="135" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#065f46">sin +</text>'
+ '<text x="270" y="150" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#065f46">cos +</text>'
+ '<text x="270" y="165" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#065f46">tg, ctg +</text>'
/* II (левый верх) */
+ '<text x="110" y="135" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#065f46">sin +</text>'
+ '<text x="110" y="150" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#dc2626">cos </text>'
+ '<text x="110" y="165" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#dc2626">tg, ctg </text>'
/* III (левый низ) */
+ '<text x="110" y="225" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#dc2626">sin </text>'
+ '<text x="110" y="240" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#dc2626">cos </text>'
+ '<text x="110" y="255" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#065f46">tg, ctg +</text>'
/* IV (правый низ) */
+ '<text x="270" y="225" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#dc2626">sin </text>'
+ '<text x="270" y="240" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#065f46">cos +</text>'
+ '<text x="270" y="255" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="800" fill="#dc2626">tg, ctg </text>'
/* Пояснительная плашка снизу */
+ '<rect x="22" y="312" width="336" height="38" rx="8" fill="rgba(245,158,11,.10)" stroke="#f59e0b" stroke-width="1.5"/>'
+ '<text x="'+(c.W/2)+'" y="328" text-anchor="middle" font-size="10" font-family="Inter,sans-serif" font-weight="700" fill="#92400e">Запоминалка: tg и ctg положительны в I и III</text>'
+ '<text x="'+(c.W/2)+'" y="343" text-anchor="middle" font-size="10" font-family="Inter,sans-serif" font-weight="700" fill="#92400e">(там, где знаки sin и cos совпадают)</text>'
+ c.close;
svgSigns = s;
}
html += makeCard('theory', 'Зачем нужны формулы приведения', '9.1', `
<p>Все таблицы значений тригонометрии — это значения для <b>острых углов</b> ($0;\\,\\frac{\\pi}{2}$).</p>
<p>Если в задаче встретился угол вроде $\\dfrac{3\\pi}{2} - \\alpha$ или $\\pi + \\alpha$, формулы приведения позволяют <b>свести</b> его к функции острого угла $\\alpha$.</p>
<div class="svg-host">${svgSigns}</div>`);
html += makeCard('algo', 'Правило двух шагов', '9.2', `
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px"><b>Шаг 1. Знак.</b> Поставь в правой части тот знак, который имеет <b>исходная функция</b> в той четверти, куда попадает аргумент, считая $\\alpha$ острым.</p>
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px"><b>Шаг 2. Имя функции.</b></p>
<ul style="padding-left:22px;line-height:1.9">
<li>Если аргумент имеет вид <b>$\\dfrac{\\pi}{2} \\pm \\alpha$</b> или <b>$\\dfrac{3\\pi}{2} \\pm \\alpha$</b> — <b>имя меняется</b> (sin ↔ cos, tg ↔ ctg).</li>
<li>Если аргумент имеет вид <b>$\\pi \\pm \\alpha$</b> или <b>$2\\pi \\pm \\alpha$</b> — <b>имя не меняется</b>.</li>
</ul>
<p><b>Пример. Применим правило к $\\cos\\left(\\dfrac{3\\pi}{2} - \\alpha\\right)$:</b></p>
<ol style="padding-left:22px;line-height:1.9">
<li>Если $\\alpha$ острый, то $\\dfrac{3\\pi}{2} - \\alpha$ попадает в <b>III четверть</b>. В ней $\\cos < 0$, значит ставим знак <b>«минус»</b>.</li>
<li>Аргумент имеет вид $\\dfrac{3\\pi}{2} - \\alpha$ — <b>имя меняется</b>: cos → sin.</li>
</ol>
<p>Итог: $\\cos\\left(\\dfrac{3\\pi}{2} - \\alpha\\right) = -\\sin\\alpha$.</p>`);
html += makeCard('rule', 'Полная таблица формул приведения', '9.3', `
<div style="overflow-x:auto;margin:8px 0">
<table style="width:100%;border-collapse:collapse;font-size:.88rem;min-width:520px">
<tr style="background:var(--sec-acc-soft)">
<th style="padding:6px 8px;border:1px solid var(--border)">Аргумент</th>
<th style="padding:6px 8px;border:1px solid var(--border)">sin</th>
<th style="padding:6px 8px;border:1px solid var(--border)">cos</th>
<th style="padding:6px 8px;border:1px solid var(--border)">tg</th>
<th style="padding:6px 8px;border:1px solid var(--border)">ctg</th>
</tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$\\frac{\\pi}{2} - \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\ctg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\tg\\alpha$</td></tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$\\frac{\\pi}{2} + \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\ctg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\tg\\alpha$</td></tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$\\pi - \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\tg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\ctg\\alpha$</td></tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$\\pi + \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\tg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\ctg\\alpha$</td></tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$\\frac{3\\pi}{2} - \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\ctg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\tg\\alpha$</td></tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$\\frac{3\\pi}{2} + \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\ctg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\tg\\alpha$</td></tr>
<tr><td style="padding:6px 8px;border:1px solid var(--border)"><b>$2\\pi - \\alpha$</b></td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\sin\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$\\cos\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\tg\\alpha$</td><td style="padding:6px 8px;border:1px solid var(--border);text-align:center">$-\\ctg\\alpha$</td></tr>
</table>
</div>
<p style="font-size:.86rem;color:var(--muted);font-style:italic">Учить таблицу наизусть необязательно — достаточно знать правило двух шагов и применять его.</p>`);
html += makeCard('example', 'Применение для вычисления', '9.4', `
<p><b>Задача 1.</b> Вычисли $\\sin 120°$.</p>
<p>$\\sin 120° = \\sin(180° - 60°) = \\sin 60° = \\dfrac{\\sqrt{3}}{2}$.</p>
<p>Здесь имя не менялось ($\\pi - \\alpha$), знак $+$ (II четверть, sin положителен).</p>
<p><b>Задача 2.</b> Вычисли $\\cos 240°$.</p>
<p>$\\cos 240° = \\cos(180° + 60°) = -\\cos 60° = -\\dfrac{1}{2}$.</p>
<p>Имя не менялось ($\\pi + \\alpha$), знак $-$ (III четверть, cos отрицателен).</p>`);
/* === ИНТЕРАКТИВ 1: Приведи к острому === */
html += '<div class="wg" id="p9-iv1">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Приведи к функции острого угла</div></div>'
+'<div class="wg-help">Введи результат с правильным знаком. Например, $\\cos(\\pi - \\alpha) = -\\cos\\alpha$ — пиши «-cos a» или «-cosa».</div>'
+trainerHTML('p9-iv1', 8, 'результат')
+'</div>';
/* === ИНТЕРАКТИВ 2: Вычисли значение === */
html += '<div class="wg" id="p9-iv2">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Вычисли значение</div></div>'
+'<div class="wg-help">Сначала приведи к острому углу, затем подставь значение по таблице. Введи как дробь или десятичное число.</div>'
+trainerHTML('p9-iv2', 8, 'значение')
+'</div>';
/* === БОСС === */
html += '<h3 style="font-family:Unbounded,sans-serif;font-size:1.05rem;color:var(--pri2);margin:20px 0 12px">Босс §9 — Формулы приведения</h3>';
html += makeBoss('p9', {
color:'#0e7490',
title:'Босс §9 — Формулы приведения',
steps:[
{ q:'$\\sin(\\pi - \\alpha) = ?$ (вид «sin a» или «-sin a»)', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='sina'||s==='sin(a)'||s==='sinα';}, hint:'$\\pi - \\alpha$: II четверть, $\\sin > 0$; имя не меняется.' },
{ q:'$\\cos(\\frac{\\pi}{2} + \\alpha) = ?$ (имя меняется + знак)', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sina'||s==='-sin(a)'||s==='-sinα';}, hint:'II четверть, $\\cos < 0$; имя меняется cos → sin.' },
{ q:'Вычисли $\\sin 150°$. Введи как дробь (1/2).', verify:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='1/2'||+v===0.5;}, hint:'$\\sin 150° = \\sin(180° - 30°) = \\sin 30° = 1/2$.' },
{ q:'Вычисли $\\cos 210°$. Введи (-sqrt3/2).', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sqrt3/2'||s==='-√3/2'||Math.abs(+v - (-Math.sqrt(3)/2))<0.02;}, hint:'$\\cos 210° = \\cos(180° + 30°) = -\\cos 30° = -\\sqrt{3}/2$.' },
{ q:'$\\tg(\\frac{3\\pi}{2} - \\alpha) = ?$ (3 варианта: ctg a, -ctg a, tg a)', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='ctga'||s==='ctg(a)'||s==='ctgα';}, hint:'III четверть, $\\tg > 0$; имя меняется tg → ctg.' },
]
});
html += secNav('p8', 'p10') + readButton('p9');
box.innerHTML = html; renderMath(box);
/* IV1: приведение */
makeTrainer({
idPrefix:'p9-iv1',
parser:(v)=>v,
questions:[
{ q:'$\\sin(\\pi + \\alpha) = ?$ (sin a или -sin a)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sina'||s==='-sin(a)'||s==='-sinα';}, show:'$-\\sin\\alpha$' },
{ q:'$\\cos(2\\pi - \\alpha) = ?$', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='cosa'||s==='cos(a)'||s==='cosα';}, show:'$\\cos\\alpha$' },
{ q:'$\\sin(\\frac{\\pi}{2} - \\alpha) = ?$ (имя меняется)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='cosa'||s==='cos(a)'||s==='cosα';}, show:'$\\cos\\alpha$' },
{ q:'$\\cos(\\pi + \\alpha) = ?$', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-cosa'||s==='-cos(a)'||s==='-cosα';}, show:'$-\\cos\\alpha$' },
{ q:'$\\tg(\\pi - \\alpha) = ?$', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-tga'||s==='-tg(a)'||s==='-tgα';}, show:'$-\\tg\\alpha$' },
{ q:'$\\sin(\\frac{3\\pi}{2} + \\alpha) = ?$', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-cosa'||s==='-cos(a)'||s==='-cosα';}, show:'$-\\cos\\alpha$' },
{ q:'$\\cos(\\frac{3\\pi}{2} - \\alpha) = ?$', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sina'||s==='-sin(a)'||s==='-sinα';}, show:'$-\\sin\\alpha$' },
{ q:'$\\ctg(\\frac{\\pi}{2} + \\alpha) = ?$', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-tga'||s==='-tg(a)'||s==='-tgα';}, show:'$-\\tg\\alpha$' },
],
onComplete:(s,n)=>{ if(s===n){addXp(20,'p9-iv1');bumpProgress('p9',32);} else if(s>=5){addXp(10,'p9-iv1');bumpProgress('p9',15);} }
});
/* IV2: вычисли значение */
makeTrainer({
idPrefix:'p9-iv2',
parser:(v)=>v,
questions:[
{ q:'$\\sin 120° = ?$ (введи sqrt3/2)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='sqrt3/2'||s==='√3/2'||Math.abs(+v - Math.sqrt(3)/2)<0.02;}, show:'$\\sqrt{3}/2$' },
{ q:'$\\cos 150° = ?$ (введи -sqrt3/2)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sqrt3/2'||s==='-√3/2'||Math.abs(+v - (-Math.sqrt(3)/2))<0.02;}, show:'$-\\sqrt{3}/2$' },
{ q:'$\\sin 225° = ?$ (-sqrt2/2)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sqrt2/2'||s==='-√2/2'||Math.abs(+v - (-Math.sqrt(2)/2))<0.02;}, show:'$-\\sqrt{2}/2$' },
{ q:'$\\cos 300° = ?$ (1/2)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='1/2'||+v===0.5;}, show:'$1/2$' },
{ q:'$\\tg 135° = ?$ (-1)', a:(v)=>+v===-1, show:'$-1$' },
{ q:'$\\sin(-150°) = ?$ (-1/2)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='-1/2'||+v===-0.5;}, show:'$-1/2$' },
{ q:'$\\cos 240° = ?$ (-1/2)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='-1/2'||+v===-0.5;}, show:'$-1/2$' },
{ q:'$\\sin\\frac{5\\pi}{6} = ?$ (1/2)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='1/2'||+v===0.5;}, show:'$1/2$' },
],
onComplete:(s,n)=>{ if(s===n){addXp(20,'p9-iv2');bumpProgress('p9',32);} else if(s>=5){addXp(10,'p9-iv2');bumpProgress('p9',15);} }
});
wireReadBtn('p9');
}
/* ============================================================
§ 10 — Синус, косинус, тангенс суммы и разности
============================================================ */
function buildP10(){
const box = document.getElementById('p10-body');
let html = '';
/* === SVG: красивая плашка с 8 формулами === */
const svgFormulas =
'<svg viewBox="0 0 580 280" preserveAspectRatio="xMidYMid meet" style="width:100%;height:auto;display:block;margin:0 auto;background:#fff;border-radius:10px;border:1px solid #e2e8f0">'
+ '<rect x="0" y="0" width="580" height="44" fill="rgba(13,148,136,.08)"/>'
+ '<text x="290" y="22" text-anchor="middle" font-size="14" font-family="Unbounded,Inter,sans-serif" font-weight="800" fill="#0d9488">8 ФОРМУЛ СЛОЖЕНИЯ И ВЫЧИТАНИЯ УГЛОВ</text>'
+ '<text x="290" y="38" text-anchor="middle" font-size="10" font-family="Inter,sans-serif" font-style="italic" fill="#64748b">учат наизусть — это база для всей старшей тригонометрии</text>'
/* Колонка 1: sin/cos */
+ '<text x="40" y="78" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0d9488">sin(α + β) = sinα·cosβ + cosα·sinβ</text>'
+ '<text x="40" y="108" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#7c3aed">sin(α β) = sinα·cosβ cosα·sinβ</text>'
+ '<text x="40" y="138" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0d9488">cos(α + β) = cosα·cosβ sinα·sinβ</text>'
+ '<text x="40" y="168" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#7c3aed">cos(α β) = cosα·cosβ + sinα·sinβ</text>'
/* tg отдельно */
+ '<rect x="20" y="190" width="540" height="76" rx="10" fill="rgba(245,158,11,.10)" stroke="#f59e0b" stroke-width="1.5"/>'
+ '<text x="290" y="208" text-anchor="middle" font-size="11" font-family="Unbounded,Inter,sans-serif" font-weight="800" fill="#92400e">ТАНГЕНСЫ</text>'
+ '<text x="40" y="232" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#92400e">tg(α + β) = (tgα + tgβ) / (1 tgα·tgβ)</text>'
+ '<text x="40" y="256" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#92400e">tg(α β) = (tgα tgβ) / (1 + tgα·tgβ)</text>'
+ '</svg>';
html += makeCard('rule', 'Формулы синуса и косинуса суммы/разности', '10.1', `
<p>Сложение углов в тригонометрии — это четыре формулы. Их нужно знать наизусть.</p>
<div class="svg-host">${svgFormulas}</div>
<p><b>Мнемоника:</b></p>
<ul style="padding-left:22px;line-height:1.85">
<li>В формулах <b>для sin</b> — знаки совпадают: $+ \\Rightarrow +$, $- \\Rightarrow -$.</li>
<li>В формулах <b>для cos</b> — знаки чередуются: $+ \\Rightarrow -$, $- \\Rightarrow +$.</li>
<li>В обеих формулах sin — структура «sin·cos + cos·sin»; в cos — «cos·cos $\\mp$ sin·sin».</li>
</ul>`);
html += makeCard('rule', 'Формулы тангенса', '10.2', `
<p>Тангенс суммы и разности выводятся делением sin на cos:</p>
<p style="text-align:center;font-size:1.1rem;margin:10px 0">$\\tg(\\alpha + \\beta) = \\dfrac{\\tg\\alpha + \\tg\\beta}{1 - \\tg\\alpha \\tg\\beta}$</p>
<p style="text-align:center;font-size:1.1rem;margin:10px 0">$\\tg(\\alpha - \\beta) = \\dfrac{\\tg\\alpha - \\tg\\beta}{1 + \\tg\\alpha \\tg\\beta}$</p>
<p>ОДЗ: $\\tg\\alpha$, $\\tg\\beta$ существуют, и знаменатель $\\ne 0$.</p>`);
html += makeCard('example', 'Применение для нестандартных углов', '10.3', `
<p>Многие «неудобные» углы — это суммы или разности из таблицы:</p>
<ul style="padding-left:22px;line-height:1.9">
<li><b>$75° = 45° + 30°$</b></li>
<li><b>$15° = 45° - 30°$</b></li>
<li><b>$105° = 60° + 45°$</b></li>
</ul>
<p><b>Пример. Вычисли $\\sin 75°$.</b></p>
<p>$\\sin 75° = \\sin(45° + 30°) = \\sin 45° \\cos 30° + \\cos 45° \\sin 30°$</p>
<p>$= \\dfrac{\\sqrt{2}}{2} \\cdot \\dfrac{\\sqrt{3}}{2} + \\dfrac{\\sqrt{2}}{2} \\cdot \\dfrac{1}{2} = \\dfrac{\\sqrt{6}}{4} + \\dfrac{\\sqrt{2}}{4} = \\dfrac{\\sqrt{6} + \\sqrt{2}}{4}$.</p>`);
html += makeCard('theory', 'Доказательство для cos(α − β)', '10.4', `
<details class="spoiler"><summary>Развернуть классическое доказательство</summary>
<div class="spoiler-body">
<p>Рассмотрим на единичной окружности точки $P_\\alpha = (\\cos\\alpha;\\sin\\alpha)$ и $P_\\beta = (\\cos\\beta;\\sin\\beta)$.</p>
<p>Квадрат расстояния между ними: $|P_\\alpha P_\\beta|^2 = (\\cos\\alpha - \\cos\\beta)^2 + (\\sin\\alpha - \\sin\\beta)^2 =$ $2 - 2(\\cos\\alpha\\cos\\beta + \\sin\\alpha\\sin\\beta)$.</p>
<p>С другой стороны, по теореме косинусов для треугольника $OP_\\alpha P_\\beta$ ($OP_\\alpha = OP_\\beta = 1$, угол между ними $\\alpha - \\beta$):</p>
<p>$|P_\\alpha P_\\beta|^2 = 1 + 1 - 2\\cos(\\alpha - \\beta) = 2 - 2\\cos(\\alpha - \\beta)$.</p>
<p>Приравниваем правые части и сокращаем: $\\cos(\\alpha - \\beta) = \\cos\\alpha\\cos\\beta + \\sin\\alpha\\sin\\beta$. ■</p>
<p>Остальные формулы выводятся отсюда заменой $\\beta \\to -\\beta$ и формулами приведения.</p>
</div></details>`);
/* === ИНТЕРАКТИВ 1: Вычисли нестандартный угол === */
html += '<div class="wg" id="p10-iv1">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Вычисли значение</div></div>'
+'<div class="wg-help">Разложи угол на сумму/разность табличных и применяй формулы сложения.</div>'
+trainerHTML('p10-iv1', 6, 'значение')
+'</div>';
/* === ИНТЕРАКТИВ 2: Упрости === */
html += '<div class="wg" id="p10-iv2">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Упрости / найди значение</div></div>'
+'<div class="wg-help">Используй формулы для свёртки выражения.</div>'
+trainerHTML('p10-iv2', 5, 'результат')
+'</div>';
/* === БОСС === */
html += '<h3 style="font-family:Unbounded,sans-serif;font-size:1.05rem;color:var(--pri2);margin:20px 0 12px">Босс §10 — Сумма и разность углов</h3>';
html += makeBoss('p10', {
color:'#0d9488',
title:'Босс §10 — Сумма и разность',
steps:[
{ q:'Чему равно $\\sin(\\alpha + \\beta) - \\sin(\\alpha - \\beta)$? Введи в виде "2sinX·cosY", т.е. цифру (коэффициент перед $\\cos\\alpha\\sin\\beta$).', verify:(v)=>+v===2, hint:'Раскрой обе формулы — выживет $2\\cos\\alpha\\sin\\beta$.' },
{ q:'Вычисли $\\cos 15° = \\dfrac{\\sqrt{6}+\\sqrt{2}}{?}$. Чему равен знаменатель?', verify:(v)=>+v===4, hint:'$\\cos 15° = \\cos(45° - 30°) = \\frac{\\sqrt{6}+\\sqrt{2}}{4}$.' },
{ q:'Если $\\sin\\alpha = 3/5$ (I четв.), найди $\\sin(\\alpha + \\frac{\\pi}{2})$. (Введи дробь например 4/5)', verify:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='4/5'||+v===0.8;}, hint:'$\\sin(\\alpha + \\pi/2) = \\cos\\alpha = 4/5$.' },
{ q:'$\\sin(\\alpha + \\pi) = ?$ Введи: «sin a», «-sin a», «cos a», «-cos a».', verify:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='-sina'||s==='-sin(a)'||s==='-sinα';}, hint:'По формуле или приведению: $-\\sin\\alpha$.' },
{ q:'$\\tg(45° + 45°) = ?$ (Введи число, $\\infty$ напиши как 9999)', verify:(v)=>+v===9999, hint:'$\\tg 90°$ не существует ($\\to \\infty$).' },
]
});
html += secNav('p9', 'p11') + readButton('p10');
box.innerHTML = html; renderMath(box);
/* IV1 */
makeTrainer({
idPrefix:'p10-iv1',
parser:(v)=>v,
questions:[
{ q:'$\\sin 75° = \\dfrac{\\sqrt{6}+\\sqrt{2}}{?}$. Знаменатель?', a:(v)=>+v===4, show:'$4$' },
{ q:'$\\cos 75° = \\dfrac{\\sqrt{6}-\\sqrt{2}}{?}$. Знаменатель?', a:(v)=>+v===4, show:'$4$' },
{ q:'$\\sin(45° + 45°) = ?$', a:(v)=>+v===1, show:'$1$' },
{ q:'$\\cos(60° - 60°) = ?$', a:(v)=>+v===1, show:'$1$' },
{ q:'$\\sin 30° \\cos 30° + \\cos 30° \\sin 30° = ?$ (используй формулу sin($60°$))', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='sqrt3/2'||s==='√3/2'||Math.abs(+v - Math.sqrt(3)/2)<0.02;}, show:'$\\sin 60° = \\sqrt{3}/2$' },
{ q:'$\\cos(\\alpha + \\beta) + \\cos(\\alpha - \\beta) = ?$ (как 2cos·cos: введи 2cosα·cosβ — целое число коэф.)', a:(v)=>+v===2, show:'$2\\cos\\alpha\\cos\\beta$ — коэф. 2' },
],
onComplete:(s,n)=>{ if(s===n){addXp(18,'p10-iv1');bumpProgress('p10',32);} else if(s>=3){addXp(9,'p10-iv1');bumpProgress('p10',14);} }
});
/* IV2 */
makeTrainer({
idPrefix:'p10-iv2',
parser:(v)=>v,
questions:[
{ q:'Если $\\sin\\alpha = 3/5$ ($\\alpha$ в I четв.), то $\\sin(\\alpha + \\pi/6) = ?$ (введи (3sqrt3+4)/10)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='(3sqrt3+4)/10'||Math.abs(+v - (3*Math.sqrt(3)+4)/10)<0.02;}, show:'$(3\\sqrt{3}+4)/10$' },
{ q:'$\\tg(45° + 30°) = ?$ (введи (sqrt3+1)/(sqrt3-1) или 2+sqrt3)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='2+sqrt3'||s==='2+√3'||Math.abs(+v - (2+Math.sqrt(3)))<0.02;}, show:'$2+\\sqrt{3}$' },
{ q:'$\\sin(\\alpha + \\beta)\\cos\\beta - \\cos(\\alpha + \\beta)\\sin\\beta = ?$ Введи как «sin a» (сократись по обратной формуле!)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='sina'||s==='sin(a)'||s==='sinα';}, show:'$\\sin\\alpha$' },
{ q:'$\\cos 50° \\cos 10° + \\sin 50° \\sin 10° = ?$ (введи как cos40 или 0.766)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='cos40'||Math.abs(+v - Math.cos(40*Math.PI/180))<0.02;}, show:'$\\cos 40°$' },
{ q:'$\\sin 105° = \\dfrac{\\sqrt{6}+\\sqrt{2}}{?}$. Знаменатель?', a:(v)=>+v===4, show:'$4$ ($\\sin 105° = \\sin 75°$, потому что $105° = 180° - 75°$)' },
],
onComplete:(s,n)=>{ if(s===n){addXp(18,'p10-iv2');bumpProgress('p10',32);} else if(s>=3){addXp(9,'p10-iv2');bumpProgress('p10',14);} }
});
wireReadBtn('p10');
}
/* ============================================================
§ 11 — Формулы двойного аргумента
============================================================ */
function buildP11(){
const box = document.getElementById('p11-body');
const A = window.ALG10;
let html = '';
/* === SVG: α и 2α на единичной окружности === */
let svgDouble = '';
if(A){
const c = A.tri.canvas({id:'p11-d', W:360, H:380, R:120});
const ang = 35 * Math.PI / 180; /* α = 35° */
const ang2 = 2 * ang; /* 2α = 70° */
let s = c.open
+ '<rect x="0" y="0" width="'+c.W+'" height="44" fill="rgba(13,148,136,.08)"/>'
+ '<text x="'+(c.W/2)+'" y="22" text-anchor="middle" font-size="13" font-family="Unbounded,Inter,sans-serif" font-weight="800" fill="#0d9488">УГОЛ α И ДВОЙНОЙ УГОЛ 2α</text>'
+ '<text x="'+(c.W/2)+'" y="38" text-anchor="middle" font-size="10" font-family="Inter,sans-serif" font-style="italic" fill="#64748b">Пример: α = 35°, 2α = 70°</text>'
+ c.axes()
+ c.circle({width:2.5})
/* Сектор α */
+ '<path d="M '+c.cx+' '+c.cy+' L '+(c.cx+34)+' '+c.cy+' A 34 34 0 0 0 '+(c.cx + 34*Math.cos(ang))+' '+(c.cy - 34*Math.sin(ang))+' Z" fill="rgba(13,148,136,.22)" stroke="#0d9488" stroke-width="1.5"/>'
+ '<text x="'+(c.cx+44)+'" y="'+(c.cy-8)+'" font-size="12" font-family="JetBrains Mono,monospace" font-weight="800" fill="#0f766e">α</text>'
/* Сектор 2α (поверх) */
+ '<path d="M '+c.cx+' '+c.cy+' L '+(c.cx+60)+' '+c.cy+' A 60 60 0 0 0 '+(c.cx + 60*Math.cos(ang2))+' '+(c.cy - 60*Math.sin(ang2))+' Z" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="1.5" stroke-dasharray="3 2"/>'
+ '<text x="'+(c.cx+72)+'" y="'+(c.cy-22)+'" font-size="12" font-family="JetBrains Mono,monospace" font-weight="800" fill="#6d28d9">2α</text>'
+ c.radius(ang, {color:'#0d9488', width:2.5})
+ c.radius(ang2, {color:'#7c3aed', width:2.5})
+ c.point(ang, {color:'#0d9488', label:'P_α', labelOffset:20, fontSize:12, labelColor:'#0f766e'})
+ c.point(ang2, {color:'#7c3aed', label:'P_{2α}', labelOffset:20, fontSize:12, labelColor:'#6d28d9'})
+ '<rect x="22" y="320" width="316" height="50" rx="10" fill="rgba(13,148,136,.10)" stroke="#0d9488" stroke-width="2"/>'
+ '<text x="'+(c.W/2)+'" y="338" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0f766e">sin 2α = 2 sin α · cos α</text>'
+ '<text x="'+(c.W/2)+'" y="358" text-anchor="middle" font-size="11" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0f766e">cos 2α = cos²α sin²α = 1 2sin²α = 2cos²α 1</text>'
+ c.close;
svgDouble = s;
}
html += makeCard('rule', 'Формулы двойного аргумента', '11.1', `
<p>Это частный случай формул сложения при $\\beta = \\alpha$:</p>
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px;font-size:1.1rem;text-align:center"><b>$\\sin 2\\alpha = 2\\sin\\alpha\\cos\\alpha$</b></p>
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px;font-size:1.1rem;text-align:center"><b>$\\cos 2\\alpha = \\cos^2\\alpha - \\sin^2\\alpha$</b></p>
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px;font-size:1.1rem;text-align:center"><b>$\\tg 2\\alpha = \\dfrac{2\\tg\\alpha}{1 - \\tg^2\\alpha}$</b></p>
<div class="svg-host">${svgDouble}</div>
<p><b>Вывод.</b> $\\sin 2\\alpha = \\sin(\\alpha + \\alpha) = \\sin\\alpha\\cos\\alpha + \\cos\\alpha\\sin\\alpha = 2\\sin\\alpha\\cos\\alpha$.</p>`);
html += makeCard('rule', 'Три формы для cos 2α', '11.2', `
<p>Используя $\\sin^2\\alpha + \\cos^2\\alpha = 1$, переписываем по-разному:</p>
<p style="text-align:center;font-size:1.05rem;margin:8px 0">$\\cos 2\\alpha = \\cos^2\\alpha - \\sin^2\\alpha$</p>
<p style="text-align:center;font-size:1.05rem;margin:8px 0">$\\cos 2\\alpha = 1 - 2\\sin^2\\alpha$</p>
<p style="text-align:center;font-size:1.05rem;margin:8px 0">$\\cos 2\\alpha = 2\\cos^2\\alpha - 1$</p>
<p><b>Когда какую использовать:</b></p>
<ul style="padding-left:22px;line-height:1.85">
<li>Если дано $\\sin\\alpha$ — бери <b>$1 - 2\\sin^2\\alpha$</b>.</li>
<li>Если дано $\\cos\\alpha$ — бери <b>$2\\cos^2\\alpha - 1$</b>.</li>
<li>Для упрощения выражений (например, разложения на множители) — бери <b>$\\cos^2 - \\sin^2$</b>.</li>
</ul>`);
html += makeCard('rule', 'Формулы понижения степени', '11.3', `
<p>Из формул для cos 2α выражаем sin² и cos²:</p>
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px;font-size:1.1rem;text-align:center"><b>$\\sin^2\\alpha = \\dfrac{1 - \\cos 2\\alpha}{2}$</b></p>
<p style="background:var(--sec-acc-soft);padding:10px 14px;border-radius:8px;font-size:1.1rem;text-align:center"><b>$\\cos^2\\alpha = \\dfrac{1 + \\cos 2\\alpha}{2}$</b></p>
<p>Это нужно, когда мы хотим избавиться от квадратов синуса/косинуса (например, в интегралах или для упрощения).</p>`);
html += makeCard('example', 'Применение', '11.4', `
<p><b>Задача 1.</b> $\\sin\\alpha = \\dfrac{3}{5}$, $\\alpha$ в I четверти. Найди $\\sin 2\\alpha$ и $\\cos 2\\alpha$.</p>
<p>$\\cos\\alpha = \\sqrt{1 - 9/25} = \\dfrac{4}{5}$.</p>
<p>$\\sin 2\\alpha = 2 \\cdot \\dfrac{3}{5} \\cdot \\dfrac{4}{5} = \\dfrac{24}{25}$.</p>
<p>$\\cos 2\\alpha = 1 - 2 \\cdot \\dfrac{9}{25} = 1 - \\dfrac{18}{25} = \\dfrac{7}{25}$.</p>
<p><b>Задача 2.</b> Упрости $\\sin 4x - \\sin 2x$, заменив $\\sin 4x$ через $\\sin 2 \\cdot 2x$.</p>
<p>$\\sin 4x = 2\\sin 2x\\cos 2x$, тогда $\\sin 4x - \\sin 2x = \\sin 2x(2\\cos 2x - 1)$.</p>`);
/* === ИНТЕРАКТИВ 1: Вычисли по данной cos α === */
html += '<div class="wg" id="p11-iv1">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Найди sin 2α, cos 2α по данным</div></div>'
+'<div class="wg-help">Дано: один из sin α / cos α + четверть. Найди указанную величину.</div>'
+trainerHTML('p11-iv1', 6, 'дробь')
+'</div>';
/* === ИНТЕРАКТИВ 2: Упрости === */
html += '<div class="wg" id="p11-iv2">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Упрости с двойным углом</div></div>'
+'<div class="wg-help">Свёртывай или раскрывай 2α там, где удобно.</div>'
+trainerHTML('p11-iv2', 5, 'результат')
+'</div>';
/* === БОСС === */
html += '<h3 style="font-family:Unbounded,sans-serif;font-size:1.05rem;color:var(--pri2);margin:20px 0 12px">Босс §11 — Двойной аргумент</h3>';
html += makeBoss('p11', {
color:'#0f766e',
title:'Босс §11 — Двойной аргумент',
steps:[
{ q:'Чему равно $2\\sin 15° \\cos 15°$? (Введи дробь как 1/2)', verify:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='1/2'||+v===0.5;}, hint:'Это $\\sin 30° = 1/2$.' },
{ q:'Если $\\sin\\alpha = 0{,}6$, найди $\\cos 2\\alpha$. (введи 0.28)', verify:(v)=>Math.abs(+v - 0.28)<0.01, hint:'$\\cos 2\\alpha = 1 - 2(0.6)^2 = 1 - 0.72 = 0.28$.' },
{ q:'Сколько решений у $\\sin 2x = 0$ на $[0;\\,\\pi]$?', verify:(v)=>+v===3, hint:'$2x = \\pi n$ ⇒ $x = 0, \\pi/2, \\pi$ — 3 значения.' },
{ q:'Чему равно $\\dfrac{1 - \\cos 2\\alpha}{2}$? Введи слово: «sin²» или «cos²».', verify:(v)=>{const s=String(v).replace(/[\\s²]/g,'').toLowerCase(); return s==='sin2'||s==='sin';}, hint:'Формула понижения для $\\sin^2$.' },
{ q:'Если $\\cos\\alpha = -4/5$, $\\alpha$ во II четв., найди $\\sin 2\\alpha$ (введи как -24/25 или -0.96)', verify:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='-24/25'||Math.abs(+v - (-0.96))<0.01;}, hint:'$\\sin\\alpha = 3/5$ (sin > 0 во II четв.), $\\sin 2\\alpha = 2 \\cdot 3/5 \\cdot (-4/5) = -24/25$.' },
]
});
html += secNav('p10', 'p12') + readButton('p11');
box.innerHTML = html; renderMath(box);
/* IV1 */
makeTrainer({
idPrefix:'p11-iv1',
parser:(v)=>v,
questions:[
{ q:'$\\sin\\alpha = 3/5$, $\\alpha$ в I четв. Найди $\\sin 2\\alpha$.', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='24/25'||+v===0.96;}, show:'$24/25 = 0{,}96$' },
{ q:'$\\sin\\alpha = 3/5$, $\\alpha$ в I четв. Найди $\\cos 2\\alpha$.', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='7/25'||+v===0.28;}, show:'$7/25 = 0{,}28$' },
{ q:'$\\cos\\alpha = 3/5$, $\\alpha$ в I четв. Найди $\\cos 2\\alpha$.', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='-7/25'||+v===-0.28;}, show:'$-7/25 = -0{,}28$' },
{ q:'$\\sin\\alpha = -1/3$, $\\alpha$ в III четв. Найди $\\cos 2\\alpha$ (введи 7/9)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='7/9'||Math.abs(+v - 7/9)<0.01;}, show:'$7/9$' },
{ q:'$\\tg\\alpha = 2$. Найди $\\tg 2\\alpha$ (введи -4/3)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='-4/3'||Math.abs(+v - (-4/3))<0.02;}, show:'$-4/3$' },
{ q:'$\\sin\\alpha = 0{,}8$, $\\alpha$ во II четв. Найди $\\sin 2\\alpha$ (-0.96)', a:(v)=>Math.abs(+v - (-0.96))<0.02, show:'$-0{,}96$' },
],
onComplete:(s,n)=>{ if(s===n){addXp(20,'p11-iv1');bumpProgress('p11',32);} else if(s>=4){addXp(10,'p11-iv1');bumpProgress('p11',15);} }
});
/* IV2 */
makeTrainer({
idPrefix:'p11-iv2',
parser:(v)=>v,
questions:[
{ q:'Чему равно $2\\sin 22{,}5° \\cos 22{,}5°$? (введи sqrt2/2 или 0.71)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='sqrt2/2'||s==='√2/2'||Math.abs(+v - Math.sqrt(2)/2)<0.02;}, show:'$\\sqrt{2}/2$ ($\\sin 45°$)' },
{ q:'$1 - 2\\sin^2 15° = ?$ (введи sqrt3/2)', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='sqrt3/2'||s==='√3/2'||Math.abs(+v - Math.sqrt(3)/2)<0.02;}, show:'$\\sqrt{3}/2$ ($\\cos 30°$)' },
{ q:'$\\dfrac{\\sin 2\\alpha}{2\\sin\\alpha} = ?$ Введи как «cos a».', a:(v)=>{const s=String(v).replace(/\\s/g,'').toLowerCase(); return s==='cosa'||s==='cos(a)'||s==='cosα';}, show:'$\\cos\\alpha$' },
{ q:'$\\cos^2 30° - \\sin^2 30° = ?$ (введи 1/2)', a:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='1/2'||+v===0.5;}, show:'$1/2$ ($\\cos 60° = 1/2$)' },
{ q:'$\\sin 100°\\cos 10° + \\cos 100°\\sin 10° = \\sin ?°$. Чему равен угол?', a:(v)=>+v===110, show:'$110°$ ($\\sin 110°$)' },
],
onComplete:(s,n)=>{ if(s===n){addXp(18,'p11-iv2');bumpProgress('p11',30);} else if(s>=3){addXp(9,'p11-iv2');bumpProgress('p11',14);} }
});
wireReadBtn('p11');
}
/* ============================================================
§ 12 — Преобразование суммы (разности) в произведение
============================================================ */
function buildP12(){
const box = document.getElementById('p12-body');
let html = '';
const svgFormulas =
'<svg viewBox="0 0 580 280" preserveAspectRatio="xMidYMid meet" style="width:100%;height:auto;display:block;margin:0 auto;background:#fff;border-radius:10px;border:1px solid #e2e8f0">'
+ '<rect x="0" y="0" width="580" height="44" fill="rgba(124,58,237,.08)"/>'
+ '<text x="290" y="22" text-anchor="middle" font-size="14" font-family="Unbounded,Inter,sans-serif" font-weight="800" fill="#7c3aed">4 ФОРМУЛЫ: СУММА → ПРОИЗВЕДЕНИЕ</text>'
+ '<text x="290" y="38" text-anchor="middle" font-size="10" font-family="Inter,sans-serif" font-style="italic" fill="#64748b">структура: 2 · функция полусуммы · функция полуразности</text>'
+ '<text x="40" y="82" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0d9488">sin α + sin β = 2 · sin((α+β)/2) · cos((α−β)/2)</text>'
+ '<text x="40" y="112" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0d9488">sin α sin β = 2 · sin((α−β)/2) · cos((α+β)/2)</text>'
+ '<text x="40" y="142" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#0891b2">cos α + cos β = 2 · cos((α+β)/2) · cos((α−β)/2)</text>'
+ '<text x="40" y="172" font-size="13" font-family="JetBrains Mono,monospace" font-weight="700" fill="#dc2626">cos α cos β = 2 · sin((α+β)/2) · sin((α−β)/2)</text>'
+ '<rect x="20" y="200" width="540" height="64" rx="10" fill="rgba(124,58,237,.08)" stroke="#7c3aed" stroke-width="1.5"/>'
+ '<text x="290" y="218" text-anchor="middle" font-size="10" font-family="Unbounded,Inter,sans-serif" font-weight="800" fill="#6d28d9" letter-spacing="1px">МНЕМОНИКА</text>'
+ '<text x="40" y="240" font-size="11" font-family="Inter,sans-serif" font-weight="600" fill="#1e293b">• sin±sin → sin·cos (порядок «полусуммы / полуразности» зависит от знака)</text>'
+ '<text x="40" y="258" font-size="11" font-family="Inter,sans-serif" font-weight="600" fill="#1e293b">• cos+cos → cos·cos, coscos → sin·sin (минус снаружи!)</text>'
+ '</svg>';
html += makeCard('rule', '4 формулы преобразования', '12.1', `
<p>Эти формулы превращают <b>сумму</b> (или разность) тригонометрических функций в <b>произведение</b>.</p>
<div class="svg-host">${svgFormulas}</div>
<p>Они полезны для:</p>
<ul style="padding-left:22px;line-height:1.85">
<li>Решения уравнений вида $\\sin 3x + \\sin x = 0$ — разложение на множители.</li>
<li>Упрощения выражений и доказательства тождеств.</li>
<li>Численного вычисления некоторых углов.</li>
</ul>`);
html += makeCard('example', 'Применение для уравнения', '12.2', `
<p><b>Решим</b> $\\sin 3x + \\sin x = 0$.</p>
<p>$\\sin 3x + \\sin x = 2\\sin\\dfrac{3x + x}{2} \\cos\\dfrac{3x - x}{2} = 2\\sin 2x \\cos x$.</p>
<p>Получили $2\\sin 2x \\cos x = 0$$\\sin 2x = 0$ или $\\cos x = 0$.</p>
<ul style="padding-left:22px;line-height:1.9">
<li>$\\sin 2x = 0$$x = \\dfrac{\\pi n}{2}$.</li>
<li>$\\cos x = 0$$x = \\dfrac{\\pi}{2} + \\pi n$.</li>
</ul>
<p>Заметим: вторая серия — частный случай первой ($n = 2k+1$), поэтому общее решение: $x = \\dfrac{\\pi n}{2}$, $n \\in \\mathbb{Z}$.</p>`);
html += makeCard('example', 'Применение для упрощения', '12.3', `
<p><b>Упрости</b> $\\dfrac{\\sin 5x + \\sin 3x}{\\cos 5x + \\cos 3x}$.</p>
<p>Числитель: $\\sin 5x + \\sin 3x = 2\\sin 4x \\cos x$.</p>
<p>Знаменатель: $\\cos 5x + \\cos 3x = 2\\cos 4x \\cos x$.</p>
<p>$\\dfrac{2\\sin 4x \\cos x}{2\\cos 4x \\cos x} = \\dfrac{\\sin 4x}{\\cos 4x} = \\tg 4x$.</p>`);
/* === ИНТЕРАКТИВ 1: преобразуй === */
html += '<div class="wg" id="p12-iv1">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Преобразуй в произведение</div></div>'
+'<div class="wg-help">Введи результат в виде «2sinX·cosY» — числа X и Y (углы или функции от x).</div>'
+trainerHTML('p12-iv1', 5, 'результат')
+'</div>';
/* === ИНТЕРАКТИВ 2: реши уравнение === */
html += '<div class="wg" id="p12-iv2">'
+'<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Реши уравнение методом</div></div>'
+'<div class="wg-help">Преобразуй сумму/разность в произведение и реши.</div>'
+trainerHTML('p12-iv2', 4, 'число корней')
+'</div>';
/* === БОСС === */
html += '<h3 style="font-family:Unbounded,sans-serif;font-size:1.05rem;color:var(--pri2);margin:20px 0 12px">Босс §12 — Сумма → произведение</h3>';
html += makeBoss('p12', {
color:'#7c3aed',
title:'Босс §12 — Сумма в произведение',
steps:[
{ q:'$\\sin 30° + \\sin 90° = 2\\sin 60° \\cos 30° = ?$ (введи 3/2)', verify:(v)=>{const s=String(v).replace(/\\s/g,''); return s==='3/2'||+v===1.5;}, hint:'$2 \\cdot \\frac{\\sqrt{3}}{2} \\cdot \\frac{\\sqrt{3}}{2} = \\frac{3}{2}$.' },
{ q:'Сколько корней у $\\sin 3x + \\sin x = 0$ на $[0;\\,2\\pi)$?', verify:(v)=>+v===4, hint:'$2\\sin 2x \\cos x = 0$. $\\sin 2x = 0$: 0, π/2, π, 3π/2 (4 шт). $\\cos x = 0$: π/2, 3π/2 — уже учтены. Итого 4.' },
{ q:'Чему равно $\\dfrac{\\sin 5x + \\sin x}{\\cos 5x + \\cos x}$? Введи как «tg X», где X = коэффициент при x.', verify:(v)=>+v===3, hint:'$\\frac{2\\sin 3x \\cos 2x}{2\\cos 3x \\cos 2x} = \\tg 3x$.' },
{ q:'$\\cos 80° + \\cos 20° = 2\\cos 50° \\cos 30°$. Чему равно $\\cos 50° \\cdot \\dfrac{\\sqrt{3}}{?}$? (введи 1)', verify:(v)=>+v===1, hint:'$\\cos 80° + \\cos 20° = 2\\cos 50° \\cdot \\frac{\\sqrt{3}}{2} = \\sqrt{3}\\cos 50°$. То есть с коэф. $\\sqrt{3}/1$.' },
]
});
html += secNav('p11', 'final1') + readButton('p12');
box.innerHTML = html; renderMath(box);
/* IV1 */
makeTrainer({
idPrefix:'p12-iv1',
parser:(v)=>v,
questions:[
{ q:'$\\sin 80° + \\sin 40° = 2\\sin 60° \\cos ?°$. Введи угол.', a:(v)=>+v===20, show:'$20°$' },
{ q:'$\\sin 50° - \\sin 20° = 2\\sin 15° \\cos ?°$. Введи угол.', a:(v)=>+v===35, show:'$35°$' },
{ q:'$\\cos 70° + \\cos 10° = 2\\cos ?° \\cos 30°$. Введи угол.', a:(v)=>+v===40, show:'$40°$' },
{ q:'$\\sin 3x + \\sin x = 2\\sin ?x \\cos x$. Введи коэф.', a:(v)=>+v===2, show:'$2$ ($2\\sin 2x \\cos x$)' },
{ q:'$\\cos 5x - \\cos x = -2\\sin 3x \\sin ?x$. Введи коэф.', a:(v)=>+v===2, show:'$2$ ($-2\\sin 3x \\sin 2x$)' },
],
onComplete:(s,n)=>{ if(s===n){addXp(18,'p12-iv1');bumpProgress('p12',32);} else if(s>=3){addXp(9,'p12-iv1');bumpProgress('p12',14);} }
});
/* IV2 */
makeTrainer({
idPrefix:'p12-iv2',
questions:[
{ q:'Сколько корней у $\\sin 2x + \\sin 4x = 0$ на $[0;\\,\\pi)$?', a:3, show:'3 ($2\\sin 3x \\cos x = 0$: $\\sin 3x = 0$ ⇒ 0, π/3, 2π/3; $\\cos x = 0$ ⇒ π/2)' },
{ q:'Сколько корней у $\\cos x - \\cos 3x = 0$ на $[0;\\,2\\pi)$?', a:4, show:'4 ($2\\sin 2x \\sin x = 0$: $\\sin 2x = 0$ ⇒ 0, π/2, π, 3π/2 (4 шт); $\\sin x = 0$ ⇒ уже учтено)' },
{ q:'Сколько корней у $\\sin x + \\cos x = 0$ на $[0;\\,2\\pi)$? (используй $\\cos x = \\sin(\\pi/2 - x)$)', a:2, show:'2 ($\\tg x = -1$ ⇒ $x = 3\\pi/4, 7\\pi/4$)' },
{ q:'Сколько корней у $\\sin 5x = \\sin x$ на $[0;\\,\\pi)$?', a:5, show:'5 (через $\\sin 5x - \\sin x = 0$ ⇒ $2\\sin 2x \\cos 3x = 0$, серии комбинируются)' },
],
onComplete:(s,n)=>{ if(s===n){addXp(20,'p12-iv2');bumpProgress('p12',35);} else if(s>=2){addXp(10,'p12-iv2');bumpProgress('p12',16);} }
});
wireReadBtn('p12');
}
</script>
</body>