diff --git a/frontend/textbooks/physics_8_ch1.html b/frontend/textbooks/physics_8_ch1.html
index d50d66c..a97a694 100644
--- a/frontend/textbooks/physics_8_ch1.html
+++ b/frontend/textbooks/physics_8_ch1.html
@@ -283,9 +283,24 @@ const SIDEBARS = {
["Теплопередача","проводность, конвекция, излучение"],
["Знак","нагрев $\\Rightarrow$ $\\Delta U > 0$; охлаждение $\\Rightarrow$ $\\Delta U < 0$"]
]},
- p3:{title:"Шпаргалка § 3",rows:[["В разработке","Phase 1 Wave 2"]]},
- p4:{title:"Шпаргалка § 4",rows:[["В разработке","Phase 1 Wave 2"]]},
- p5:{title:"Шпаргалка § 5",rows:[["В разработке","Phase 1 Wave 2"]]},
+ p3:{title:"Шпаргалка § 3",rows:[
+ ["Теплопроводность","передача $U$ без переноса вещества"],
+ ["Хорошие","металлы (медь, серебро, алюминий)"],
+ ["Плохие","дерево, пластик, воздух, шерсть, вакуум"],
+ ["В газах и жидкостях","низкая (исключение — ртуть)"]
+ ]},
+ p4:{title:"Шпаргалка § 4",rows:[
+ ["Конвекция","перенос $U$ потоками жидкости / газа"],
+ ["Механизм","тёплое $\\uparrow$, холодное $\\downarrow$"],
+ ["В твёрдых телах","невозможна"],
+ ["Примеры","батарея, ветер, кипение"]
+ ]},
+ p5:{title:"Шпаргалка § 5",rows:[
+ ["Излучение","перенос $U$ электромагнитными волнами"],
+ ["Среда","не нужна — идёт через вакуум"],
+ ["Излучают всё","чем горячее, тем сильнее"],
+ ["Тёмные тела","поглощают и излучают сильнее светлых"]
+ ]},
p6:{title:"Шпаргалка § 6",rows:[["В разработке","Phase 1 Wave 3"]]},
p7:{title:"Шпаргалка § 7",rows:[["В разработке","Phase 1 Wave 3"]]},
p8:{title:"Шпаргалка § 8",rows:[["В разработке","Phase 1 Wave 4"]]},
@@ -298,9 +313,9 @@ const SIDEBARS = {
const TIPS=[
{sec:'p1',html:"Тело состоит из молекул. Они движутся (есть $E_k$) и взаимодействуют (есть $E_p$). Их сумма — внутренняя энергия $U$. Главное: $U$ не зависит от того, движется ли тело и на какой высоте оно лежит."},
{sec:'p2',html:"Изменить $U$ можно двумя способами: совершить работу (трение, сжатие, удар) или передать тепло без работы (контакт, поток, излучение). Чай в стакане остывает — это теплопередача. Спички в коробке нагреваются от тряски — это работа."},
- {sec:'p3',html:"Параграф § 3 будет реализован в Phase 1 Wave 2. Используем хелперы из phys.js и optics.js."},
- {sec:'p4',html:"Параграф § 4 будет реализован в Phase 1 Wave 2. Используем хелперы из phys.js и optics.js."},
- {sec:'p5',html:"Параграф § 5 будет реализован в Phase 1 Wave 2. Используем хелперы из phys.js и optics.js."},
+ {sec:'p3',html:"Один конец металлического стержня в огне — другой нагревается, хотя ничто не движется. Это теплопроводность : молекулы передают энергию соседям. У металлов это работает быстро, у дерева — медленно."},
+ {sec:'p4',html:"Тёплый воздух легче холодного и поднимается вверх. Так батарея греет всю комнату — это конвекция . В твёрдых телах конвекции нет, потому что молекулы не могут свободно двигаться."},
+ {sec:'p5',html:"Солнце греет Землю через космический вакуум — теплопроводность и конвекция тут невозможны. Это излучение электромагнитными волнами. Чёрная футболка в жаркий день нагревается сильнее белой."},
{sec:'p6',html:"Параграф § 6 будет реализован в Phase 1 Wave 3. Используем хелперы из phys.js и optics.js."},
{sec:'p7',html:"Параграф § 7 будет реализован в Phase 1 Wave 3. Используем хелперы из phys.js и optics.js."},
{sec:'p8',html:"Параграф § 8 будет реализован в Phase 1 Wave 4. Используем хелперы из phys.js и optics.js."},
@@ -313,9 +328,9 @@ const TIPS=[
const BUILDERS = {
p1: ()=>{ build_p1(); },
p2: ()=>{ build_p2(); },
- p3: ()=>{ const box=document.getElementById('p3-body'); box.innerHTML = buildStub('p3', 'Теплопроводность', 'Phase 1 Wave 2') + secNavFor('p3') + readButton('p3'); renderMath(box); wireReadBtn('p3'); },
- p4: ()=>{ const box=document.getElementById('p4-body'); box.innerHTML = buildStub('p4', 'Конвекция', 'Phase 1 Wave 2') + secNavFor('p4') + readButton('p4'); renderMath(box); wireReadBtn('p4'); },
- p5: ()=>{ const box=document.getElementById('p5-body'); box.innerHTML = buildStub('p5', 'Излучение', 'Phase 1 Wave 2') + secNavFor('p5') + readButton('p5'); renderMath(box); wireReadBtn('p5'); },
+ p3: ()=>{ build_p3(); },
+ p4: ()=>{ build_p4(); },
+ p5: ()=>{ build_p5(); },
p6: ()=>{ const box=document.getElementById('p6-body'); box.innerHTML = buildStub('p6', 'Расчёт количества теплоты при нагревании и охлаждении. Удельная теплоёмкость', 'Phase 1 Wave 3') + secNavFor('p6') + readButton('p6'); renderMath(box); wireReadBtn('p6'); },
p7: ()=>{ const box=document.getElementById('p7-body'); box.innerHTML = buildStub('p7', 'Горение. Удельная теплота сгорания топлива', 'Phase 1 Wave 3') + secNavFor('p7') + readButton('p7'); renderMath(box); wireReadBtn('p7'); },
p8: ()=>{ const box=document.getElementById('p8-body'); box.innerHTML = buildStub('p8', 'Плавление и кристаллизация', 'Phase 1 Wave 4') + secNavFor('p8') + readButton('p8'); renderMath(box); wireReadBtn('p8'); },
@@ -1297,6 +1312,724 @@ function _initP2_mcq(){
render();
}
+/* ======================================================================
+ PHASE 1 · WAVE 2 — §3, §4, §5
+ ====================================================================== */
+
+/* ======== §3 — Теплопроводность ======== */
+function build_p3(){
+ const box = document.getElementById('p3-body');
+ let h = '';
+
+ h += makeCard('theory', 'Что такое теплопроводность', '§ 3.1',
+ '
Теплопроводность — передача внутренней энергии от более горячих частей тела к более холодным без переноса вещества .
'
+ +'Механизм: быстрые молекулы (в горячей части) сталкиваются с медленными (в холодной) и передают им часть своей $E_k$. Так энергия путешествует через тело молекула за молекулой.
'
+ +'Само вещество при этом остаётся на месте — двигается только энергия.
'
+ );
+ h += makeCard('rule', 'Хорошие и плохие проводники', '§ 3.2',
+ 'Хорошие проводники тепла:
'
+ +'металлы: серебро, медь, алюминий, железо; в них свободные электроны быстро переносят энергию. '
+ +'Плохие проводники (тепловые изоляторы):
'
+ +'дерево, стекло, кирпич, пластик; шерсть, мех, пух, вата (они «держат» воздух между волокнами); сами газы и жидкости (кроме ртути); вакуум — идеальный изолятор: нет частиц $\\Rightarrow$ нечем передавать. '
+ );
+ h += makeCard('example', 'Зачем это нам', '§ 3.3',
+ ''
+ +'Ручка сковороды — из дерева или пластика, чтобы не обжечь руку. '
+ +'Шуба греет не сама — между волосками много воздуха. '
+ +'Стеклопакет: два стекла + воздух между ними плохо проводят тепло. '
+ +'В термосе между двумя стенками — вакуум (минимум теплопроводности). '
+ +' '
+ );
+
+ /* IV1 — симуляция теплопроводности */
+ h += '';
+
+ /* IV2 — викторина «лучший проводник» */
+ h += ''
+ +''
+ +'
Выбери материал с лучшей теплопроводностью.
'
+ +'
'
+ +'
Следующий раунд
'
+ +'
Раунд: 1 / 6 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD хороший/плохой */
+ h += ''
+ +''
+ +'
Перетащи материалы в нужную группу.
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — MCQ */
+ h += ''
+ +''
+ +'
4+ правильных ответа — +15 XP.
'
+ +'
'
+ +'
Вопрос: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p3') + readButton('p3');
+ renderMath(box);
+ wireReadBtn('p3');
+
+ _initP3_sim();
+ _initP3_quiz();
+ _initP3_dnd();
+ _initP3_mcq();
+}
+
+function _initP3_sim(){
+ _killSim('p3sim');
+ const svg = document.getElementById('p3-sim'); if(!svg) return;
+ const W=460, H=80, padX=24, barY=20, barH=44;
+ let bar = window.PHYS.createHeatBar({ N: 40, tHot: 200, tCold: 0, alpha: 0.5 });
+ const MAT_LABELS = ['вакуум','шерсть','дерево','стекло','вода','свинец','железо','алюминий','медь','серебро'];
+ function alphaFromSlider(v){
+ /* v in 1..100, exponential mapping to 0.02..0.95 */
+ return 0.02 + (v/100) * 0.93;
+ }
+ function matLabel(v){
+ const idx = Math.min(MAT_LABELS.length-1, Math.floor(v/10));
+ return MAT_LABELS[idx];
+ }
+ let lastT = performance.now();
+ function tick(now){
+ if(!_isVisible('p3')){ _SIMS.p3sim.raf = requestAnimationFrame(tick); return; }
+ const dt = Math.min(50, now - lastT); lastT = now;
+ bar.step(dt * 0.06);
+ /* render */
+ let s = bar.render(padX, barY, W - 2*padX, barH);
+ /* подписи концов */
+ s += 'горячий ';
+ s += 'холодный ';
+ svg.innerHTML = s;
+ _SIMS.p3sim.raf = requestAnimationFrame(tick);
+ }
+ _SIMS.p3sim = { raf: 0 };
+ _SIMS.p3sim.raf = requestAnimationFrame(tick);
+
+ function applyAll(){
+ const th = +document.getElementById('p3-thr').value;
+ const tc = +document.getElementById('p3-tcr').value;
+ const av = +document.getElementById('p3-ar').value;
+ document.getElementById('p3-th').textContent = th;
+ document.getElementById('p3-tc').textContent = tc;
+ document.getElementById('p3-av').textContent = matLabel(av);
+ bar.setTHot(th); bar.setTCold(tc); bar.alpha = alphaFromSlider(av);
+ }
+ ['p3-thr','p3-tcr','p3-ar'].forEach(id => document.getElementById(id).addEventListener('input', applyAll));
+ document.getElementById('p3-reset').addEventListener('click', ()=>{
+ bar = window.PHYS.createHeatBar({ N: 40, tHot: +document.getElementById('p3-thr').value, tCold: +document.getElementById('p3-tcr').value, alpha: alphaFromSlider(+document.getElementById('p3-ar').value) });
+ });
+ applyAll();
+}
+
+function _initP3_quiz(){
+ const QS = [
+ {A:'медная ложка', B:'деревянная ложка', ans:'A', why:'Медь — отличный проводник, дерево — изолятор.'},
+ {A:'железная дверная ручка', B:'пластиковая дверная ручка', ans:'A', why:'Железо проводит тепло гораздо лучше пластика, поэтому железная ручка зимой кажется холоднее.'},
+ {A:'воздух', B:'вода', ans:'B', why:'Жидкости проводят тепло лучше газов, хотя обе плохо.'},
+ {A:'стекло', B:'серебро', ans:'B', why:'Серебро — лучший проводник тепла среди обычных металлов.'},
+ {A:'шерстяной свитер', B:'хлопковая футболка', ans:'B', why:'Хлопок проводит тепло немного лучше шерсти; шерсть лучше задерживает воздух и потому теплее (но проводит хуже).'},
+ {A:'вакуум', B:'воздух', ans:'B', why:'В вакууме нет частиц, поэтому теплопроводность нулевая. Воздух хоть и плохой, но проводник.'}
+ ];
+ let i = 0, ok = 0;
+ function render(){
+ const q = QS[i];
+ const wrap = document.getElementById('p3-quiz');
+ if(!wrap) return;
+ wrap.innerHTML =
+ ''
+ +'A. '+q.A+' '
+ +'B. '+q.B+' '
+ +'
'
+ +'
';
+ document.getElementById('p3-quiz-r').textContent = (i+1);
+ document.getElementById('p3-quiz-ok').textContent = ok;
+ wrap.querySelectorAll('[data-pick]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return;
+ const pick = btn.dataset.pick;
+ wrap.querySelectorAll('[data-pick]').forEach(b=>b.disabled=true);
+ const fb = document.getElementById('p3-quiz-fb');
+ if(pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p3-quiz'); bumpProgress('p3', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p3-quiz-ok').textContent = ok;
+ });
+ });
+ }
+ document.getElementById('p3-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP3_dnd(){
+ const items = [
+ {id:'cu', cat:'good', html:'медь'},
+ {id:'ag', cat:'good', html:'серебро'},
+ {id:'al', cat:'good', html:'алюминий'},
+ {id:'fe', cat:'good', html:'железо'},
+ {id:'wo', cat:'bad', html:'дерево'},
+ {id:'pl', cat:'bad', html:'пластик'},
+ {id:'sh', cat:'bad', html:'шерсть'},
+ {id:'va', cat:'bad', html:'вакуум'}
+ ];
+ const dnd = setupSorter({ poolId:'p3-dnd-pool', scopeSelector:'#sec-p3', cats:['good','bad'], items, columnLayout:false });
+ document.getElementById('p3-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p3-dnd-fb');
+ let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; });
+ if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +15 XP. Металлы — отличные проводники, остальное — плохие.'; addXp(15,'p3-dnd'); bumpProgress('p3', 20); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: металлы — это хорошие проводники.'; }
+ });
+ document.getElementById('p3-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p3-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP3_mcq(){
+ const QS = [
+ {q:'Что происходит при теплопроводности?', opts:['Переносится вещество и энергия','Переносится только энергия','Переносится только вещество','Тело меняет форму'], ans:1, why:'Молекулы передают $E_k$ соседям, оставаясь на месте.'},
+ {q:'В каком веществе теплопроводность нулевая?', opts:['в воде','в воздухе','в вакууме','в стекле'], ans:2, why:'В вакууме нет частиц — нечем передавать.'},
+ {q:'Почему шуба греет?', opts:['Сама вырабатывает тепло','Между ворсинками воздух — плохой проводник','Отражает тепло','Уменьшает излучение'], ans:1, why:'Шерсть удерживает прослойки воздуха, которые плохо проводят тепло.'},
+ {q:'У какого вещества теплопроводность выше?', opts:['у воды','у льда','у пара','одинакова'], ans:1, why:'У льда (твёрдое — упорядоченные молекулы передают энергию быстрее).'},
+ {q:'Зачем стеклопакет с воздухом между стёклами?', opts:['Для прочности','Для красоты','Воздух — плохой проводник, теряется меньше тепла','Чтобы стекло не треснуло'], ans:2, why:'Прослойка воздуха работает как теплоизолятор.'},
+ {q:'Какие частицы переносят тепло в металлах быстрее всего?', opts:['Атомы','Ионы','Молекулы','Свободные электроны'], ans:3, why:'Свободные электроны движутся быстро и переносят $E_k$ через весь металл.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p3-mcq'); if(!wrap) return;
+ let h = 'Вопрос '+(i+1)+'. '+q.q+'
';
+ h += '';
+ q.opts.forEach((opt, k)=>{ h += ''+(String.fromCharCode(65+k))+'. '+opt+' '; });
+ h += '
Следующий вопрос
';
+ wrap.innerHTML = h;
+ document.getElementById('p3-mcq-i').textContent = (i+1);
+ document.getElementById('p3-mcq-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p3-mcq-fb');
+ if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p3-mcq'); bumpProgress('p3', 3); }
+ else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p3-mcq-ok').textContent = ok;
+ if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf = document.getElementById('p3-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+' из '+QS.length+').'; addXp(15,'p3-mcq-bonus'); bumpProgress('p3', 15); }, 600); }
+ });
+ });
+ const nb = document.getElementById('p3-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ }
+ render();
+}
+
+/* ======== §4 — Конвекция ======== */
+function build_p4(){
+ const box = document.getElementById('p4-body');
+ let h = '';
+
+ h += makeCard('theory', 'Что такое конвекция', '§ 4.1',
+ 'Конвекция — передача внутренней энергии потоками жидкости или газа.
'
+ +'Нагретая часть жидкости (газа) расширяется , становится менее плотной и всплывает вверх. Холодная — опускается вниз. Так образуется круговорот, который и переносит тепло.
'
+ +'В твёрдых телах конвекции нет — молекулы зафиксированы, потоков образоваться не может.
'
+ );
+ h += makeCard('rule', 'Условия для конвекции', '§ 4.2',
+ ''
+ +'есть текучая среда (газ или жидкость); '
+ +'есть разность температур сверху и снизу: нагрев должен быть снизу или охлаждение сверху; '
+ +'есть гравитация (в невесомости конвекции почти нет). '
+ +' '
+ +'Если греть сверху — конвекции не будет: горячий слой и так наверху.
'
+ );
+ h += makeCard('example', 'Где встречается', '§ 4.3',
+ ''
+ +'Батарея греет всю комнату — горячий воздух поднимается к потолку, холодный спускается к полу. '
+ +'Кипение чайника: пузырьки и потоки воды видны глазом. '
+ +'Ветры в атмосфере: тёплый экватор и холодные полюса. '
+ +'Течения в океане: тёплый Гольфстрим греет Европу. '
+ +' '
+ );
+
+ /* IV1 — анимация конвекции */
+ h += ''
+ +''
+ +'
Включи / выключи нагреватель снизу. Тёплая жидкость поднимается по центру, холодная опускается по краям.
'
+ +'
'
+ +'
Включить нагрев Сброс
'
+ +'
';
+
+ /* IV2 — викторина «где конвекция?» */
+ h += ''
+ +''
+ +'
Назови среду или ситуацию — определи, бывает ли в ней конвекция.
'
+ +'
'
+ +'
Следующий раунд
'
+ +'
Раунд: 1 / 6 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD */
+ h += ''
+ +''
+ +'
Перетащи ситуации в нужную колонку.
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — MCQ */
+ h += ''
+ +''
+ +'
4+ правильных ответа — +15 XP.
'
+ +'
'
+ +'
Вопрос: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p4') + readButton('p4');
+ renderMath(box);
+ wireReadBtn('p4');
+
+ _initP4_sim();
+ _initP4_quiz();
+ _initP4_dnd();
+ _initP4_mcq();
+}
+
+function _initP4_sim(){
+ _killSim('p4sim');
+ const svg = document.getElementById('p4-sim'); if(!svg) return;
+ const W=460, H=240, vesselX=120, vesselY=20, vesselW=220, vesselH=180;
+ /* 30 частиц жидкости */
+ const N = 30;
+ const ps = [];
+ for(let i=0;i 0 ? 1 : -1) * 0.8;
+ else if(yNorm > 0.82) p.vx = (dx < 0 ? 1 : -1) * 0.8;
+ else p.vx *= 0.85;
+ } else {
+ p.T = Math.max(20, p.T - 0.1);
+ p.vx *= 0.94; p.vy *= 0.94;
+ }
+ p.x += p.vx; p.y += p.vy;
+ /* стенки */
+ if(p.x < vesselX+6){ p.x = vesselX+6; p.vx = Math.abs(p.vx); }
+ if(p.x > vesselX+vesselW-6){ p.x = vesselX+vesselW-6; p.vx = -Math.abs(p.vx); }
+ if(p.y < vesselY+6){ p.y = vesselY+6; p.vy = Math.abs(p.vy); }
+ if(p.y > vesselY+vesselH-6){ p.y = vesselY+vesselH-6; p.vy = -Math.abs(p.vy); }
+ }
+ let s = '';
+ /* сосуд */
+ s += ' ';
+ /* нагреватель снизу */
+ s += ' ';
+ s += ''+(heaterOn?'НАГРЕВАТЕЛЬ ВКЛ':'выкл')+' ';
+ /* частицы */
+ for(const p of ps){
+ const c = window.PHYS.tempColor(p.T, 20, 90);
+ s += ' ';
+ }
+ /* стрелки потока (декоративные) */
+ if(heaterOn){
+ const cx = vesselX + vesselW/2;
+ s += window.PHYS.drawArrow(cx, vesselY+vesselH-20, cx, vesselY+30, '#dc2626', 2, 9);
+ s += window.PHYS.drawArrow(vesselX+18, vesselY+30, vesselX+18, vesselY+vesselH-20, '#2563eb', 2, 9);
+ s += window.PHYS.drawArrow(vesselX+vesselW-18, vesselY+30, vesselX+vesselW-18, vesselY+vesselH-20, '#2563eb', 2, 9);
+ }
+ svg.innerHTML = s;
+ _SIMS.p4sim.raf = requestAnimationFrame(tick);
+ }
+ _SIMS.p4sim = { raf: 0 };
+ _SIMS.p4sim.raf = requestAnimationFrame(tick);
+ document.getElementById('p4-on').addEventListener('click', ()=>{
+ heaterOn = !heaterOn;
+ document.getElementById('p4-on').textContent = heaterOn ? 'Выключить нагрев' : 'Включить нагрев';
+ });
+ document.getElementById('p4-reset').addEventListener('click', ()=>{
+ heaterOn = false;
+ document.getElementById('p4-on').textContent = 'Включить нагрев';
+ for(let i=0;i'+q.sit+''
+ +''
+ +'Да, конвекция '
+ +'Нет, не конвекция '
+ +'
'
+ +'
';
+ document.getElementById('p4-quiz-r').textContent = (i+1);
+ document.getElementById('p4-quiz-ok').textContent = ok;
+ wrap.querySelectorAll('[data-pick]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-pick]').forEach(b=>b.disabled=true);
+ const fb = document.getElementById('p4-quiz-fb');
+ if(btn.dataset.pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p4-quiz'); bumpProgress('p4', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p4-quiz-ok').textContent = ok;
+ });
+ });
+ }
+ document.getElementById('p4-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP4_dnd(){
+ const items = [
+ {id:'rad', cat:'yes', html:'воздух у радиатора'},
+ {id:'ket', cat:'yes', html:'вода в кипящем чайнике'},
+ {id:'oce', cat:'yes', html:'течения в океане'},
+ {id:'wnd', cat:'yes', html:'ветер в атмосфере'},
+ {id:'sto', cat:'no', html:'нагрев стального стержня'},
+ {id:'top', cat:'no', html:'вода, нагреваемая сверху'},
+ {id:'vac', cat:'no', html:'жидкость в невесомости'},
+ {id:'wal', cat:'no', html:'кирпичная стена'}
+ ];
+ const dnd = setupSorter({ poolId:'p4-dnd-pool', scopeSelector:'#sec-p4', cats:['yes','no'], items, columnLayout:false });
+ document.getElementById('p4-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p4-dnd-fb');
+ let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; });
+ if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +15 XP. Конвекция требует текучей среды + разности температур + гравитации.'; addXp(15,'p4-dnd'); bumpProgress('p4', 20); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. В твёрдых телах и при нагреве сверху конвекции нет.'; }
+ });
+ document.getElementById('p4-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p4-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP4_mcq(){
+ const QS = [
+ {q:'Что переносится при конвекции?', opts:['Только энергия','Только вещество','Вещество вместе с энергией','Электромагнитные волны'], ans:2, why:'Жидкость или газ движется вместе с теплотой.'},
+ {q:'Почему в твёрдых телах нет конвекции?', opts:['Они холодные','Молекулы не могут свободно перемещаться','Они не проводят тепло','Они отражают энергию'], ans:1, why:'В твёрдом теле молекулы прочно связаны и не образуют потоков.'},
+ {q:'Как направлен поток в нагреваемой снизу жидкости?', opts:['Горячий вниз, холодный вверх','Горячий вверх, холодный вниз','Хаотически','Только по краям'], ans:1, why:'Нагретая часть менее плотная — всплывает.'},
+ {q:'Зачем радиатор ставят под окном?', opts:['Чтобы не мешал','Чтобы тёплый воздух поднимался, не пропуская холодного с улицы','Так красивее','Для экономии труб'], ans:1, why:'Восходящий тёплый поток сразу отсекает падающий холодный.'},
+ {q:'Возможна ли конвекция в открытом космосе?', opts:['Да, как на Земле','Только в атмосфере планет','Нет, нужна гравитация и среда','Только у звёзд'], ans:2, why:'В вакууме нет среды; в невесомости нет всплывания.'},
+ {q:'Куда направить пламя свечи, чтобы быстрее закипела вода в стакане?', opts:['Сверху','Снизу','Сбоку','Не имеет значения'], ans:1, why:'Нагрев снизу запускает конвекцию — вода прогреется быстрее.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p4-mcq'); if(!wrap) return;
+ let h = 'Вопрос '+(i+1)+'. '+q.q+'
';
+ h += '';
+ q.opts.forEach((opt, k)=>{ h += ''+(String.fromCharCode(65+k))+'. '+opt+' '; });
+ h += '
Следующий вопрос
';
+ wrap.innerHTML = h;
+ document.getElementById('p4-mcq-i').textContent = (i+1);
+ document.getElementById('p4-mcq-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p4-mcq-fb');
+ if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p4-mcq'); bumpProgress('p4', 3); }
+ else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p4-mcq-ok').textContent = ok;
+ if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf = document.getElementById('p4-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+' из '+QS.length+').'; addXp(15,'p4-mcq-bonus'); bumpProgress('p4', 15); }, 600); }
+ });
+ });
+ const nb = document.getElementById('p4-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ }
+ render();
+}
+
+/* ======== §5 — Излучение ======== */
+function build_p5(){
+ const box = document.getElementById('p5-body');
+ let h = '';
+
+ h += makeCard('theory', 'Что такое тепловое излучение', '§ 5.1',
+ 'Излучение — передача энергии электромагнитными волнами. Не требует среды: идёт через вакуум.
'
+ +'Любое тело с температурой выше абсолютного нуля излучает. Чем выше $T$, тем интенсивнее излучение и тем более коротковолновое (горячая печь — инфракрасный диапазон; Солнце — видимый свет).
'
+ +'Так Солнце греет Землю, прошив 150 млн км вакуума за 8 минут.
'
+ );
+ h += makeCard('rule', 'Поглощение и отражение', '§ 5.2',
+ ''
+ +'Тёмные и шероховатые поверхности — хорошо поглощают излучение (нагреваются быстрее). '
+ +'Светлые и зеркальные — отражают излучение (нагреваются медленнее). '
+ +'Те же тёмные поверхности и излучают сильнее: чёрный чайник остывает быстрее. '
+ +' '
+ +'Правило: что хорошо поглощает, то хорошо и излучает.
'
+ );
+ h += makeCard('example', 'Применение', '§ 5.3',
+ ''
+ +'Чёрные машины в жару раскаляются сильнее белых. '
+ +'Зеркальные стенки термоса уменьшают потерю излучения. '
+ +'Космические корабли покрывают фольгой, чтобы отражать солнечное излучение. '
+ +'Тёмная футболка летом — жарко; белая — прохладно. '
+ +' '
+ );
+
+ /* IV1 — солнечный нагрев чёрного и белого */
+ h += ''
+ +''
+ +'
Включи Солнце. Чёрная пластина поглощает излучение и быстро нагревается, белая отражает и нагревается медленно.
'
+ +'
'
+ +'
Включить Солнце Сброс
'
+ +'
'
+ +'Чёрная пластина: $T = $ 20 °C '
+ +'Белая пластина: $T = $ 20 °C '
+ +'
'
+ +'
';
+
+ /* IV2 — квикфайр «правда/ложь» */
+ h += ''
+ +''
+ +'
Прочитай утверждение и реши, правдиво оно или нет.
'
+ +'
'
+ +'
Следующее
'
+ +'
Раунд: 1 / 7 Правильно: 0
'
+ +'
';
+
+ /* IV3 — DnD 3 вида теплопередачи */
+ h += ''
+ +''
+ +'
Сортируй примеры на три группы: проводность, конвекция, излучение.
'
+ +'
'
+ +'
'
+ +'
Проверить Сброс
'
+ +'
'
+ +'
';
+
+ /* IV4 — MCQ */
+ h += ''
+ +''
+ +'
4+ правильных — +15 XP.
'
+ +'
'
+ +'
Вопрос: 1 / 6 Правильно: 0
'
+ +'
';
+
+ box.innerHTML = h + secNavFor('p5') + readButton('p5');
+ renderMath(box);
+ wireReadBtn('p5');
+
+ _initP5_sim();
+ _initP5_quiz();
+ _initP5_dnd();
+ _initP5_mcq();
+}
+
+function _initP5_sim(){
+ _killSim('p5sim');
+ const svg = document.getElementById('p5-sim'); if(!svg) return;
+ const W=460, H=240;
+ let sunOn = false;
+ let tB = 20, tW = 20; /* black, white plate temps */
+ function reset(){ tB=20; tW=20; sunOn=false; document.getElementById('p5-on').textContent='Включить Солнце'; document.getElementById('p5-tb').textContent='20'; document.getElementById('p5-tw').textContent='20'; }
+ function tick(){
+ if(!_isVisible('p5')){ _SIMS.p5sim.raf = requestAnimationFrame(tick); return; }
+ if(sunOn){
+ /* чёрная: поглощает 0.92, белая: 0.15 */
+ if(tB < 75) tB += 0.32;
+ if(tW < 35) tW += 0.05;
+ } else {
+ if(tB > 20) tB -= 0.10;
+ if(tW > 20) tW -= 0.10;
+ }
+ document.getElementById('p5-tb').textContent = tB.toFixed(0);
+ document.getElementById('p5-tw').textContent = tW.toFixed(0);
+ /* draw */
+ let s = '';
+ /* Солнце */
+ const cx = 230, cy = 36;
+ s += ' ';
+ if(sunOn){
+ for(let i=0;i<12;i++){
+ const a = i*Math.PI/6;
+ const x1 = cx + 26*Math.cos(a), y1 = cy + 26*Math.sin(a);
+ const x2 = cx + 36*Math.cos(a), y2 = cy + 36*Math.sin(a);
+ s += ' ';
+ }
+ }
+ /* Лучи к пластинам */
+ if(sunOn){
+ const ray = (x1,y1,x2,y2,col)=>' ';
+ /* к чёрной */
+ s += ray(cx-22, cy+18, 120, 175, '#fbbf24');
+ s += ray(cx-10, cy+22, 145, 175, '#fbbf24');
+ s += ray(cx, cy+22, 170, 175, '#fbbf24');
+ /* к белой */
+ s += ray(cx+22, cy+18, 340, 175, '#fbbf24');
+ s += ray(cx+10, cy+22, 315, 175, '#fbbf24');
+ s += ray(cx, cy+22, 290, 175, '#fbbf24');
+ /* отражённые от белой (вверх) */
+ s += ' ';
+ s += ' ';
+ s += ' ';
+ }
+ /* чёрная пластина */
+ const cB = sunOn ? window.PHYS.tempColor(tB, 20, 80) : '#1f2937';
+ s += ' ';
+ s += ''+tB.toFixed(0)+' °C ';
+ s += 'ЧЁРНАЯ ';
+ /* белая пластина */
+ s += ' ';
+ s += ''+tW.toFixed(0)+' °C ';
+ s += 'БЕЛАЯ ';
+ svg.innerHTML = s;
+ _SIMS.p5sim.raf = requestAnimationFrame(tick);
+ }
+ _SIMS.p5sim = { raf: 0 };
+ _SIMS.p5sim.raf = requestAnimationFrame(tick);
+ document.getElementById('p5-on').addEventListener('click', ()=>{
+ sunOn = !sunOn;
+ document.getElementById('p5-on').textContent = sunOn ? 'Выключить Солнце' : 'Включить Солнце';
+ });
+ document.getElementById('p5-reset').addEventListener('click', reset);
+}
+
+function _initP5_quiz(){
+ const QS = [
+ {st:'Излучение требует среды (например, воздуха) для распространения.', ans:'F', why:'Излучение проходит через вакуум, что и доказывает солнечный свет.'},
+ {st:'Тёмные тела сильнее нагреваются под Солнцем, чем светлые.', ans:'T', why:'Тёмная поверхность поглощает большую долю излучения.'},
+ {st:'Любое тело с $T > 0$ К излучает.', ans:'T', why:'Тепловое излучение есть всегда, чем горячее — тем сильнее.'},
+ {st:'Чем горячее тело, тем меньше излучения оно отдаёт.', ans:'F', why:'Наоборот: интенсивность излучения резко растёт с температурой.'},
+ {st:'Хороший поглотитель — хороший излучатель.', ans:'T', why:'Это правило Кирхгофа: $a = \\varepsilon$.'},
+ {st:'Зеркальная поверхность плохо излучает.', ans:'T', why:'Зеркало почти всё отражает — а значит и излучает мало.'},
+ {st:'Излучение нельзя обнаружить, если тело не светится видимым светом.', ans:'F', why:'Тело при комнатной температуре излучает инфракрасные волны — их видит тепловизор.'}
+ ];
+ let i = 0, ok = 0;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p5-quiz'); if(!wrap) return;
+ wrap.innerHTML =
+ '"'+q.st+'"
'
+ +''
+ +'Правда '
+ +'Ложь '
+ +'
'
+ +'
';
+ document.getElementById('p5-quiz-r').textContent = (i+1);
+ document.getElementById('p5-quiz-ok').textContent = ok;
+ wrap.querySelectorAll('[data-pick]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-pick]').forEach(b=>b.disabled=true);
+ const fb = document.getElementById('p5-quiz-fb');
+ if(btn.dataset.pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p5-quiz'); bumpProgress('p5', 4); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p5-quiz-ok').textContent = ok;
+ renderMath(wrap);
+ });
+ });
+ renderMath(wrap);
+ }
+ document.getElementById('p5-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ render();
+}
+
+function _initP5_dnd(){
+ const items = [
+ {id:'spoon', cat:'cond', html:'нагрев ложки в супе'},
+ {id:'bar', cat:'cond', html:'нагрев конца железного прута'},
+ {id:'iron', cat:'cond', html:'утюг гладит бельё'},
+ {id:'rad', cat:'conv', html:'батарея греет комнату'},
+ {id:'ket', cat:'conv', html:'вода в кипящем чайнике'},
+ {id:'wnd', cat:'conv', html:'ветры в атмосфере'},
+ {id:'sun', cat:'rad', html:'Солнце греет Землю'},
+ {id:'fire', cat:'rad', html:'тепло от костра на расстоянии'},
+ {id:'lamp', cat:'rad', html:'нагрев руки под лампой накаливания'}
+ ];
+ const dnd = setupSorter({ poolId:'p5-dnd-pool', scopeSelector:'#sec-p5', cats:['cond','conv','rad'], items, columnLayout:false });
+ document.getElementById('p5-dnd-check').addEventListener('click', ()=>{
+ const fb = document.getElementById('p5-dnd-fb');
+ let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; });
+ if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +20 XP. Ты освоил все 3 вида теплопередачи.'; addXp(20,'p5-dnd'); bumpProgress('p5', 25); }
+ else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Проверь: контакт = проводность; потоки = конвекция; через пустоту = излучение.'; }
+ });
+ document.getElementById('p5-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p5-dnd-fb'); fb.style.display='none'; });
+}
+
+function _initP5_mcq(){
+ const QS = [
+ {q:'Через какую среду НЕ может идти излучение?', opts:['Через воздух','Через стекло','Через вакуум','Излучение проходит через всё перечисленное'], ans:3, why:'Излучение распространяется и в среде, и в вакууме.'},
+ {q:'Какая поверхность нагреется сильнее на Солнце?', opts:['Зеркальная','Белая','Чёрная','Прозрачная'], ans:2, why:'Чёрная поглощает больше всего излучения.'},
+ {q:'Какие тела излучают?', opts:['Только горячие','Только светящиеся','Любые с $T > 0$ К','Только Солнце'], ans:2, why:'Тепловое излучение существует у любого тела с ненулевой температурой.'},
+ {q:'Какой вид теплопередачи переносит тепло от Солнца к Земле?', opts:['Теплопроводность','Конвекция','Излучение','Все три'], ans:2, why:'Между Солнцем и Землёй вакуум — работает только излучение.'},
+ {q:'Чем покрашен правильный термос изнутри?', opts:['Чёрной краской','Зеркальной плёнкой','Деревом','Стеклом'], ans:1, why:'Зеркальная поверхность плохо излучает — тепло сохраняется.'},
+ {q:'Чёрная футболка в жару нагревается потому что…', opts:['легче белой','лучше поглощает излучение','быстрее остывает','тоньше'], ans:1, why:'Тёмная ткань поглощает большую часть солнечного излучения.'}
+ ];
+ let i = 0, ok = 0, done = 0, awarded = false;
+ function render(){
+ const q = QS[i]; const wrap = document.getElementById('p5-mcq'); if(!wrap) return;
+ let h = 'Вопрос '+(i+1)+'. '+q.q+'
';
+ h += '';
+ q.opts.forEach((opt, k)=>{ h += ''+(String.fromCharCode(65+k))+'. '+opt+' '; });
+ h += '
Следующий вопрос
';
+ wrap.innerHTML = h;
+ document.getElementById('p5-mcq-i').textContent = (i+1);
+ document.getElementById('p5-mcq-ok').textContent = ok;
+ wrap.querySelectorAll('[data-k]').forEach(btn=>{
+ btn.addEventListener('click', ()=>{
+ if(btn.disabled) return; wrap.querySelectorAll('[data-k]').forEach(b=>b.disabled=true);
+ const k = +btn.dataset.k; const fb = document.getElementById('p5-mcq-fb');
+ if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p5-mcq'); bumpProgress('p5', 3); }
+ else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; }
+ document.getElementById('p5-mcq-ok').textContent = ok;
+ renderMath(wrap);
+ if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf = document.getElementById('p5-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+' из '+QS.length+').'; addXp(15,'p5-mcq-bonus'); bumpProgress('p5', 15); }, 600); }
+ });
+ });
+ const nb = document.getElementById('p5-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); });
+ renderMath(wrap);
+ }
+ render();
+}
+
function init(){
loadProgress(); initTheme(); initSidebarToggle(); initSearch();
buildParaSelector(); refreshProgressUI(); loadServerReadState(); goTo(PARAS[0].id);