From 451f6a66eae4418d46892fa7cacf211ad83e40c7 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 14:39:06 +0300 Subject: [PATCH] =?UTF-8?q?feat(geom11=20ch3=20wave2):=20=C2=A76=20=C2=AB?= =?UTF-8?q?=D0=A8=D0=B0=D1=80=C2=BB=20+=20=D1=81=D0=B5=D0=B3=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D1=8B=20+=20=D0=B2=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5/=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/textbooks/geometry_11_ch3.html | 462 +++++++++++++++++++++++- 1 file changed, 459 insertions(+), 3 deletions(-) diff --git a/frontend/textbooks/geometry_11_ch3.html b/frontend/textbooks/geometry_11_ch3.html index b1a705d..6a86835 100644 --- a/frontend/textbooks/geometry_11_ch3.html +++ b/frontend/textbooks/geometry_11_ch3.html @@ -396,7 +396,7 @@ function buildParaSelector(){ } const BUILT=new Set(); -const BUILDERS = { p5:buildP5, p6:()=>buildStub('p6'), p7:()=>buildStub('p7'), final3:()=>buildStub('final3') }; +const BUILDERS = { p5:buildP5, p6:buildP6, p7:()=>buildStub('p7'), final3:()=>buildStub('final3') }; function ensureBuilt(id){ if(BUILT.has(id)) return; const fn=BUILDERS[id]; if(fn){ fn(); BUILT.add(id); } } function goTo(id){ STATE.current=id; ensureBuilt(id); @@ -422,14 +422,25 @@ const SIDEBARS = { ["Площадь", "$S=4\\\\pi R^2$"], ["Объём шара", "$V=\\\\tfrac{4}{3}\\\\pi R^3$"] ]}, - p6:{title:"Шпаргалка § 6", rows:[["Тема", "Шар"],["Формула","$S=4\\\\pi R^2$, $V=\\\\frac{4}{3}\\\\pi R^3$"]]}, + p6:{title:"Шпаргалка § 6", rows:[ + ["Тема", "Шар"], + ["Шар", "тело, $|OM|\\\\le R$"], + ["Площадь сферы", "$S=4\\\\pi R^2$"], + ["Объём шара", "$V=\\\\tfrac{4}{3}\\\\pi R^3$"], + ["Сегмент $V$", "$\\\\tfrac{\\\\pi h^2(3R-h)}{3}$"], + ["Сегмент $S$", "$2\\\\pi R h$"], + ["Сектор $V$", "$\\\\tfrac{2}{3}\\\\pi R^2 h$"], + ["Слой $V$", "$\\\\tfrac{\\\\pi h}{6}(3r_1^2+3r_2^2+h^2)$"], + ["Куб впис. шар", "$r=a/2$"], + ["Куб опис. шар", "$R=\\\\tfrac{a\\\\sqrt{3}}{2}$"] + ]}, p7:{title:"Шпаргалка § 7", rows:[["Тема", "Правильные многогранники"],["Формула","5 платоновых тел"]]}, final3:{title:"Финал раздела 3", rows:[["§ 5–§ 7","теория раздела 3"],["Награда","+50 XP"]]} }; const TIPS=[ {sec:'p5',html:"Сфера: $|OM|=R$. Уравнение $(x-a)^2+(y-b)^2+(z-c)^2=R^2$. Сечение плоскостью — окружность $r=\\\\sqrt{R^2-d^2}$."}, - {sec:'p6',html:"§ 6 «Шар» — содержание в разработке. $S=4\\\\\\\\pi R^2$, $V=\\\\\\\\frac{4}{3}\\\\\\\\pi R^3$"}, + {sec:'p6',html:"Шар: $S=4\\\\pi R^2$, $V=\\\\tfrac{4}{3}\\\\pi R^3$. Сегмент: $V=\\\\tfrac{\\\\pi h^2(3R-h)}{3}$, $S=2\\\\pi R h$. Куб впис. шар: $r=a/2$; куб опис. шар: $R=\\\\tfrac{a\\\\sqrt 3}{2}$."}, {sec:'p7',html:"§ 7 «Правильные многогранники» — содержание в разработке. 5 платоновых тел"}, {sec:'final3',html:"Финал раздела 3 — интегрированные задачи по разделу."} ]; @@ -986,6 +997,446 @@ function buildP5(){ wireReadBtn('p5'); } +/* ===== § 6 «Шар» — Wave 2 ===== */ +function buildP6(){ + const box = document.getElementById('p6-body'); + if(!box) return; + let html = ''; + + /* === ТЕОРИЯ === */ + + html += makeCard('theory', 'Площадь поверхности и объём шара', '§ 6.1', + '

Шар — тело, ограниченное сферой. Это множество точек пространства, для которых $|OM|\\le R$.

' + + '

Все точки шара удалены от центра $O$ не более чем на $R$. Поверхность шара — сама сфера.

' + + '

Основные формулы для шара радиуса $R$:

' + + '

$$S_{\\text{сферы}}=4\\pi R^2 \\qquad V_{\\text{шара}}=\\dfrac{4}{3}\\pi R^3$$

' + + '

Формула объёма обосновывается методом Кавальери: сравнивая шар с цилиндром, из которого вырезан конус, получаем те же объёмы у равных поперечных сечений на одной высоте.

' + + '
Пример: $R=3$ — численное совпадение $S$ и $V$
' + + '

$S=4\\pi\\cdot 9=36\\pi\\approx 113{,}10$.

' + + '

$V=\\dfrac{4}{3}\\pi\\cdot 27=36\\pi\\approx 113{,}10$.

' + + '

Численно $S$ и $V$ совпадают — но только при $R=3$. Это лишь совпадение единиц измерения (одно — площадь, другое — объём).

' + + '
' + + '
Пример: связь радиуса и объёма
' + + '

Если радиус увеличить в $2$ раза, то площадь сферы вырастет в $4$ раза, а объём — в $8$ раз.

' + + '

$\\dfrac{V_2}{V_1}=\\dfrac{(2R)^3}{R^3}=8$, $\\dfrac{S_2}{S_1}=\\dfrac{(2R)^2}{R^2}=4$.

' + + '
'); + + html += makeCard('rule', 'Шаровой сегмент, сектор, слой', '§ 6.2', + '

Шаровой сегмент — часть шара, отсекаемая плоскостью. Высота сегмента $h$ — расстояние от секущей плоскости до самой удалённой точки сегмента.

' + + '

$$V_{\\text{сегм}}=\\dfrac{\\pi h^2(3R-h)}{3}, \\qquad S_{\\text{сфер.часть}}=2\\pi R h$$

' + + '

Радиус основания сегмента: $r=\\sqrt{2Rh-h^2}$ (по теореме Пифагора в осевом сечении).

' + + '

Шаровой сектор — тело, состоящее из шарового сегмента и конуса с вершиной в центре шара и основанием — кругом сегмента.

' + + '

$$V_{\\text{сект}}=\\dfrac{2}{3}\\pi R^2 h$$

' + + '

Шаровой слой — часть шара между двумя параллельными плоскостями. $r_1$, $r_2$ — радиусы оснований, $h$ — расстояние между плоскостями.

' + + '

$$V_{\\text{слой}}=\\dfrac{\\pi h}{6}\\bigl(3r_1^2+3r_2^2+h^2\\bigr), \\qquad S_{\\text{сфер.часть}}=2\\pi R h$$

' + + '

Замечательно: формула $S=2\\pi R h$ работает и для сегмента, и для шарового пояса (слоя) — площадь сферического пояса между параллельными плоскостями зависит только от его высоты $h$ и от $R$ сферы.

' + + '
Пример: $R=5$, $h=2$ (сегмент)
' + + '

$V_{\\text{сегм}}=\\dfrac{\\pi\\cdot 4\\cdot(15-2)}{3}=\\dfrac{52\\pi}{3}\\approx 54{,}45$.

' + + '

$S_{\\text{сфер.часть}}=2\\pi\\cdot 5\\cdot 2=20\\pi\\approx 62{,}83$.

' + + '

Радиус основания: $r=\\sqrt{2\\cdot 5\\cdot 2-4}=\\sqrt{16}=4$.

' + + '
'); + + html += makeCard('example', 'Вписанные и описанные шары', '§ 6.3', + '

Шар вписан в многогранник, если он касается всех его граней изнутри.

' + + '

Шар описан около многогранника, если все его вершины лежат на сфере.

' + + '

Куб и шар.

' + + '' + + '

Цилиндр и шар.

' + + '' + + '
Пример: куб со стороной $a=4$
' + + '

Вписанный шар: $r=2$, $V=\\dfrac{4}{3}\\pi\\cdot 8=\\dfrac{32\\pi}{3}\\approx 33{,}51$.

' + + '

Описанный шар: $R=\\dfrac{4\\sqrt 3}{2}=2\\sqrt 3\\approx 3{,}46$.

' + + '
'); + + /* === ИНТЕРАКТИВ 1 — 3D-визуализатор шара с сегментами === */ + html += '
' + + '
3D · шар + сегмент
Визуализатор шара и шарового сегмента
' + + '
Меняй радиус $R$ и высоту сегмента $h$. Сегмент выделяется сверху. После 4 разных пар $(R,h)$ — +10 XP.
' + + '
' + + '' + + '' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '
' + + '
' + + '
' + + '$S_{\\text{сферы}}=4\\pi R^2\\approx$' + + '$V_{\\text{шара}}=\\tfrac{4}{3}\\pi R^3\\approx$' + + '$V_{\\text{сегм}}\\approx$' + + '$S_{\\text{сфер.сегм}}=2\\pi R h\\approx$' + + '
' + + '
Разных пар $(R,h)$ изучено: 0 / 4
' + + '
'; + + /* === ИНТЕРАКТИВ 2 — Калькулятор шара/сегмента/слоя === */ + html += '
' + + '
калькулятор
Калькулятор шара, сегмента и слоя
' + + '
Выбери режим, введи параметры и получи $S$, $V$ и другие характеристики.
' + + '
' + + '' + + '' + + '' + + '
' + + '
' + + '
' + + '
'; + + /* === ИНТЕРАКТИВ 3 — Вписан или описан? === */ + html += '
' + + '
квикфайр · 6 заданий
Вписан или описан?
' + + '
Прочитай условие и выбери, какое отношение шара и многогранника описано.
' + + '
' + + '
Верно: 0 / 6
' + + '
'; + + /* === ИНТЕРАКТИВ 4 — Тренажёр === */ + html += '
' + + '
тренажёр · 6 задач
Шар, сегмент, вписанные и описанные тела
' + + '
Используй $\\pi\\approx 3{,}14$. Допуск $\\pm 0{,}5$ для больших значений, $\\pm 0{,}05$ — для остальных.
' + + '
' + + '
Решено: 0 / 6
' + + '
'; + + html += secNav('p5', 'p7'); + html += readButton('p6'); + + box.innerHTML = html; + renderMath(box); + + /* ====== JS-логика интерактивов ====== */ + + /* IV1 — 3D-визуализатор шара с сегментом */ + (function(){ + if(!window.G3D) return; + const svg = document.getElementById('p6-iv1-svg'); + const elR = document.getElementById('p6-iv1-R'); + const elH = document.getElementById('p6-iv1-h'); + const vR = document.getElementById('p6-iv1-R-v'); + const vH = document.getElementById('p6-iv1-h-v'); + const oS = document.getElementById('p6-iv1-S-o'); + const oV = document.getElementById('p6-iv1-V-o'); + const oVseg = document.getElementById('p6-iv1-Vseg-o'); + const oSseg = document.getElementById('p6-iv1-Sseg-o'); + const oCnt = document.getElementById('p6-iv1-cnt'); + if(!svg) return; + const scene = G3D.createScene({W:480, H:400, scale:60, camDist:8, rotX:-0.35, rotY:0.7}); + const seen = new Set(); + let xpGiven = false; + const PI = 3.14; + + function projector(v){ + if (scene.proj === 'iso') return G3D.projectIso(v, scene.cx, scene.cy, scene.scale); + return G3D.projectPersp(v, scene.camDist, scene.cx, scene.cy, scene.scale); + } + + function segmentOverlay(R, h, M){ + // Сегмент сверху: от высоты y0 = R - h до y = R + if(h <= 0) return ''; + const hClamp = Math.min(h, 2*R); + const y0 = R - hClamp; // y координата секущей плоскости + // 1) Окружность секущего круга — эллипс в проекции + const rBase = Math.sqrt(Math.max(0, 2*R*hClamp - hClamp*hClamp)); + const N = 64; + const ringPts = []; + for(let i=0; i<=N; i++){ + const t = 2*Math.PI*i/N; + ringPts.push({x: rBase*Math.cos(t), y: y0, z: rBase*Math.sin(t)}); + } + const ringRot = ringPts.map(p => G3D.vApply(M, p)).map(projector); + let path = ''; + for(let i=0; i'; + + // 2) Полупрозрачная "шапка" сегмента — несколько горизонтальных эллипсов выше плоскости + const SLICES = 6; + for(let k=1; k<=SLICES; k++){ + const yk = y0 + hClamp * k / SLICES; + const rk = Math.sqrt(Math.max(0, R*R - yk*yk)); + if(rk < 1e-3) continue; + const pts = []; + for(let i=0; i<=N; i++){ + const t = 2*Math.PI*i/N; + pts.push({x: rk*Math.cos(t), y: yk, z: rk*Math.sin(t)}); + } + const proj = pts.map(p => G3D.vApply(M, p)).map(projector); + let p2 = ''; + for(let i=0; i'; + } + return out; + } + + function draw(){ + const R = +elR.value; + let h = +elH.value; + if(h > 2*R) h = 2*R; + // Обновляем верхнюю границу слайдера h по текущему R + elH.max = (2*R).toFixed(1); + vR.textContent = R.toFixed(1); + vH.textContent = h.toFixed(1); + const sph = G3D.sphereWireframe(R, 6, 12); + const M = G3D.buildRotMatrix(scene); + const wire = G3D.renderSphereWireframe(sph, M, scene); + const seg = segmentOverlay(R, h, M); + svg.innerHTML = wire + seg; + + oS.textContent = (4*PI*R*R).toFixed(2); + oV.textContent = ((4/3)*PI*R*R*R).toFixed(2); + oVseg.textContent = (PI*h*h*(3*R - h)/3).toFixed(2); + oSseg.textContent = (2*PI*R*h).toFixed(2); + + const key = R.toFixed(1)+'|'+h.toFixed(1); + seen.add(key); + oCnt.textContent = Math.min(seen.size, 4); + if(seen.size >= 4 && !xpGiven){ + xpGiven = true; + addXp(10, 'p6-iv1'); + bumpProgress('p6', 15); + const note = document.createElement('div'); + note.className = 'feedback ok'; + note.innerHTML = '✓ +10 XP за исследование 4 разных конфигураций!'; + note.style.cssText = 'display:block;margin-top:8px'; + const host = document.getElementById('p6-iv1'); + if(host) host.appendChild(note); + setTimeout(function(){ try{ note.remove(); }catch(e){} }, 3000); + } + } + draw(); + G3D.attachOrbit(svg, scene, draw); + elR.addEventListener('input', draw); + elH.addEventListener('input', draw); + document.querySelectorAll('#p6-iv1 .g3d-tools .btn').forEach(function(b){ + b.addEventListener('click', function(){ G3D.presetView(scene, b.dataset.view, draw); }); + }); + })(); + + /* IV2 — Калькулятор */ + (function(){ + const formBox = document.getElementById('p6-iv2-form'); + const outBox = document.getElementById('p6-iv2-out'); + let mode = 'ball'; + let xpGiven = false; + const seenModes = new Set(); + const PI = 3.14; + + function setActive(){ + ['mb','ms','ml'].forEach(function(s, i){ + const b = document.getElementById('p6-iv2-'+s); + const m = ['ball','seg','lay'][i]; + if(!b) return; + b.classList.toggle('primary', m === mode); + }); + } + + function parseNum(id){ const el = document.getElementById(id); if(!el) return NaN; const v = (el.value||'').replace(',', '.').trim(); const x = parseFloat(v); return isFinite(x) ? x : NaN; } + + function render(){ + let h = ''; + if(mode === 'ball'){ + h = '

Шар целиком

' + + '
' + + '$R=$' + + '' + + '
'; + } else if(mode === 'seg'){ + h = '

Шаровой сегмент

' + + '
' + + '$R=$' + + '$h=$' + + '' + + '
'; + } else { + h = '

Шаровой слой

' + + '
' + + '$R=$' + + '$r_1=$' + + '$r_2=$' + + '$h=$' + + '' + + '
'; + } + formBox.innerHTML = h; + renderMath(formBox); + const btn = document.getElementById('p6-iv2-calc'); + if(btn) btn.addEventListener('click', calc); + } + + function calc(){ + let out = ''; + if(mode === 'ball'){ + const R = parseNum('p6-iv2-R'); + if(!isFinite(R) || R<=0){ outBox.innerHTML = '✗ Введи $R>0$.'; renderMath(outBox); return; } + const S = 4*PI*R*R; + const V = (4/3)*PI*R*R*R; + const C = 2*PI*R; + out = '

Шар радиуса $R='+fmt(R)+'$:

' + + '

$S_{\\text{сферы}}=4\\pi R^2=4\\cdot 3{,}14\\cdot '+fmt(R*R)+'\\approx '+fmt(+S.toFixed(2))+'$

' + + '

$V_{\\text{шара}}=\\dfrac{4}{3}\\pi R^3\\approx '+fmt(+V.toFixed(2))+'$

' + + '

Длина большой окружности: $C=2\\pi R\\approx '+fmt(+C.toFixed(2))+'$

' + + '

$\\dfrac{V}{S}=\\dfrac{R}{3}='+fmt(+(R/3).toFixed(4))+'$

'; + } else if(mode === 'seg'){ + const R = parseNum('p6-iv2-R'); + const h = parseNum('p6-iv2-h'); + if(!isFinite(R) || R<=0 || !isFinite(h) || h<=0 || h>2*R){ outBox.innerHTML = '✗ Введи $R>0$ и $0'; renderMath(outBox); return; } + const V = PI*h*h*(3*R - h)/3; + const S = 2*PI*R*h; + const r = Math.sqrt(Math.max(0, 2*R*h - h*h)); + out = '

Шаровой сегмент $R='+fmt(R)+'$, $h='+fmt(h)+'$:

' + + '

$V_{\\text{сегм}}=\\dfrac{\\pi h^2(3R-h)}{3}=\\dfrac{3{,}14\\cdot '+fmt(h*h)+'\\cdot '+fmt(3*R-h)+'}{3}\\approx '+fmt(+V.toFixed(2))+'$

' + + '

$S_{\\text{сфер.часть}}=2\\pi R h=2\\cdot 3{,}14\\cdot '+fmt(R)+'\\cdot '+fmt(h)+'\\approx '+fmt(+S.toFixed(2))+'$

' + + '

Радиус основания сегмента: $r=\\sqrt{2Rh-h^2}=\\sqrt{'+fmt(2*R*h-h*h)+'}\\approx '+fmt(+r.toFixed(4))+'$

'; + } else { + const R = parseNum('p6-iv2-R'); + const r1 = parseNum('p6-iv2-r1'); + const r2 = parseNum('p6-iv2-r2'); + const h = parseNum('p6-iv2-h'); + if(!isFinite(R) || R<=0 || !isFinite(r1) || r1<0 || !isFinite(r2) || r2<0 || !isFinite(h) || h<=0){ outBox.innerHTML = '✗ Введи корректные значения ($R>0$, $r_1,r_2\\ge 0$, $h>0$).'; renderMath(outBox); return; } + const V = PI*h*(3*r1*r1 + 3*r2*r2 + h*h)/6; + const S = 2*PI*R*h; + out = '

Шаровой слой $R='+fmt(R)+'$, $r_1='+fmt(r1)+'$, $r_2='+fmt(r2)+'$, $h='+fmt(h)+'$:

' + + '

$V_{\\text{слой}}=\\dfrac{\\pi h(3r_1^2+3r_2^2+h^2)}{6}\\approx '+fmt(+V.toFixed(2))+'$

' + + '

$S_{\\text{сфер.часть}}=2\\pi R h\\approx '+fmt(+S.toFixed(2))+'$

' + + '

Площадь полной боковой поверхности слоя зависит только от $R$ и $h$ — это и есть свойство сферического пояса.

'; + } + outBox.innerHTML = out; + renderMath(outBox); + seenModes.add(mode); + if(seenModes.size >= 3 && !xpGiven){ + xpGiven = true; + addXp(10, 'p6-iv2'); + bumpProgress('p6', 15); + } + } + + ['mb','ms','ml'].forEach(function(s, i){ + const b = document.getElementById('p6-iv2-'+s); + const m = ['ball','seg','lay'][i]; + if(!b) return; + b.addEventListener('click', function(){ mode = m; setActive(); render(); outBox.innerHTML=''; }); + }); + setActive(); + render(); + })(); + + /* IV3 — Вписан или описан? */ + (function(){ + const tasks = [ + { q:'Шар касается всех 6 граней куба, его центр совпадает с центром куба.', a:'in', h:'Если шар касается всех граней изнутри — он вписан в куб.' }, + { q:'Все 8 вершин куба лежат на сфере с центром в центре куба.', a:'out', h:'Все вершины на сфере — шар описан около куба.' }, + { q:'Радиус шара равен $\\dfrac{a}{2}$, где $a$ — сторона куба.', a:'in', h:'$r=a/2$ — это вписанный шар (касается граней в центре).' }, + { q:'Радиус шара равен $\\dfrac{a\\sqrt{3}}{2}$, где $a$ — сторона куба.', a:'out', h:'$R=\\dfrac{a\\sqrt 3}{2}$ = половина диагонали — шар описан.' }, + { q:'Шар касается боковой поверхности цилиндра и обоих его оснований.', a:'in', h:'Касается всей поверхности изнутри — шар вписан в цилиндр ($h=2R$).' }, + { q:'Все 4 вершины правильного тетраэдра лежат на сфере.', a:'out', h:'Все вершины на сфере — сфера описана около тетраэдра.' } + ]; + const list = document.getElementById('p6-iv3-list'); + const scoreEl = document.getElementById('p6-iv3-score'); + const solved = new Set(); + let xpGiven = false; + list.innerHTML = tasks.map(function(t, i){ + return '
' + + '
Задание '+(i+1)+'. '+t.q+'
' + + '
' + + '' + + '' + + '
' + + '' + + '
'; + }).join(''); + renderMath(list); + list.querySelectorAll('button[data-i]').forEach(function(b){ + b.addEventListener('click', function(){ + const i = +b.dataset.i, v = b.dataset.v, t = tasks[i]; + const fb = document.getElementById('p6-iv3-fb-'+i); + if(solved.has(i)) return; + if(v === t.a){ + feedback(fb, true, '✓ Верно. '+t.h); + solved.add(i); + scoreEl.textContent = solved.size; + if(solved.size === tasks.length && !xpGiven){ + xpGiven = true; + addXp(15, 'p6-iv3'); + bumpProgress('p6', 25); + } + } else { + feedback(fb, false, '✗ Не то. Подумай: шар вписан = касается граней; описан = вершины на сфере.'); + } + }); + }); + })(); + + /* IV4 — Тренажёр */ + (function(){ + const tasks = [ + { q:'Шар $R=5$. Найди $V$ (используй $\\pi\\approx 3{,}14$).', a:523.33, tol:0.6 }, + { q:'Шар $R=3$. Найди $S$ (используй $\\pi\\approx 3{,}14$).', a:113.04, tol:0.1 }, + { q:'Шар вписан в куб со стороной $a=6$. Найди $V_{\\text{шара}}$ ($\\pi\\approx 3{,}14$).', a:113.04, tol:0.1 }, + { q:'Шар описан около куба со стороной $a=2$. Найди радиус шара $R$ (с точностью до 0,01).', a:1.73, tol:0.05 }, + { q:'Шаровой сегмент: $R=5$, $h=2$. Найди $V_{\\text{сегм}}$ ($\\pi\\approx 3{,}14$).', a:54.43, tol:0.1 }, + { q:'Шар $R=10$, сферический пояс высотой $h=4$. Найди $S$ пояса ($\\pi\\approx 3{,}14$).', a:251.2, tol:0.3 } + ]; + const list = document.getElementById('p6-iv4-list'); + const scoreEl = document.getElementById('p6-iv4-score'); + const solved = new Set(); + let xpGiven = false; + list.innerHTML = tasks.map(function(t, i){ + return '
' + + '
Задача '+(i+1)+'. '+t.q+'
' + + '
' + + '' + + '' + + '
' + + '' + + '
'; + }).join(''); + renderMath(list); + list.querySelectorAll('button[data-i]').forEach(function(b){ + b.addEventListener('click', function(){ + const i = +b.dataset.i, t = tasks[i]; + const inp = document.getElementById('p6-iv4-inp-'+i); + const fb = document.getElementById('p6-iv4-fb-'+i); + const raw = (inp.value || '').replace(',', '.').trim(); + const val = parseFloat(raw); + if(!isFinite(val)){ feedback(fb, false, '✗ Введи число'); return; } + if(Math.abs(val - t.a) <= t.tol){ + feedback(fb, true, '✓ Верно!'); + if(!solved.has(i)){ + solved.add(i); + scoreEl.textContent = solved.size; + if(solved.size === tasks.length && !xpGiven){ + xpGiven = true; + addXp(15, 'p6-iv4'); + bumpProgress('p6', 25); + setTimeout(function(){ achievement('p6_done'); }, 400); + } + } + } else { + feedback(fb, false, '✗ Не точно. Пересчитай с $\\pi\\approx 3{,}14$.'); + } + }); + }); + })(); + + wireReadBtn('p6'); +} + /* ===== STUB BUILDER — единый для всех параграфов раздела (Phase 0) ===== */ function buildStub(id){ @@ -1071,6 +1522,11 @@ const SEARCH_INDEX = (function(){ arr.push({kind:'Теория',title:'Уравнение сферы',desc:'(x-a)^2+(y-b)^2+(z-c)^2=R^2',sec:'p5'}); arr.push({kind:'Теория',title:'Касательная плоскость к сфере',desc:'перпендикулярна радиусу в точке касания',sec:'p5'}); arr.push({kind:'Теория',title:'Сечение сферы плоскостью',desc:'r = sqrt(R^2 - d^2), большой круг',sec:'p5'}); + arr.push({kind:'Теория',title:'Площадь сферы и объём шара',desc:'S = 4πR², V = (4/3)πR³',sec:'p6'}); + arr.push({kind:'Теория',title:'Шаровой сегмент',desc:'V = πh²(3R−h)/3, S = 2πRh',sec:'p6'}); + arr.push({kind:'Теория',title:'Шаровой сектор и слой',desc:'V_сект = (2/3)πR²h; V_слой = πh(3r1²+3r2²+h²)/6',sec:'p6'}); + arr.push({kind:'Теория',title:'Шар, вписанный и описанный около куба',desc:'r = a/2, R = a√3/2',sec:'p6'}); + arr.push({kind:'Теория',title:'Шар и цилиндр',desc:'вписан: h=2R; описан: R_шар=√(R²+(h/2)²)',sec:'p6'}); return arr; })(); function initSearch(){