diff --git a/frontend/textbooks/geometry_9_ch4.html b/frontend/textbooks/geometry_9_ch4.html
index c7f1717..8908ba3 100644
--- a/frontend/textbooks/geometry_9_ch4.html
+++ b/frontend/textbooks/geometry_9_ch4.html
@@ -501,8 +501,607 @@ function _stubBuilder(paraId, num, name, prev, next){
if(window.renderMathInElement) renderMath(body);
}
-function buildP15(){ _stubBuilder('p15', '§15', 'Треугольник, квадрат, шестиугольник', 'p14', 'p16'); }
-function buildP16(){ _stubBuilder('p16', '§16', 'Длина окружности и площадь круга', 'p15', 'final4'); }
+/* ===== §15 Треугольник, квадрат, шестиугольник ===== */
+function buildP15(){
+ const box = document.getElementById('p15-body');
+ let html = '';
+
+ html += makeCard('theory', 'Эталонные значения для $n=3,4,6$', '15.1', `
+
Из общей формулы $\\dfrac{a}{2} = R\\sin\\dfrac{180^\\circ}{n}$ (§14) для трёх «именных» правильных многоугольников получаются красивые ответы.
+ Равносторонний треугольник ($n = 3$, $180^\\circ/3 = 60^\\circ$):
+ $a = 2R\\sin 60^\\circ = R\\sqrt{3}$, $r = R\\cos 60^\\circ = \\dfrac{R}{2}$, $S = \\dfrac{3\\sqrt{3}}{4} R^2$.
+ Квадрат ($n = 4$, $180^\\circ/4 = 45^\\circ$):
+ $a = 2R\\sin 45^\\circ = R\\sqrt{2}$, $r = R\\cos 45^\\circ = R\\dfrac{\\sqrt{2}}{2}$, $S = 2R^2$.
+ Правильный шестиугольник ($n = 6$, $180^\\circ/6 = 30^\\circ$):
+ $a = 2R\\sin 30^\\circ = R$, $r = R\\cos 30^\\circ = R\\dfrac{\\sqrt{3}}{2}$, $S = \\dfrac{3\\sqrt{3}}{2} R^2$.
+ Откуда $S$?
+ Берём $S = \\tfrac{1}{2} n R^2 \\sin\\dfrac{360^\\circ}{n}$. Для $n=3$: $S = \\tfrac{3}{2} R^2 \\sin 120^\\circ = \\tfrac{3}{2}\\cdot\\tfrac{\\sqrt{3}}{2} R^2 = \\tfrac{3\\sqrt{3}}{4} R^2$. Для $n=4$: $S = 2 R^2 \\sin 90^\\circ = 2R^2$. Для $n=6$: $S = 3 R^2 \\sin 60^\\circ = \\tfrac{3\\sqrt{3}}{2} R^2$.
+
`);
+
+ html += makeCard('rule', 'Как это запомнить', '15.2', `
+ Сторона выражается через $R$ корнем (или без него) — главное правило главы:
+
+ 3-угольник: $a = R\\sqrt{3}$ — «три-корень-три».
+ 4-угольник: $a = R\\sqrt{2}$ — «квадрат-корень-два». Кстати, диагональ квадрата $= a\\sqrt{2} = 2R$ (это диаметр описанной окружности).
+ 6-угольник: $a = R$ — «шестиугольник = радиус». Правильный 6-угольник состоит из 6 равносторонних треугольников со стороной $R$ (с вершиной в центре).
+
+ Совет: запомни только эти три случая — на ЦТ/экзамене они встречаются чаще всего, и формулы для них короче «общих».
`);
+
+ html += makeCard('example', 'Обратные формулы (от $a$ к $R$)', '15.3', `
+ Если дана сторона $a$, радиус описанной окружности находится так:
+
+ 3-угольник: $R = \\dfrac{a}{\\sqrt{3}} = \\dfrac{a\\sqrt{3}}{3}$. Пример: $a = 6 \\Rightarrow R = \\dfrac{6}{\\sqrt{3}} = 2\\sqrt{3} \\approx 3{,}46$.
+ 4-угольник: $R = \\dfrac{a}{\\sqrt{2}} = \\dfrac{a\\sqrt{2}}{2}$. Пример: $a = 4 \\Rightarrow R = 2\\sqrt{2} \\approx 2{,}83$.
+ 6-угольник: $R = a$. Пример: $a = 5 \\Rightarrow R = 5$.
+
+ А апофема $r$?
+ Для треугольника $r = R/2 = \\dfrac{a}{2\\sqrt{3}} = \\dfrac{a\\sqrt{3}}{6}$. Для квадрата $r = R\\dfrac{\\sqrt{2}}{2} = \\dfrac{a}{2}$ — апофема квадрата равна половине стороны. Для шестиугольника $r = R\\dfrac{\\sqrt{3}}{2} = \\dfrac{a\\sqrt{3}}{2}$.
+
`);
+
+ /* IV1 — Три эталонных многоугольника */
+ html += `
+
+
Меняй радиус $R$ — увидишь сразу 3 правильных многоугольника с одинаковой описанной окружностью.
+
+ Радиус $R$70
+
+
+
+
+
+
`;
+
+ /* IV2 — Калькулятор для эталонов */
+ html += `
+
+
Выбери многоугольник, введи радиус $R$ — получишь $a$, $r$, $S$ по «короткой» формуле.
+
+ Треугольник
+ Квадрат
+ 6-угольник
+
+
+ $R$ =
+
+ Вычислить
+
+
+
+
`;
+
+ /* IV3 — Какая сторона? */
+ html += `
+
+
Выбери правильную формулу для стороны $a$ через радиус $R$.
+
Задача 1 / 6 Очки: 0 / 6
+
+
+ $a = R\\sqrt{3}$
+ $a = R\\sqrt{2}$
+ $a = R$
+
+
+
`;
+
+ /* IV4 — Тренажёр */
+ html += `
+
+
Реши задачу и введи число (округли до двух знаков, допуск 0.05).
+
Задача 1 / 6 Очки: 0 / 6
+
+
+ ответ =
+
+ Проверить
+ Заново
+
+
+
`;
+
+ html += readButton('p15');
+ html += secNav('p14', 'p16');
+
+ box.innerHTML = html;
+ renderMath(box);
+
+ /* IV1 — три эталонных */
+ (function(){
+ const sl = document.getElementById('p15-iv1-r');
+ const lab = document.getElementById('p15-iv1-rval');
+ const svg = document.getElementById('p15-iv1-svg');
+ const out = document.getElementById('p15-iv1-out');
+ const seen = new Set();
+ const centers = [{x:120, y:130, n:3, label:'3-угольник', aStr:'R\\sqrt{3}'},
+ {x:350, y:130, n:4, label:'Квадрат', aStr:'R\\sqrt{2}'},
+ {x:580, y:130, n:6, label:'6-угольник', aStr:'R'}];
+ function draw(){
+ const R = +sl.value;
+ lab.textContent = R;
+ let s = '';
+ centers.forEach(c=>{
+ const pts = regularPoly(c.x, c.y, R, c.n);
+ // описанная окр
+ s += ' ';
+ // многоугольник
+ s += ' ';
+ // одна сторона (выделим)
+ const P0 = pts[0], P1 = pts[1];
+ s += ' ';
+ // центр
+ s += ' ';
+ // подпись названия снизу
+ s += ''+c.label+' ';
+ s += 'a = '+c.aStr+' ';
+ });
+ svg.innerHTML = s;
+ const a3 = R*Math.sqrt(3), a4 = R*Math.sqrt(2), a6 = R;
+ const r3 = R/2, r4 = R*Math.sqrt(2)/2, r6 = R*Math.sqrt(3)/2;
+ const S3 = 3*Math.sqrt(3)/4*R*R, S4 = 2*R*R, S6 = 3*Math.sqrt(3)/2*R*R;
+ out.innerHTML =
+ ''
+ +'$n$ $a$ $r$ $S$ '
+ +'3 $R\\sqrt{3} \\approx '+a3.toFixed(2)+'$ $R/2 = '+r3.toFixed(2)+'$ $\\tfrac{3\\sqrt{3}}{4} R^2 \\approx '+S3.toFixed(2)+'$ '
+ +'4 $R\\sqrt{2} \\approx '+a4.toFixed(2)+'$ $R\\tfrac{\\sqrt{2}}{2} \\approx '+r4.toFixed(2)+'$ $2R^2 = '+S4.toFixed(2)+'$ '
+ +'6 $R = '+a6.toFixed(2)+'$ $R\\tfrac{\\sqrt{3}}{2} \\approx '+r6.toFixed(2)+'$ $\\tfrac{3\\sqrt{3}}{2} R^2 \\approx '+S6.toFixed(2)+'$ '
+ +'
';
+ renderMath(out);
+ seen.add(R);
+ if(seen.size >= 4 && !seen.has('_done')){ addXp(10,'p15-iv1'); bumpProgress('p15', 15); seen.add('_done'); }
+ }
+ sl.addEventListener('input', draw);
+ draw();
+ })();
+
+ /* IV2 — Калькулятор для эталонов */
+ (function(){
+ const modes = document.querySelectorAll('#p15-iv2-modes button');
+ const inpR = document.getElementById('p15-iv2-r');
+ const go = document.getElementById('p15-iv2-go');
+ const out = document.getElementById('p15-iv2-out');
+ const fb = document.getElementById('p15-iv2-fb');
+ let mode = 3;
+ let solved = 0;
+ function calc(){
+ const R = parseFloat(inpR.value);
+ if(isNaN(R) || R <= 0){ feedback(fb, false, '✗ Введи положительное $R$.'); return; }
+ let a, r, S, formA, formR, formS;
+ if(mode === 3){
+ a = R*Math.sqrt(3); r = R/2; S = 3*Math.sqrt(3)/4*R*R;
+ formA = 'a = R\\sqrt{3} = '+R+'\\sqrt{3} \\approx '+a.toFixed(3);
+ formR = 'r = R/2 = '+r.toFixed(3);
+ formS = 'S = \\dfrac{3\\sqrt{3}}{4} R^2 \\approx '+S.toFixed(3);
+ } else if(mode === 4){
+ a = R*Math.sqrt(2); r = R*Math.sqrt(2)/2; S = 2*R*R;
+ formA = 'a = R\\sqrt{2} = '+R+'\\sqrt{2} \\approx '+a.toFixed(3);
+ formR = 'r = R\\dfrac{\\sqrt{2}}{2} \\approx '+r.toFixed(3);
+ formS = 'S = 2R^2 = '+S.toFixed(3);
+ } else {
+ a = R; r = R*Math.sqrt(3)/2; S = 3*Math.sqrt(3)/2*R*R;
+ formA = 'a = R = '+a.toFixed(3);
+ formR = 'r = R\\dfrac{\\sqrt{3}}{2} \\approx '+r.toFixed(3);
+ formS = 'S = \\dfrac{3\\sqrt{3}}{2} R^2 \\approx '+S.toFixed(3);
+ }
+ out.innerHTML = '$'+formA+'$ $'+formR+'$ $'+formS+'$ ';
+ renderMath(out);
+ feedback(fb, true, '✓ Готово.');
+ solved++;
+ if(solved === 1){ addXp(10,'p15-iv2'); bumpProgress('p15', 10); }
+ }
+ modes.forEach(b=>{
+ b.addEventListener('click', ()=>{
+ mode = +b.dataset.m;
+ modes.forEach(x=>{ x.classList.remove('primary'); x.classList.add('btn'); });
+ b.classList.remove('btn'); b.classList.add('btn','primary');
+ out.innerHTML = ''; fb.style.display = 'none';
+ });
+ });
+ go.addEventListener('click', calc);
+ inpR.addEventListener('keydown', e=>{ if(e.key==='Enter') calc(); });
+ calc();
+ })();
+
+ /* IV3 — Какая сторона? */
+ (function(){
+ const Q = [
+ { q:'Равносторонний треугольник', ans:3, why:'$a = R\\sqrt{3}$ (n = 3)' },
+ { q:'Квадрат', ans:2, why:'$a = R\\sqrt{2}$ (n = 4)' },
+ { q:'Правильный 6-угольник', ans:1, why:'$a = R$ (n = 6)' },
+ { q:'Правильный 3-угольник', ans:3, why:'Это равносторонний: $a = R\\sqrt{3}$' },
+ { q:'4-угольник правильный', ans:2, why:'Это квадрат: $a = R\\sqrt{2}$' },
+ { q:'Гексагон (6-угольник)', ans:1, why:'$a = R$ — шестиугольник = радиус' },
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p15-iv3-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15,'p15-iv3'); bumpProgress('p15', 25); }
+ else if(score >= Q.length - 1){ addXp(8,'p15-iv3'); bumpProgress('p15', 15); }
+ return;
+ }
+ document.getElementById('p15-iv3-i').textContent = (i+1);
+ document.getElementById('p15-iv3-s').textContent = score;
+ document.getElementById('p15-iv3-q').innerHTML = 'Какая формула для стороны $a$ через $R$?'+Q[i].q+' ';
+ renderMath(document.getElementById('p15-iv3-q'));
+ document.getElementById('p15-iv3-fb').style.display = 'none';
+ }
+ function answer(a){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p15-iv3-fb');
+ if(+a === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! '+Q[i].why+'. Дальше'); }
+ else feedback(fb, false, '✗ Нет. '+Q[i].why+'. Дальше');
+ document.getElementById('p15-iv3-s').textContent = score;
+ i++;
+ setTimeout(show, 1100);
+ }
+ ['1','2','3'].forEach(k=>{
+ const b = document.getElementById('p15-iv3-a'+k); if(b) b.addEventListener('click', ()=>answer(k));
+ });
+ show();
+ })();
+
+ /* IV4 — Тренажёр */
+ (function(){
+ const Q = [
+ { q:'Равносторонний треугольник с $R = 4$. Найди сторону $a$.',
+ ans:6.93, hint:'$a = R\\sqrt{3} = 4\\sqrt{3} \\approx 6{,}93$' },
+ { q:'Квадрат с $R = 5$. Найди сторону $a$.',
+ ans:7.07, hint:'$a = R\\sqrt{2} = 5\\sqrt{2} \\approx 7{,}07$' },
+ { q:'Правильный 6-угольник с $R = 7$. Найди сторону $a$.',
+ ans:7, hint:'$a = R = 7$ (шестиугольник = радиус)' },
+ { q:'Квадрат со стороной $a = 6$. Найди радиус описанной окружности $R$.',
+ ans:4.24, hint:'$R = a/\\sqrt{2} = 6/\\sqrt{2} = 3\\sqrt{2} \\approx 4{,}24$' },
+ { q:'Равносторонний треугольник со стороной $a = 9$. Найди $R$.',
+ ans:5.20, hint:'$R = a/\\sqrt{3} = 9/\\sqrt{3} = 3\\sqrt{3} \\approx 5{,}20$' },
+ { q:'Правильный 6-угольник со стороной $a = 8$. Найди $R$.',
+ ans:8, hint:'$R = a = 8$' },
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p15-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15,'p15-iv4'); bumpProgress('p15', 25); }
+ else if(score >= 4){ addXp(8,'p15-iv4'); bumpProgress('p15', 15); }
+ return;
+ }
+ document.getElementById('p15-iv4-i').textContent = (i+1);
+ document.getElementById('p15-iv4-s').textContent = score;
+ document.getElementById('p15-iv4-q').innerHTML = Q[i].q;
+ document.getElementById('p15-iv4-ans').value = '';
+ renderMath(document.getElementById('p15-iv4-q'));
+ document.getElementById('p15-iv4-fb').style.display = 'none';
+ }
+ function go(){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p15-iv4-fb');
+ const ans = parseFloat(document.getElementById('p15-iv4-ans').value);
+ if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; }
+ if(Math.abs(ans - Q[i].ans) < 0.05){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+'. Дальше'); }
+ else feedback(fb, false, '✗ Неверно. Ответ: '+Q[i].ans+' ('+Q[i].hint+'). Дальше');
+ document.getElementById('p15-iv4-s').textContent = score;
+ i++;
+ setTimeout(show, 1300);
+ }
+ document.getElementById('p15-iv4-go').addEventListener('click', go);
+ document.getElementById('p15-iv4-ans').addEventListener('keydown', e=>{ if(e.key==='Enter') go(); });
+ document.getElementById('p15-iv4-start').addEventListener('click', ()=>{ i=0; score=0; show(); });
+ show();
+ })();
+
+ wireReadBtn('p15');
+}
+
+/* ===== §16 Длина окружности и площадь круга ===== */
+function buildP16(){
+ const box = document.getElementById('p16-body');
+ let html = '';
+
+ html += makeCard('theory', 'Длина окружности', '16.1', `
+ Длина окружности радиуса $R$ (диаметр $d = 2R$):
+ $$C = 2\\pi R = \\pi d$$
+ Число $\\pi$ (отношение длины окружности к её диаметру) — иррациональное:
+ $\\pi \\approx 3{,}14159265\\ldots$ (для оценок берут $\\pi \\approx 3{,}14$ или $\\pi \\approx \\dfrac{22}{7}$).
+ Примеры:
+
+ $R = 5$: $C = 10\\pi \\approx 31{,}4$.
+ $d = 10$: $C = 10\\pi \\approx 31{,}4$ (тот же ответ, т.к. $d = 2R$).
+ $R = 1$: $C = 2\\pi \\approx 6{,}28$ — длина единичной окружности.
+ `);
+
+ html += makeCard('rule', 'Площадь круга', '16.2', `
+ Круг — это вся часть плоскости, ограниченная окружностью (плюс сама окружность). Его площадь:
+ $$S = \\pi R^2$$
+ Через диаметр: $S = \\pi \\left(\\dfrac{d}{2}\\right)^2 = \\dfrac{\\pi d^2}{4}$.
+ Примеры:
+
+ $R = 4$: $S = 16\\pi \\approx 50{,}24$.
+ $d = 10$: $S = \\dfrac{\\pi \\cdot 100}{4} = 25\\pi \\approx 78{,}5$.
+ $R = 1$: $S = \\pi \\approx 3{,}14$ — площадь единичного круга.
+
+ Откуда $S = \\pi R^2$?
+ «Разрежем» круг на много узких секторов и сложим их в прямоугольник: ширина $\\approx R$, длина $\\approx \\tfrac{1}{2} \\cdot 2\\pi R = \\pi R$. Площадь $\\approx R \\cdot \\pi R = \\pi R^2$. В пределе (бесконечно тонкие секторы) — точное равенство.
+
`);
+
+ html += makeCard('example', 'Дуга и сектор', '16.3', `
+ Дуге, на которую опирается центральный угол $\\alpha^\\circ$, соответствует доля $\\dfrac{\\alpha}{360^\\circ}$ всей окружности. Поэтому:
+ $$\\ell = 2\\pi R \\cdot \\dfrac{\\alpha}{360^\\circ} = \\dfrac{\\pi R \\alpha}{180^\\circ}$$
+ Сектор с углом $\\alpha^\\circ$ занимает ту же долю круга:
+ $$S_{\\text{сек}} = \\pi R^2 \\cdot \\dfrac{\\alpha}{360^\\circ} = \\dfrac{\\pi R^2 \\alpha}{360^\\circ}$$
+ Примеры:
+
+ Длина дуги четверти круга радиуса $R = 2$: $\\ell = \\dfrac{\\pi \\cdot 2 \\cdot 90}{180} = \\pi \\approx 3{,}14$.
+ Площадь сектора $60^\\circ$ в круге радиуса $6$: $S = \\dfrac{\\pi \\cdot 36 \\cdot 60}{360} = 6\\pi \\approx 18{,}85$.
+ `);
+
+ /* IV1 — Slider R и сектор */
+ html += `
+
+
Меняй радиус $R$ и угол сектора $\\alpha$ — следи за длиной окружности, площадью круга, длиной дуги и площадью сектора.
+
+ Радиус $R$100
+ Угол $\\alpha$ (°)90
+
+
+
+
+
+
`;
+
+ /* IV2 — Калькулятор C и S */
+ html += `
+
+
Выбери, что дано ($R$ или $d$). Введи значение — посчитаем $C$ и $S$ круга, а также длину дуги и площадь сектора для угла $\\alpha$.
+
+ Дано $R$
+ Дано $d$
+
+
+ $R$ =
+
+ $\\alpha$ =
+ °
+ Вычислить
+
+
+
+
`;
+
+ /* IV3 — Какая формула? */
+ html += `
+
+
Выбери формулу, которая подходит под описание.
+
Задача 1 / 6 Очки: 0 / 6
+
+
+ $2\\pi R$
+ $\\pi R^2$
+ $\\dfrac{\\pi R \\alpha}{180}$
+ $\\dfrac{\\pi R^2 \\alpha}{360}$
+
+
+
`;
+
+ /* IV4 — Тренажёр */
+ html += `
+
+
Для всех задач используй $\\pi \\approx 3{,}14$. Ответы округляй до двух знаков (допуск 0.05).
+
Задача 1 / 6 Очки: 0 / 6
+
+
+ ответ =
+
+ Проверить
+ Заново
+
+
+
`;
+
+ html += readButton('p16');
+ html += secNav('p15', 'final4');
+
+ box.innerHTML = html;
+ renderMath(box);
+
+ /* IV1 — Slider R + сектор */
+ (function(){
+ const slR = document.getElementById('p16-iv1-r');
+ const slA = document.getElementById('p16-iv1-a');
+ const labR = document.getElementById('p16-iv1-rval');
+ const labA = document.getElementById('p16-iv1-aval');
+ const svg = document.getElementById('p16-iv1-svg');
+ const out = document.getElementById('p16-iv1-out');
+ const seen = new Set();
+ const cx = 200, cy = 200;
+ function draw(){
+ const R = +slR.value, alpha = +slA.value;
+ labR.textContent = R; labA.textContent = alpha;
+ let s = '';
+ // основная окружность (контур)
+ s += ' ';
+ // сектор — рисуем path
+ if(alpha > 0){
+ if(alpha >= 360){
+ // целый круг
+ s += ' ';
+ } else {
+ const rad = alpha * Math.PI / 180;
+ const x1 = cx + R, y1 = cy;
+ const x2 = cx + R*Math.cos(rad), y2 = cy + R*Math.sin(rad);
+ const large = alpha > 180 ? 1 : 0;
+ s += ' ';
+ }
+ }
+ // радиус (на 0°)
+ s += ' ';
+ // радиус на углу alpha
+ const ax = cx + R*Math.cos(alpha*Math.PI/180), ay = cy + R*Math.sin(alpha*Math.PI/180);
+ s += ' ';
+ // центр O
+ s += ' ';
+ s += 'O ';
+ // подпись R
+ s += 'R ';
+ svg.innerHTML = s;
+ const PI = Math.PI;
+ const C = 2*PI*R;
+ const Scircle = PI*R*R;
+ const L = PI*R*alpha/180;
+ const Ssec = PI*R*R*alpha/360;
+ out.innerHTML =
+ '$R = '+R+'$, $\\alpha = '+alpha+'^\\circ$ '
+ +'$C = 2\\pi R \\approx '+C.toFixed(2)+'$, $S_{\\text{круга}} = \\pi R^2 \\approx '+Scircle.toFixed(2)+'$ '
+ +'$\\ell_{\\text{дуги}} = \\dfrac{\\pi R \\alpha}{180} \\approx '+L.toFixed(2)+'$, $S_{\\text{сектора}} = \\dfrac{\\pi R^2 \\alpha}{360} \\approx '+Ssec.toFixed(2)+'$';
+ renderMath(out);
+ seen.add(R+'_'+alpha);
+ if(seen.size >= 5 && !seen.has('_done')){ addXp(10,'p16-iv1'); bumpProgress('p16', 15); seen.add('_done'); }
+ }
+ slR.addEventListener('input', draw);
+ slA.addEventListener('input', draw);
+ draw();
+ })();
+
+ /* IV2 — Калькулятор C, S, дуга, сектор */
+ (function(){
+ const modes = document.querySelectorAll('#p16-iv2-modes button');
+ const inpV = document.getElementById('p16-iv2-val');
+ const inpA = document.getElementById('p16-iv2-a');
+ const lab = document.getElementById('p16-iv2-lab');
+ const go = document.getElementById('p16-iv2-go');
+ const out = document.getElementById('p16-iv2-out');
+ const fb = document.getElementById('p16-iv2-fb');
+ let mode = 'R';
+ let solved = 0;
+ function updateLabel(){
+ lab.innerHTML = mode === 'R' ? '$R$ =' : '$d$ =';
+ renderMath(lab);
+ }
+ function calc(){
+ const v = parseFloat(inpV.value);
+ const alpha = parseFloat(inpA.value);
+ if(isNaN(v) || v <= 0){ feedback(fb, false, '✗ Введи положительное значение.'); return; }
+ if(isNaN(alpha) || alpha < 0 || alpha > 360){ feedback(fb, false, '✗ Угол $\\alpha$ — от 0° до 360°.'); return; }
+ const R = mode === 'R' ? v : v/2;
+ const d = 2*R;
+ const PI = Math.PI;
+ const C = 2*PI*R;
+ const S = PI*R*R;
+ const L = PI*R*alpha/180;
+ const Ss = PI*R*R*alpha/360;
+ out.innerHTML =
+ '$R = '+R.toFixed(3)+'$, $d = '+d.toFixed(3)+'$ '
+ +'$C = 2\\pi R \\approx '+C.toFixed(3)+'$ '
+ +'$S_{\\text{круга}} = \\pi R^2 \\approx '+S.toFixed(3)+'$ '
+ +'$\\ell_{\\text{дуги}}('+alpha+'^\\circ) = \\dfrac{\\pi R \\alpha}{180} \\approx '+L.toFixed(3)+'$ '
+ +'$S_{\\text{сектора}}('+alpha+'^\\circ) = \\dfrac{\\pi R^2 \\alpha}{360} \\approx '+Ss.toFixed(3)+'$';
+ renderMath(out);
+ feedback(fb, true, '✓ Готово.');
+ solved++;
+ if(solved === 1){ addXp(10,'p16-iv2'); bumpProgress('p16', 10); }
+ }
+ modes.forEach(b=>{
+ b.addEventListener('click', ()=>{
+ mode = b.dataset.m;
+ modes.forEach(x=>{ x.classList.remove('primary'); x.classList.add('btn'); });
+ b.classList.remove('btn'); b.classList.add('btn','primary');
+ updateLabel();
+ out.innerHTML = ''; fb.style.display = 'none';
+ });
+ });
+ go.addEventListener('click', calc);
+ inpV.addEventListener('keydown', e=>{ if(e.key==='Enter') calc(); });
+ inpA.addEventListener('keydown', e=>{ if(e.key==='Enter') calc(); });
+ updateLabel(); calc();
+ })();
+
+ /* IV3 — Какая формула? */
+ (function(){
+ const Q = [
+ { q:'Длина окружности', ans:'C', why:'$C = 2\\pi R$' },
+ { q:'Площадь круга', ans:'S', why:'$S = \\pi R^2$' },
+ { q:'Длина дуги, на которую опирается угол $\\alpha$', ans:'L', why:'$\\ell = \\dfrac{\\pi R \\alpha}{180}$' },
+ { q:'Площадь сектора с углом $\\alpha$', ans:'Ss', why:'$S_{\\text{сек}} = \\dfrac{\\pi R^2 \\alpha}{360}$' },
+ { q:'Половина окружности (дуга с углом 180°)', ans:'L', why:'Это $\\ell = \\dfrac{\\pi R \\alpha}{180}$ при $\\alpha = 180^\\circ$, выходит $\\pi R$' },
+ { q:'Четверть круга (сектор с углом 90°)', ans:'Ss', why:'Это $S_{\\text{сек}} = \\dfrac{\\pi R^2 \\alpha}{360}$ при $\\alpha = 90^\\circ$, выходит $\\pi R^2 / 4$' },
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p16-iv3-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15,'p16-iv3'); bumpProgress('p16', 25); }
+ else if(score >= Q.length - 1){ addXp(8,'p16-iv3'); bumpProgress('p16', 15); }
+ return;
+ }
+ document.getElementById('p16-iv3-i').textContent = (i+1);
+ document.getElementById('p16-iv3-s').textContent = score;
+ document.getElementById('p16-iv3-q').innerHTML = 'Какая формула?'+Q[i].q+' ';
+ renderMath(document.getElementById('p16-iv3-q'));
+ document.getElementById('p16-iv3-fb').style.display = 'none';
+ }
+ function answer(a){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p16-iv3-fb');
+ if(a === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! '+Q[i].why+'. Дальше'); }
+ else feedback(fb, false, '✗ Нет. '+Q[i].why+'. Дальше');
+ document.getElementById('p16-iv3-s').textContent = score;
+ i++;
+ setTimeout(show, 1200);
+ }
+ ['C','S','L','Ss'].forEach(k=>{
+ const b = document.getElementById('p16-iv3-a'+k); if(b) b.addEventListener('click', ()=>answer(k));
+ });
+ show();
+ })();
+
+ /* IV4 — Тренажёр (π = 3.14) */
+ (function(){
+ const PI = 3.14;
+ const Q = [
+ { q:'Длина окружности с $R = 5$. ($\\pi \\approx 3{,}14$)',
+ ans: 10*PI, hint:'$C = 2\\pi R = 10\\pi \\approx 31{,}4$' },
+ { q:'Площадь круга с $R = 4$. ($\\pi \\approx 3{,}14$)',
+ ans: 16*PI, hint:'$S = \\pi R^2 = 16\\pi \\approx 50{,}24$' },
+ { q:'Длина окружности с $d = 10$. ($\\pi \\approx 3{,}14$)',
+ ans: 10*PI, hint:'$C = \\pi d = 10\\pi \\approx 31{,}4$' },
+ { q:'Длина дуги: $R = 6$, $\\alpha = 90^\\circ$. ($\\pi \\approx 3{,}14$)',
+ ans: 3*PI, hint:'$\\ell = \\dfrac{\\pi R \\alpha}{180} = \\dfrac{\\pi \\cdot 6 \\cdot 90}{180} = 3\\pi \\approx 9{,}42$' },
+ { q:'Площадь сектора: $R = 4$, $\\alpha = 90^\\circ$. ($\\pi \\approx 3{,}14$)',
+ ans: 4*PI, hint:'$S = \\dfrac{\\pi R^2 \\alpha}{360} = \\dfrac{\\pi \\cdot 16 \\cdot 90}{360} = 4\\pi \\approx 12{,}56$' },
+ { q:'Площадь круга с $d = 10$. ($\\pi \\approx 3{,}14$)',
+ ans: 25*PI, hint:'$S = \\dfrac{\\pi d^2}{4} = \\dfrac{100\\pi}{4} = 25\\pi \\approx 78{,}5$' },
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p16-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15,'p16-iv4'); bumpProgress('p16', 25); }
+ else if(score >= 4){ addXp(8,'p16-iv4'); bumpProgress('p16', 15); }
+ return;
+ }
+ document.getElementById('p16-iv4-i').textContent = (i+1);
+ document.getElementById('p16-iv4-s').textContent = score;
+ document.getElementById('p16-iv4-q').innerHTML = Q[i].q;
+ document.getElementById('p16-iv4-ans').value = '';
+ renderMath(document.getElementById('p16-iv4-q'));
+ document.getElementById('p16-iv4-fb').style.display = 'none';
+ }
+ function go(){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p16-iv4-fb');
+ const ans = parseFloat(document.getElementById('p16-iv4-ans').value);
+ if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; }
+ if(Math.abs(ans - Q[i].ans) < 0.05){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+'. Дальше'); }
+ else feedback(fb, false, '✗ Неверно. Ответ: '+Q[i].ans.toFixed(2)+' ('+Q[i].hint+'). Дальше');
+ document.getElementById('p16-iv4-s').textContent = score;
+ i++;
+ setTimeout(show, 1400);
+ }
+ document.getElementById('p16-iv4-go').addEventListener('click', go);
+ document.getElementById('p16-iv4-ans').addEventListener('keydown', e=>{ if(e.key==='Enter') go(); });
+ document.getElementById('p16-iv4-start').addEventListener('click', ()=>{ i=0; score=0; show(); });
+ show();
+ })();
+
+ wireReadBtn('p16');
+}
/* ===== §13 Правильные многоугольники ===== */
function buildP13(){