From 22bd60cf0fd211ca00f39a14d01e24cb2cce670c Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Thu, 28 May 2026 08:38:19 +0300 Subject: [PATCH] =?UTF-8?q?feat(geom8):=20Wave=204=20=D0=93=D0=BB=D0=B0?= =?UTF-8?q?=D0=B2=D1=8B=201=20=E2=80=94=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BB?= =?UTF-8?q?=20=D0=B3=D0=BB=D0=B0=D0=B2=D1=8B=20(=D1=88=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B3=D0=B0=D0=BB=D0=BA=D0=B0,=20=D0=BA=D0=B0=D1=80=D1=82?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B5=D0=B9,=207=20=D0=B1?= =?UTF-8?q?=D0=BE=D1=81=D1=81=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Часть 1: 9 mini-cards с формулами всех 16 параграфов (KaTeX). Часть 2: интерактивная SVG-карта иерархии четырёхугольников (клик по узлу — подсветка свойств). Часть 3: 7 интегрированных боссов (по 10 XP): - Босс 1: многоугольник из суммы углов 1620° - Босс 2: параллелограмм через треугольник ABD - Босс 3: средние линии прямоугольника → ромб - Босс 4: ромб 60° → диагонали (Пифагор) - Босс 5: теорема Фалеса, 3 подзадачи - Босс 6: треугольник 12-16-20 — средняя линия + медиана + центроид - Босс 7: равнобедренная трапеция 20/8/10 Часть 4: при победе над всеми — achievement 'Мастер многоугольников Главы 1', +50 XP бонус, confetti, кнопка перехода к Главе 2. File: 5194 → 5558 LOC. Глава 1 полностью наполнена. Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/textbooks/geometry_8_ch1.html | 368 ++++++++++++++++++++++++- 1 file changed, 366 insertions(+), 2 deletions(-) diff --git a/frontend/textbooks/geometry_8_ch1.html b/frontend/textbooks/geometry_8_ch1.html index 8c89a11..9f5d2a6 100644 --- a/frontend/textbooks/geometry_8_ch1.html +++ b/frontend/textbooks/geometry_8_ch1.html @@ -495,7 +495,7 @@ const BUILDERS = { p5:()=>buildP5(), p6:()=>buildP6(), p7:()=>buildP7(), p8:()=>buildP8(), p9:()=>buildP9(), p10:()=>buildP10(), p11:()=>buildP11(), p12:()=>buildP12(), p13:()=>buildP13(), p14:()=>buildP14(), p15:()=>buildP15(), p16:()=>buildP16(), - final1:()=>buildFinal1stub(), + final1:()=>buildFinal1(), }; function ensureBuilt(id){ if(BUILT.has(id)) return; const fn = BUILDERS[id]; if(fn){ fn(); BUILT.add(id); } } function goTo(id){ @@ -5188,7 +5188,371 @@ function buildP16(){ })(); renderMath(box); } -function buildFinal1stub(){ document.getElementById('final1-body').innerHTML = '

Финал главы 1 — Волна 1: боссы и итоги появятся в следующем обновлении.

' + secNav('p16',null); } +/* ============================================================ + ФИНАЛ ГЛАВЫ 1 — Итоги · 7 боссов · Достижение + ============================================================ */ +function buildFinal1(){ + const box = document.getElementById('final1-body'); + let html = ''; + + /* === ЧАСТЬ 1: Итоговая шпаргалка === */ + html += `
+
+
+ +
+
Итоговая шпаргалка · Вся Глава 1
+
+
+
+ +
+
§1–3 Многоугольники
+

Диагонали: $D = \\dfrac{n(n-3)}{2}$

+

Сумма углов: $(n-2)\\cdot180°$

+

Сумма внешних: $360°$ (всегда)

+

Пример: шестиугольник — 9 диагоналей, $720°$ внутренних

+
+ +
+
§4–6 Параллелограмм
+

Свойства: противоположные стороны равны; противоположные углы равны; смежные углы в сумме $180°$; диагонали делятся пополам

+

Признаки: 2 пары равных сторон; 1 пара параллельных и равных; диагонали делятся пополам

+
+ +
+
§7–8 Прямоугольник
+

Все углы $= 90°$

+

Диагонали равны: $AC = BD$

+

$d = \\sqrt{a^2 + b^2}$

+

Признак: параллелограмм с равными диагоналями

+
+ +
+
§9 Ромб
+

Все стороны равны

+

Диагонали $\\perp$ и делят углы пополам

+

$S = \\dfrac{d_1 \\cdot d_2}{2}$

+

Пример: ромб со стороной 5 и диагоналями 6, 8 — $S=24$

+
+ +
+
§10 Квадрат
+

Прямоугольник + ромб одновременно

+

$d = a\\sqrt{2}$

+

$S = a^2$, $P = 4a$

+

Все свойства ромба и прямоугольника вместе

+
+ +
+
§11 Теорема Фалеса
+

Параллельные прямые отсекают пропорциональные отрезки

+

Если $n$ параллельных делят одну прямую на равные части — они делят на равные части и другую прямую

+
+ +
+
§12 Медианы
+

3 медианы пересекаются в центроиде $G$

+

$G$ делит каждую медиану в отношении $2:1$ от вершины

+

$BG = \\tfrac{2}{3}m_b$, $GM_b = \\tfrac{1}{3}m_b$

+
+ +
+
§13 Средняя линия Δ
+

Соединяет середины двух сторон

+

Параллельна третьей стороне

+

$MN = \\dfrac{1}{2} \\cdot BC$

+
+ +
+
§14–16 Трапеция
+

Одна пара параллельных сторон ($a \\parallel b$)

+

Средняя линия: $m = \\dfrac{a+b}{2}$

+

Равнобедренная: углы при основании равны, диагонали равны

+

Признаки: равные углы при осн. или равные диагонали

+
+ +
+
+
`; + + /* === ЧАСТЬ 2: Карта связей — иерархия четырёхугольников === */ + html += `
+
КАРТА СВЯЗЕЙ
Иерархия четырёхугольников
+
Нажми на фигуру, чтобы увидеть её ключевые свойства. Стрелки означают «является частным случаем».
+
+
Нажми на фигуру в схеме выше
+
`; + + /* === ЧАСТЬ 3: 7 боссов === */ + html += `
+
+ 7 БОССОВ ГЛАВЫ 1 +
Интегрированные задачи
+
+
Каждая задача объединяет 2–3 темы главы. +10 XP за каждого побеждённого босса. Победи всех семерых — получишь +50 XP и достижение!
+
+
`; + + /* === ЧАСТЬ 4: Финальная плашка === */ + html += ``; + + html += `
+ +
`; + + html += secNav('p16', null); + box.innerHTML = html; + + /* === JS: Карта связей SVG === */ + (function(){ + const W = 680, H = 320; + const nodes = [ + { id:'quad', x:340, y:30, label:'Четырёхугольник', r:52, + props:'4 стороны, 4 угла, сумма углов = 360°. Диагонали — отрезки, соединяющие несмежные вершины.' }, + { id:'trap', x:120, y:130, label:'Трапеция', r:42, + props:'Одна пара параллельных сторон. Средняя линия = (a+b)/2. Признак равнобедренной: равные углы при основании или равные диагонали.' }, + { id:'istrap', x:90, y:250, label:'Равнобедренная трапеция', r:42, + props:'Боковые стороны равны. Углы при каждом основании равны. Диагонали равны.' }, + { id:'para', x:400, y:130, label:'Параллелограмм', r:48, + props:'Две пары параллельных сторон. Противоположные стороны и углы равны. Диагонали делятся пополам.' }, + { id:'rect', x:290, y:250, label:'Прямоугольник', r:44, + props:'Все углы = 90°. Диагонали равны: AC = BD. d = √(a²+b²). Признак: параллелограмм с равными диагоналями.' }, + { id:'rhomb', x:490, y:250, label:'Ромб', r:40, + props:'Все стороны равны. Диагонали ⊥ и делят углы пополам. S = d₁·d₂/2.' }, + { id:'sq', x:390, y:300, label:'Квадрат', r:38, + props:'Прямоугольник и ромб одновременно. d = a√2. S = a². Все свойства ромба и прямоугольника.' }, + ]; + const edges = [ + ['quad','trap'], ['quad','para'], + ['trap','istrap'], ['para','rect'], ['para','rhomb'], + ['rect','sq'], ['rhomb','sq'], + ]; + let sel = null; + function draw(selId){ + const colors = { quad:'#d97706', trap:'#f97316', istrap:'#ef4444', para:'#8b5cf6', rect:'#2563eb', rhomb:'#0891b2', sq:'#059669' }; + let s = ``; + s += ``; + edges.forEach(([a,b])=>{ + const na=nodes.find(n=>n.id===a), nb=nodes.find(n=>n.id===b); + const dx=nb.x-na.x, dy=nb.y-na.y, len=Math.sqrt(dx*dx+dy*dy); + const sx=na.x+dx/len*na.r, sy=na.y+dy/len*na.r; + const ex=nb.x-dx/len*(nb.r+7), ey=nb.y-dy/len*(nb.r+7); + const isActive = selId===a||selId===b; + s += ``; + }); + nodes.forEach(n=>{ + const isS = selId===n.id; + const col = colors[n.id] || '#d97706'; + s += ``; + const words = n.label.split(' '); + const line1 = words.slice(0,2).join(' '), line2 = words.slice(2).join(' '); + const textCol = isS ? '#fff' : col; + if(line2){ + s += `${line1}`; + s += `${line2}`; + } else { + s += `${line1}`; + } + }); + s += ''; + document.getElementById('final1-hier-svg').innerHTML = s; + document.getElementById('final1-hier-svg').querySelector('svg').addEventListener('click', function(e){ + const el = e.target.closest('[data-nid]'); + if(!el) return; + const nid = el.dataset.nid; + sel = (sel===nid) ? null : nid; + const nd = nodes.find(n=>n.id===nid); + if(sel && nd) document.getElementById('final1-hier-info').innerHTML = '' + nd.label + ': ' + nd.props; + else document.getElementById('final1-hier-info').textContent = 'Нажми на фигуру в схеме выше'; + draw(sel); + }); + } + draw(null); + })(); + + /* === JS: 7 боссов === */ + (function(){ + const bosses = [ + { + n: 1, + title: 'Многоугольники и углы', + color: '#d97706', + cond: 'В выпуклом многоугольнике сумма внутренних углов равна $1620°$.', + parts: [ + { label: 'Сколько у него сторон?', ans: 11, hint: '$(n-2)\\cdot180°=1620°$ → $n-2=9$ → $n=11$' }, + { label: 'Сколько диагоналей?', ans: 44, hint: '$\\dfrac{11\\cdot(11-3)}{2}=\\dfrac{88}{2}=44$' }, + { label: 'Если он правильный, найди один внутренний угол (в градусах).', ans: 147, hint: '$\\dfrac{1620°}{11}\\approx147.27°$ — ответ: 147 (до целых)', tol: 1 }, + { label: 'Один внешний угол правильного 11-угольника (в градусах, до целых).', ans: 33, hint: '$\\dfrac{360°}{11}\\approx32.7°$ — ответ: 33', tol: 1 }, + ], + }, + { + n: 2, + title: 'Параллелограмм через диагональ', + color: '#8b5cf6', + cond: 'В параллелограмме $ABCD$ диагональ $BD$ делит его на два треугольника. $\\angle ABD=40°$, $\\angle ADB=65°$.', + parts: [ + { label: 'Найди угол A параллелограмма (в градусах).', ans: 75, hint: 'В треугольнике ABD: $\\angle A = 180°-40°-65°=75°$' }, + { label: 'Найди угол B параллелограмма (в градусах).', ans: 105, hint: 'Смежные углы параллелограмма в сумме $180°$: $\\angle B=180°-75°=105°$' }, + { label: 'Найди угол D параллелограмма (в градусах).', ans: 105, hint: 'Противоположные углы параллелограмма равны: $\\angle D=\\angle B=105°$' }, + ], + }, + { + n: 3, + title: 'Прямоугольник и ромб', + color: '#2563eb', + cond: 'В прямоугольнике $ABCD$: $AB=6$, $AD=8$. Точки $M, N, K, L$ — середины сторон $AB, BC, CD, DA$ соответственно.', + parts: [ + { label: 'Найди длину MN (стороны MNKL).', ans: 5, hint: 'По теореме средней линии треугольника: $MN = \\tfrac{1}{2}AC$, $AC=\\sqrt{36+64}=10$, $MN=5$' }, + { label: 'Докажи, что MNKL — ромб. Все стороны MNKL равны? (1 — да, 0 — нет)', ans: 1, hint: 'Все стороны = 5 (по теореме средней линии во всех четырёх треугольниках). MNKL — ромб.' }, + { label: 'Найди площадь MNKL.', ans: 24, hint: '$S_{MNKL} = \\tfrac{1}{2}S_{ABCD}=\\tfrac{1}{2}\\cdot48=24$' }, + ], + }, + { + n: 4, + title: 'Ромб и теорема Пифагора', + color: '#0891b2', + cond: 'В ромбе $ABCD$ сторона $a=10$, угол $\\angle A=60°$.', + parts: [ + { label: 'Найди длину бо́льшей диагонали (AC, проходит через угол A=60°, единицы).', ans: 10, hint: 'Треугольник ABD при угле 60°: $\\triangle ABD$ равносторонний ($AB=BD=AD=10$). $AC=10$. Диагональ через вершины с углом 60° равна стороне.' }, + { label: 'Найди длину меньшей диагонали BD (единицы), используя теорему Пифагора.', ans: 17, hint: '$AO=5$ (полудиагональ AC), $BO=\\sqrt{10^2-5^2}=\\sqrt{75}\\approx8.66$. $BD=2\\cdot8.66\\approx17.32$. Округли до 17.', tol: 1 }, + { label: 'Найди площадь ромба (округли до целых).', ans: 87, hint: '$S=\\dfrac{d_1\\cdot d_2}{2}=\\dfrac{10\\cdot17.32}{2}\\approx86.6\\approx87$', tol: 1 }, + ], + }, + { + n: 5, + title: 'Теорема Фалеса', + color: '#16a34a', + cond: 'По теореме Фалеса параллельные прямые делят отрезки пропорционально.', + parts: [ + { label: 'Отрезок AB разделён на 5 равных частей параллельными прямыми, пересекающими отрезок CD (CD ∥ AB, CD=20). Расстояние между соседними точками деления на CD (число).', ans: 4, hint: '5 равных частей делят CD тоже на 5 равных частей по теореме Фалеса: $20/5=4$' }, + { label: 'Отрезок AB=15 делится параллельными прямыми на n равных частей, расстояние между точками деления = 3. Найди n.', ans: 5, hint: 'Шаг = $AB/n = 15/n = 3$ → $n=5$' }, + { label: 'Три параллельные прямые делят отрезок PQ на части 4, 4, 4 (три равные части). Отрезок RS, параллельный PQ, имеет длину 30. Какова длина каждой части RS?', ans: 10, hint: 'По теореме Фалеса — тоже 3 равные части: $30/3=10$' }, + ], + }, + { + n: 6, + title: 'Медиана и средняя линия', + color: '#e11d48', + cond: 'В треугольнике $ABC$: $AB=12$, $BC=16$, $AC=20$. Это прямоугольный треугольник ($\\angle B=90°$).', + parts: [ + { label: 'M — середина AB, N — середина AC. Найди MN (средняя линия треугольника).', ans: 8, hint: '$MN = \\tfrac{1}{2}BC = \\tfrac{1}{2}\\cdot16 = 8$' }, + { label: 'G — центроид. Длина медианы из B к середине AC: $m_b=\\tfrac{1}{2}AC=10$. Найди BG.', ans: 7, hint: '$BG = \\tfrac{2}{3}m_b = \\tfrac{2}{3}\\cdot10 = 6.67 \\approx 7$', tol: 1 }, + { label: 'В прямоугольном треугольнике медиана из прямого угла равна половине гипотенузы. Гипотенуза AC=20. Найди медиану из B (m_b).', ans: 10, hint: '$m_b = \\tfrac{1}{2}\\cdot AC = \\tfrac{1}{2}\\cdot20 = 10$' }, + ], + }, + { + n: 7, + title: 'Трапеция (комплексная)', + color: '#f97316', + cond: 'В равнобедренной трапеции $ABCD$: $AD \\parallel BC$, $AD=20$, $BC=8$, боковая сторона $AB=10$.', + parts: [ + { label: 'Найди высоту трапеции h.', ans: 8, hint: 'Проекция основания: $(20-8)/2=6$. $h=\\sqrt{10^2-6^2}=\\sqrt{64}=8$' }, + { label: 'Найди среднюю линию трапеции m.', ans: 14, hint: '$m=\\dfrac{20+8}{2}=14$' }, + { label: 'Найди длину диагонали AC (округли до целых).', ans: 16, hint: 'Сдвиг горизонтальный = $(20-8)/2=6$. $AC=\\sqrt{(8+6)^2+8^2}=\\sqrt{196+64}=\\sqrt{260}\\approx16$', tol: 1 }, + ], + }, + ]; + + window.final1BossSolved = new Set(); + const bossBox = document.getElementById('final1-bosses'); + bossBox.innerHTML = bosses.map(b => { + const partsHtml = b.parts.map((p,pi) => ` +
+
${p.label}
+
+ + + +
+ +
`).join(''); + + return `
+
+ БОСС ${b.n} + ${b.title} + +
+
${b.cond}
+ ${partsHtml} +
`; + }).join(''); + + /* attach logic */ + function checkPart(bi, pi){ + const boss = bosses[bi]; + const part = boss.parts[pi]; + const inp = bossBox.querySelector(`.final1-boss-inp[data-b="${bi}"][data-p="${pi}"]`); + const fb = bossBox.querySelector(`.final1-boss-fb[data-b="${bi}"][data-p="${pi}"]`); + const ok = bossBox.querySelector(`.final1-boss-ok[data-b="${bi}"][data-p="${pi}"]`); + if(!inp) return; + const val = parseFloat(inp.value); + const tol = part.tol !== undefined ? part.tol : 0; + if(Math.abs(val - part.ans) <= tol){ + feedback(fb, true, 'Верно! ' + (part.hint ? '
' + part.hint + '' : '')); + inp.disabled = true; + const btn = bossBox.querySelector(`.final1-boss-check[data-b="${bi}"][data-p="${pi}"]`); + if(btn) btn.disabled = true; + if(ok) ok.style.display = 'inline'; + /* check if all parts of boss solved */ + const allDone = boss.parts.every((_, pj) => { + const el = bossBox.querySelector(`.final1-boss-inp[data-b="${bi}"][data-p="${pj}"]`); + return el && el.disabled; + }); + if(allDone && !window.final1BossSolved.has(bi)){ + window.final1BossSolved.add(bi); + addXp(10, 'final1-boss-' + (bi+1)); + const xpBadge = document.getElementById('final1-boss-xp-' + bi); + if(xpBadge) xpBadge.style.display = 'inline'; + bumpProgress('final1', 8); + /* check all bosses done */ + if(window.final1BossSolved.size === bosses.length){ + setTimeout(()=>{ + confetti(); + if(!STATE.achievements.has('final1-master')){ + STATE.achievements.set('final1-master', 'Мастер многоугольников Главы 1'); + saveProgress(); + const pop = document.getElementById('ach-popup'); + if(pop){ document.getElementById('ach-text').textContent = 'Мастер многоугольников Главы 1!'; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'), 4000); } + } + addXp(50, 'final1-all-bosses'); + bumpProgress('final1', 20); + const fin = document.getElementById('final1-finish'); + if(fin) fin.style.display = 'block'; + }, 500); + } + } + } else { + feedback(fb, false, 'Неверно. Подсказка: ' + part.hint); + } + } + + bossBox.querySelectorAll('.final1-boss-check').forEach(btn=>{ + btn.addEventListener('click', ()=>{ checkPart(+btn.dataset.b, +btn.dataset.p); }); + }); + bossBox.querySelectorAll('.final1-boss-inp').forEach(inp=>{ + inp.addEventListener('keydown', e=>{ if(e.key==='Enter'){ const btn=bossBox.querySelector(`.final1-boss-check[data-b="${inp.dataset.b}"][data-p="${inp.dataset.p}"]`); if(btn)btn.click(); } }); + }); + })(); + + renderMath(box); +}