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', + '

Хорошие проводники тепла:

' + +'' + +'

Плохие проводники (тепловые изоляторы):

' + +'' + ); + h += makeCard('example', 'Зачем это нам', '§ 3.3', + '' + ); + + /* IV1 — симуляция теплопроводности */ + h += '
' + +'
IV-1
Нагрев стержня
' + +'
Один конец стержня — горячий ($T_{гор}$), другой — холодный ($T_{хол}$). Тепло перетекает с горячего конца на холодный. Цвет показывает температуру вдоль стержня. Меняй $\\alpha$ — коэффициент теплопроводности.
' + +'
' + +'' + +'' + +'' + +'
' + +'' + +'
' + +'
'; + + /* IV2 — викторина «лучший проводник» */ + h += '
' + +'
IV-2
Какой материал проводит тепло лучше?
' + +'
Выбери материал с лучшей теплопроводностью.
' + +'
' + +'
' + +'
Раунд: 1 / 6Правильно: 0
' + +'
'; + + /* IV3 — DnD хороший/плохой */ + h += '
' + +'
IV-3
Сортировка материалов
' + +'
Перетащи материалы в нужную группу.
' + +'
' + +'
' + +'
Хорошие проводники
' + +'
Плохие проводники
' + +'
' + +'
' + +'
' + +'
'; + + /* IV4 — MCQ */ + h += '
' + +'
IV-4
Тренажёр: 6 вопросов
' + +'
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 = + '
' + +'' + +'' + +'
' + +'
'; + 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 += ''; }); + 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 += '
' + +'
IV-1
Конвекция в сосуде
' + +'
Включи / выключи нагреватель снизу. Тёплая жидкость поднимается по центру, холодная опускается по краям.
' + +'' + +'
' + +'
'; + + /* IV2 — викторина «где конвекция?» */ + h += '
' + +'
IV-2
Возможна ли тут конвекция?
' + +'
Назови среду или ситуацию — определи, бывает ли в ней конвекция.
' + +'
' + +'
' + +'
Раунд: 1 / 6Правильно: 0
' + +'
'; + + /* IV3 — DnD */ + h += '
' + +'
IV-3
Где конвекция, а где — нет?
' + +'
Перетащи ситуации в нужную колонку.
' + +'
' + +'
' + +'
Конвекция возможна
' + +'
Конвекция невозможна
' + +'
' + +'
' + +'
' + +'
'; + + /* IV4 — MCQ */ + h += '
' + +'
IV-4
Тренажёр: 6 вопросов
' + +'
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 += ''; }); + 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 += '
' + +'
IV-1
Чёрное и белое под Солнцем
' + +'
Включи Солнце. Чёрная пластина поглощает излучение и быстро нагревается, белая отражает и нагревается медленно.
' + +'' + +'
' + +'
' + +'Чёрная пластина: $T = $ 20 °C' + +'Белая пластина: $T = $ 20 °C' + +'
' + +'
'; + + /* IV2 — квикфайр «правда/ложь» */ + h += '
' + +'
IV-2
Правда или ложь?
' + +'
Прочитай утверждение и реши, правдиво оно или нет.
' + +'
' + +'
' + +'
Раунд: 1 / 7Правильно: 0
' + +'
'; + + /* IV3 — DnD 3 вида теплопередачи */ + h += '
' + +'
IV-3
3 вида теплопередачи
' + +'
Сортируй примеры на три группы: проводность, конвекция, излучение.
' + +'
' + +'
' + +'
Проводность
' + +'
Конвекция
' + +'
Излучение
' + +'
' + +'
' + +'' + +'
'; + + /* IV4 — MCQ */ + h += '
' + +'
IV-4
Тренажёр: 6 вопросов
' + +'
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 += ''; }); + 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);