diff --git a/frontend/textbooks/physics_8_ch2.html b/frontend/textbooks/physics_8_ch2.html index 186eae0..4137bf2 100644 --- a/frontend/textbooks/physics_8_ch2.html +++ b/frontend/textbooks/physics_8_ch2.html @@ -307,9 +307,26 @@ const ACH_LABELS = { }; const SIDEBARS = { - p12:{title:"Шпаргалка § 12",rows:[["В разработке","Phase 2 Wave 1"]]}, - p13:{title:"Шпаргалка § 13",rows:[["В разработке","Phase 2 Wave 1"]]}, - p14:{title:"Шпаргалка § 14",rows:[["В разработке","Phase 2 Wave 1"]]}, + p12:{title:"Шпаргалка § 12",rows:[ + ["2 рода зарядов","+ (стекло о шёлк), − (эбонит о шерсть)"], + ["Одноимённые","отталкиваются"], + ["Разноимённые","притягиваются"], + ["При трении","заряд один — +, другой — −"], + ["Сумма","сохраняется (закон сохр. заряда)"] + ]}, + p13:{title:"Шпаргалка § 13",rows:[ + ["Проводники","есть свободные носители"], + ["Примеры пров.","металлы, графит, растворы солей, кислот, щелочей"], + ["Диэлектрики","эбонит, стекло, дерево, пластик, дист. вода"], + ["В проводнике","заряд по поверхности"], + ["В диэлектрике","остаётся где появился"] + ]}, + p14:{title:"Шпаргалка § 14",rows:[ + ["Индукция","перераспределение зарядов в проводнике"], + ["Без касания","нейтральный проводник $\\to$ разделение"], + ["Ближний конец","заряд противоположного знака"], + ["Если разделить","на 2 заряженные части"] + ]}, p15:{title:"Шпаргалка § 15",rows:[["В разработке","Phase 2 Wave 2"]]}, p16:{title:"Шпаргалка § 16",rows:[["В разработке","Phase 2 Wave 2"]]}, p17:{title:"Шпаргалка § 17",rows:[["В разработке","Phase 2 Wave 3"]]}, @@ -331,9 +348,9 @@ const SIDEBARS = { }; const TIPS=[ - {sec:'p12',html:"Параграф § 12 будет реализован в Phase 2 Wave 1. Используем хелперы из phys.js и optics.js."}, - {sec:'p13',html:"Параграф § 13 будет реализован в Phase 2 Wave 1. Используем хелперы из phys.js и optics.js."}, - {sec:'p14',html:"Параграф § 14 будет реализован в Phase 2 Wave 1. Используем хелперы из phys.js и optics.js."}, + {sec:'p12',html:"Потри расчёску о волосы — она начнёт притягивать клочки бумаги. Это электризация. При трении один предмет получает положительный заряд, другой — отрицательный. Одноимённые отталкиваются, разноимённые — притягиваются."}, + {sec:'p13',html:"Металлы — отличные проводники: их электроны легко двигаются. Эбонит, стекло, пластик — диэлектрики: электроны связаны атомами. Поэтому ручка отвёртки из пластика — а сама отвёртка металлическая."}, + {sec:'p14',html:"Поднеси заряженный шар к незаряженному металлическому шарику — он притянется. В нейтральном проводнике под действием внешнего заряда электроны перераспределяются, и ближний конец получает противоположный знак."}, {sec:'p15',html:"Параграф § 15 будет реализован в Phase 2 Wave 2. Используем хелперы из phys.js и optics.js."}, {sec:'p16',html:"Параграф § 16 будет реализован в Phase 2 Wave 2. Используем хелперы из phys.js и optics.js."}, {sec:'p17',html:"Параграф § 17 будет реализован в Phase 2 Wave 3. Используем хелперы из phys.js и optics.js."}, @@ -355,9 +372,9 @@ const TIPS=[ ]; const BUILDERS = { - p12: ()=>{ const box=document.getElementById('p12-body'); box.innerHTML = buildStub('p12', 'Электризация тел. Взаимодействие зарядов', 'Phase 2 Wave 1') + secNavFor('p12') + readButton('p12'); renderMath(box); wireReadBtn('p12'); }, - p13: ()=>{ const box=document.getElementById('p13-body'); box.innerHTML = buildStub('p13', 'Проводники и диэлектрики', 'Phase 2 Wave 1') + secNavFor('p13') + readButton('p13'); renderMath(box); wireReadBtn('p13'); }, - p14: ()=>{ const box=document.getElementById('p14-body'); box.innerHTML = buildStub('p14', 'Электризация через влияние', 'Phase 2 Wave 1') + secNavFor('p14') + readButton('p14'); renderMath(box); wireReadBtn('p14'); }, + p12: ()=>{ build_p12(); }, + p13: ()=>{ build_p13(); }, + p14: ()=>{ build_p14(); }, p15: ()=>{ const box=document.getElementById('p15-body'); box.innerHTML = buildStub('p15', 'Электрический заряд. Элементарный заряд', 'Phase 2 Wave 2') + secNavFor('p15') + readButton('p15'); renderMath(box); wireReadBtn('p15'); }, p16: ()=>{ const box=document.getElementById('p16-body'); box.innerHTML = buildStub('p16', 'Строение атома. Ионы', 'Phase 2 Wave 2') + secNavFor('p16') + readButton('p16'); renderMath(box); wireReadBtn('p16'); }, p17: ()=>{ const box=document.getElementById('p17-body'); box.innerHTML = buildStub('p17', 'Электрическое поле. Электрическое напряжение', 'Phase 2 Wave 3') + secNavFor('p17') + readButton('p17'); renderMath(box); wireReadBtn('p17'); }, @@ -715,6 +732,692 @@ function initSidebarToggle(){ document.addEventListener('keydown',e=>{ if(e.key==='Escape') close(); }); } +/* ====================================================================== + PHASE 2 · WAVE 1 — §12, §13, §14 + ====================================================================== */ + +/* Sim-management */ +const _SIMS = {}; +function _killSim(key){ if(_SIMS[key] && _SIMS[key].raf){ cancelAnimationFrame(_SIMS[key].raf); _SIMS[key].raf=0; } } +function _isVisible(secId){ const el=document.getElementById('sec-'+secId); return el && el.classList.contains('active'); } + +/* ======== §12 — Электризация тел ======== */ +function build_p12(){ + const box = document.getElementById('p12-body'); + let h = ''; + + h += makeCard('theory', 'Электрический заряд', '§ 12.1', + '

При трении некоторых тел друг о друга они приобретают свойство притягивать лёгкие предметы — клочки бумаги, волоски. Говорят: тело электризуется, на нём появляется электрический заряд.

' + +'

Опыты показывают: существует два рода зарядов.

' + +'' + ); + h += makeCard('rule', 'Закон взаимодействия зарядов', '§ 12.2', + '

Одноимённые заряды (++ или −−) — отталкиваются.
' + +'Разноимённые заряды (+−) — притягиваются.

' + +'

При электризации трением заряды на двух телах равны по модулю и противоположны по знаку. Это закон сохранения электрического заряда.

' + +'

Электризация происходит из-за переноса электронов с одного тела на другое: потерявшее электроны становится «+», получившее — «−».

' + ); + h += makeCard('example', 'Примеры', '§ 12.3', + '' + ); + + /* IV1 — виртуальный электроскоп */ + h += '
' + +'
IV-1
Виртуальный электроскоп
' + +'
Потри палочку о ткань — она зарядится. Поднеси её к электроскопу — листочки разойдутся: одноимённые заряды отталкиваются.
' + +'' + +'
' + +'
Заряд палочки: 0Угол листочков:
' + +'
'; + + /* IV2 — викторина «знаки зарядов» */ + h += '
' + +'
IV-2
Каков знак заряда?
' + +'
По опыту с трением определи знак заряда тела.
' + +'
' + +'
' + +'
Раунд: 1 / 5Правильно: 0
' + +'
'; + + /* IV3 — DnD «притягивает / отталкивает» */ + h += '
' + +'
IV-3
Что происходит при контакте?
' + +'
Распредели пары зарядов по типу взаимодействия.
' + +'
' + +'
' + +'
Притягиваются
' + +'
Отталкиваются
' + +'
' + +'
' + +'
' + +'
'; + + /* IV4 — MCQ */ + h += '
' + +'
IV-4
Тренажёр: 6 вопросов
' + +'
4+ правильных — +15 XP.
' + +'
' + +'
Вопрос: 1 / 6Правильно: 0
' + +'
'; + + box.innerHTML = h + secNavFor('p12') + readButton('p12'); + renderMath(box); + wireReadBtn('p12'); + + _initP12_sim(); + _initP12_quiz(); + _initP12_dnd(); + _initP12_mcq(); +} + +function _initP12_sim(){ + const svg = document.getElementById('p12-sim'); if(!svg) return; + let charged = false; /* палочка заряжена */ + let touched = false; /* поднесено к электроскопу */ + function draw(){ + let s = ''; + /* электроскоп: стеклянная колба, металлический стержень, два листочка */ + const escCx = 320, escCy = 130; + s += ''; + /* шар сверху */ + s += ''; + /* стержень */ + s += ''; + /* листочки */ + const leafAng = touched && charged ? 35 : 4; + document.getElementById('p12-a').textContent = leafAng+'°'; + const lx1 = escCx, ly1 = escCy+50; + const len = 36; + const lx2L = lx1 - len*Math.sin(leafAng*Math.PI/180); + const ly2L = ly1 + len*Math.cos(leafAng*Math.PI/180); + const lx2R = lx1 + len*Math.sin(leafAng*Math.PI/180); + const ly2R = ly1 + len*Math.cos(leafAng*Math.PI/180); + s += ''; + s += ''; + /* если заряжен и поднесён — рисуем + + на листочках */ + if(touched && charged){ + s += ''; + s += ''; + s += ''; + } + /* палочка — слева */ + const rodX = touched ? 260 : 100; + const rodY = 100; + s += ''; + if(charged){ + for(let i=0;i<5;i++) s += ''; + } + /* ткань (если ещё не тёрли) */ + if(!charged){ + s += ''; + s += 'шерсть'; + } + /* подпись */ + s += 'палочка (эбонит)'; + s += 'электроскоп'; + svg.innerHTML = s; + } + document.getElementById('p12-rub').addEventListener('click', ()=>{ charged = true; document.getElementById('p12-q').textContent = '−5 нКл'; draw(); }); + document.getElementById('p12-touch').addEventListener('click', ()=>{ + if(!charged){ + const fb = document.getElementById('p12-q'); fb.textContent = 'сначала потри!'; return; + } + touched = true; draw(); + }); + document.getElementById('p12-reset').addEventListener('click', ()=>{ charged=false; touched=false; document.getElementById('p12-q').textContent='0'; draw(); }); + draw(); +} + +function _initP12_quiz(){ + const QS = [ + {sit:'Стеклянная палочка, потёртая о шёлк', ans:'+', why:'По таблице: стекло о шёлк — стекло положительное.'}, + {sit:'Эбонитовая палочка о шерсть', ans:'-', why:'Эбонит получает электроны от шерсти — становится отрицательным.'}, + {sit:'Шёлк после трения о стекло', ans:'-', why:'Шёлк забирает электроны со стекла — отрицательный.'}, + {sit:'Шерсть после трения об эбонит', ans:'+', why:'Шерсть отдала электроны эбониту — положительная.'}, + {sit:'Воздушный шарик о волосы', ans:'-', why:'Шарик принимает электроны с волос.'} + ]; + let i = 0, ok = 0; + function render(){ + const q = QS[i]; const wrap = document.getElementById('p12-quiz'); if(!wrap) return; + wrap.innerHTML = + '
'+q.sit+'
' + +'
' + +'' + +'' + +'
' + +''; + document.getElementById('p12-quiz-r').textContent = (i+1); + document.getElementById('p12-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('p12-quiz-fb'); + if(btn.dataset.pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p12-quiz'); bumpProgress('p12', 4); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p12-quiz-ok').textContent = ok; + }); + }); + } + document.getElementById('p12-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); }); + render(); +} + +function _initP12_dnd(){ + const items = [ + {id:'pp', cat:'rep', html:'$+q$ и $+q$'}, + {id:'mm', cat:'rep', html:'$-q$ и $-q$'}, + {id:'pm', cat:'attr', html:'$+q$ и $-q$'}, + {id:'mp', cat:'attr', html:'$-q$ и $+q$'}, + {id:'p0', cat:'attr', html:'$+q$ и нейтральный проводник'}, + {id:'m0', cat:'attr', html:'$-q$ и нейтральный проводник'}, + {id:'pn', cat:'attr', html:'$+q$ и капля воды (диэл.)'}, + {id:'pf', cat:'attr', html:'$+q$ и металл. шарик'} + ]; + const dnd = setupSorter({ poolId:'p12-dnd-pool', scopeSelector:'#sec-p12', cats:['attr','rep'], items, columnLayout:false }); + document.getElementById('p12-dnd-check').addEventListener('click', ()=>{ + const fb = document.getElementById('p12-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,'p12-dnd'); bumpProgress('p12', 20); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: одноимённые отталкиваются; нейтральные всегда притягиваются.'; } + }); + document.getElementById('p12-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p12-dnd-fb'); fb.style.display='none'; }); +} + +function _initP12_mcq(){ + const QS = [ + {q:'Сколько родов зарядов существует?', opts:['один','два','три','бесконечно много'], ans:1, why:'+ и −, всего два.'}, + {q:'При электризации стекла о шёлк стекло становится…', opts:['отрицательным','положительным','не заряжается','любым'], ans:1, why:'Стекло теряет электроны → +.'}, + {q:'Что переносится при трении?', opts:['атомы','молекулы','электроны','ядра'], ans:2, why:'Электроны переходят с одного тела на другое.'}, + {q:'Два одинаково заряженных шарика…', opts:['притягиваются','отталкиваются','неподвижны','зависит от размера'], ans:1, why:'Одноимённые всегда отталкиваются.'}, + {q:'Сумма зарядов при трении двух нейтральных тел…', opts:['растёт','становится 0','остаётся 0','становится +'], ans:2, why:'Заряд сохраняется: было 0, стало $+q$ и $-q$, сумма всё ещё 0.'}, + {q:'Почему стенка притягивает шарик после трения о голову?', opts:['стенка тоже зарядилась','индукция в нейтральной стенке','гравитация','клей'], ans:1, why:'В диэлектрике стенки происходит небольшая поляризация — она притягивается к шарику.'} + ]; + let i = 0, ok = 0, done = 0, awarded = false; + function render(){ + const q = QS[i]; const wrap = document.getElementById('p12-mcq'); if(!wrap) return; + let h = '
Вопрос '+(i+1)+'. '+q.q+'
'; + q.opts.forEach((opt,k)=>{ h += ''; }); + h += '
'; + wrap.innerHTML = h; + document.getElementById('p12-mcq-i').textContent = (i+1); + document.getElementById('p12-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('p12-mcq-fb'); + if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p12-mcq'); bumpProgress('p12', 3); } + else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p12-mcq-ok').textContent = ok; + renderMath(wrap); + if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p12-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+'/'+QS.length+').'; addXp(15,'p12-mcq-bonus'); bumpProgress('p12', 15); }, 600); } + }); + }); + const nb = document.getElementById('p12-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); }); + renderMath(wrap); + } + render(); +} + +/* ======== §13 — Проводники и диэлектрики ======== */ +function build_p13(){ + const box = document.getElementById('p13-body'); + let h = ''; + + h += makeCard('theory', 'Свободные носители заряда', '§ 13.1', + '

Все вещества разделяют на два больших класса по способности проводить электрический заряд:

' + +'
    ' + +'
  • Проводники — есть свободные носители заряда (например, свободные электроны у металлов). Заряд легко перемещается внутри.
  • ' + +'
  • Диэлектрики (изоляторы) — носители связаны с атомами/молекулами и не могут свободно перемещаться. Заряд «застревает» там, куда попал.
  • ' + +'
' + ); + h += makeCard('rule', 'Примеры', '§ 13.2', + '' + +'' + +'' + +'' + +'' + +'
ПроводникиДиэлектрики
все металлыэбонит, стекло, янтарь
графитдерево (сухое), пластик, резина
растворы солей, кислот, щелочейфарфор, бумага (сухая)
тело человека (через жидкости)дистиллированная вода, воздух (сухой)
влажная земляшёлк, мех
' + ); + h += makeCard('example', 'Где это видно', '§ 13.3', + '
    ' + +'
  • Провода — медные (проводник), но в изоляции из пластика (диэлектрик).
  • ' + +'
  • Розетки и выключатели — пластиковые корпуса.
  • ' + +'
  • Заряд на металлическом шарике распределяется по всей поверхности — потому что он проводник.
  • ' + +'
  • Заряд на пластиковой расчёске остаётся в месте трения — там, где «потёрли».
  • ' + +'
' + ); + + /* IV1 — Анимация: заряд на проводнике vs диэлектрике */ + h += '
' + +'
IV-1
Куда уходит заряд?
' + +'
Сравни: на металлическом шарике заряд распределяется по всей поверхности. На пластиковом — остаётся в одном месте.
' + +'' + +'
' + +'
'; + + /* IV2 — викторина пров/диэл */ + h += '
' + +'
IV-2
Проводник или диэлектрик?
' + +'
Назови материал — выбери тип.
' + +'
' + +'
' + +'
Раунд: 1 / 8Правильно: 0
' + +'
'; + + /* IV3 — DnD */ + h += '
' + +'
IV-3
Сортировка материалов
' + +'
Перетащи материалы в нужную колонку.
' + +'
' + +'
' + +'
Проводники
' + +'
Диэлектрики
' + +'
' + +'
' + +'' + +'
'; + + /* IV4 — MCQ */ + h += '
' + +'
IV-4
Тренажёр: 6 вопросов
' + +'
4+ правильных — +15 XP.
' + +'
' + +'
Вопрос: 1 / 6Правильно: 0
' + +'
'; + + box.innerHTML = h + secNavFor('p13') + readButton('p13'); + renderMath(box); + wireReadBtn('p13'); + + _initP13_sim(); + _initP13_quiz(); + _initP13_dnd(); + _initP13_mcq(); +} + +function _initP13_sim(){ + _killSim('p13sim'); + const svg = document.getElementById('p13-sim'); if(!svg) return; + /* два шара: металлический (слева) и пластиковый (справа). При нажатии «дать заряд» — на метал. заряды разлетаются по поверхности, на пласт. остаются. */ + const metCx = 130, metCy = 110, R = 60; + const plCx = 330, plCy = 110; + let charges = []; /* {x, y, target: 'met'|'pla', angTarget, sett: bool, settAng } */ + let phase = 0; /* 0 = пусто, 1 = заряд дан */ + function reset(){ charges = []; phase = 0; draw(); } + function giveCharge(){ + /* добавляем 14 минус-зарядов в одной точке (верх каждого шара) */ + if(phase > 0) return; + phase = 1; + for(let i=0;i<14;i++){ + const a = Math.PI * 2 * i / 14; + charges.push({ targetA: a, x: metCx, y: metCy - R + 6, kind:'met', settled: false, t: 0 }); + charges.push({ targetA: 0, x: plCx, y: plCy - R + 6, kind:'pla', settled: true, t: 0 }); + } + } + function tick(){ + if(!_isVisible('p13')){ _SIMS.p13sim.raf = requestAnimationFrame(tick); return; } + for(const c of charges){ + if(c.kind === 'met' && !c.settled){ + /* движение к точке на окружности (под углом targetA) */ + c.t += 0.025; + const tx = metCx + (R-8) * Math.cos(c.targetA); + const ty = metCy + (R-8) * Math.sin(c.targetA); + c.x += (tx - c.x) * 0.06; + c.y += (ty - c.y) * 0.06; + if(Math.abs(c.x - tx) < 1 && Math.abs(c.y - ty) < 1) c.settled = true; + } + /* пластиковые сразу осели */ + } + let s = ''; + /* шары */ + s += ''; + s += 'МЕТАЛЛ (проводник)'; + s += ''; + s += 'ПЛАСТИК (диэлектрик)'; + /* заряды */ + for(const c of charges){ + s += ''; + } + /* стрелки касания если phase=0 */ + if(phase === 0){ + s += window.PHYS.drawArrow(metCx-30, metCy-R-30, metCx, metCy-R+2, '#10b981', 2, 9); + s += window.PHYS.drawArrow(plCx-30, plCy-R-30, plCx, plCy-R+2, '#10b981', 2, 9); + s += 'касание'; + s += 'касание'; + } + svg.innerHTML = s; + _SIMS.p13sim.raf = requestAnimationFrame(tick); + } + _SIMS.p13sim = { raf: 0 }; + _SIMS.p13sim.raf = requestAnimationFrame(tick); + document.getElementById('p13-charge').addEventListener('click', giveCharge); + document.getElementById('p13-reset').addEventListener('click', reset); +} + +function _initP13_quiz(){ + const QS = [ + {mat:'медь', ans:'C', why:'Металл — проводник.'}, + {mat:'эбонит', ans:'D', why:'Эбонит — классический диэлектрик.'}, + {mat:'графит (карандаш)', ans:'C', why:'Графит — проводник.'}, + {mat:'стекло', ans:'D', why:'Стекло не проводит ток.'}, + {mat:'раствор поваренной соли', ans:'C', why:'В растворе есть свободные ионы — проводит.'}, + {mat:'дистиллированная вода', ans:'D', why:'Чистая вода — диэлектрик (нет ионов).'}, + {mat:'железо', ans:'C', why:'Металл.'}, + {mat:'фарфор', ans:'D', why:'Фарфор — изолятор, поэтому из него делают изоляторы на линиях электропередачи.'} + ]; + let i = 0, ok = 0; + function render(){ + const q = QS[i]; const wrap = document.getElementById('p13-quiz'); if(!wrap) return; + wrap.innerHTML = + '
'+q.mat+'
' + +'
' + +'' + +'' + +'
' + +''; + document.getElementById('p13-quiz-r').textContent = (i+1); + document.getElementById('p13-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('p13-quiz-fb'); + if(btn.dataset.pick === q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p13-quiz'); bumpProgress('p13', 4); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p13-quiz-ok').textContent = ok; + }); + }); + } + document.getElementById('p13-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); }); + render(); +} + +function _initP13_dnd(){ + const items = [ + {id:'cu', cat:'cond', html:'медь'}, + {id:'al', cat:'cond', html:'алюминий'}, + {id:'gr', cat:'cond', html:'графит'}, + {id:'sl', cat:'cond', html:'солёная вода'}, + {id:'eb', cat:'diel', html:'эбонит'}, + {id:'gl', cat:'diel', html:'стекло'}, + {id:'pl', cat:'diel', html:'пластик'}, + {id:'dw', cat:'diel', html:'дистил. вода'} + ]; + const dnd = setupSorter({ poolId:'p13-dnd-pool', scopeSelector:'#sec-p13', cats:['cond','diel'], items, columnLayout:false }); + document.getElementById('p13-dnd-check').addEventListener('click', ()=>{ + const fb = document.getElementById('p13-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,'p13-dnd'); bumpProgress('p13', 20); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Дистиллированная вода — диэлектрик (нет ионов).'; } + }); + document.getElementById('p13-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p13-dnd-fb'); fb.style.display='none'; }); +} + +function _initP13_mcq(){ + const QS = [ + {q:'Чем отличаются проводники от диэлектриков?', opts:['массой','цветом','свободными носителями зарядов','температурой'], ans:2, why:'У проводников есть свободные заряды, у диэлектриков — нет.'}, + {q:'Какие частицы свободны в металлах?', opts:['атомы','протоны','электроны','нейтроны'], ans:2, why:'Свободные электроны переносят заряд в металлах.'}, + {q:'Заряд на металлическом шарике распределяется…', opts:['в центре','в одной точке','по всей поверхности','внутри'], ans:2, 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('p13-mcq'); if(!wrap) return; + let h = '
Вопрос '+(i+1)+'. '+q.q+'
'; + q.opts.forEach((opt,k)=>{ h += ''; }); + h += '
'; + wrap.innerHTML = h; + document.getElementById('p13-mcq-i').textContent = (i+1); + document.getElementById('p13-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('p13-mcq-fb'); + if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p13-mcq'); bumpProgress('p13', 3); } + else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p13-mcq-ok').textContent = ok; + renderMath(wrap); + if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p13-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+'/'+QS.length+').'; addXp(15,'p13-mcq-bonus'); bumpProgress('p13', 15); }, 600); } + }); + }); + const nb = document.getElementById('p13-mcq-next'); if(nb) nb.addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); }); + renderMath(wrap); + } + render(); +} + +/* ======== §14 — Электризация через влияние (индукция) ======== */ +function build_p14(){ + const box = document.getElementById('p14-body'); + let h = ''; + + h += makeCard('theory', 'Что такое индукция', '§ 14.1', + '

Если поднести заряженное тело к нейтральному проводнику, не касаясь его, в проводнике произойдёт перераспределение свободных электронов.

' + +'

Электризация через влияние (или индукция) — это разделение зарядов в проводнике под действием внешнего заряда без непосредственного контакта.

' + +'

Ближний к источнику конец проводника получает заряд противоположного знака, дальний — того же знака.

' + ); + h += makeCard('rule', 'Как это работает', '§ 14.2', + '

Подносим $+q$ к незаряженному металлическому шарику:

' + +'
    ' + +'
  1. Свободные электроны (отрицательные) притягиваются к $+q$ — собираются на ближнем конце.
  2. ' + +'
  3. На дальнем конце остаются положительные ионы — некомпенсированный $+q$.
  4. ' + +'
  5. В целом шарик остался нейтральным, но заряды разделились.
  6. ' + +'
  7. Если теперь шарик разделить на 2 половинки — каждая будет заряжена!
  8. ' + +'
' + ); + h += makeCard('example', 'Примеры явления', '§ 14.3', + '
    ' + +'
  • Заряженный шарик притягивает любой кусочек металла — даже нейтральный.
  • ' + +'
  • Расчёска (заряженная) притягивает бумажки (диэлектрик слегка поляризуется).
  • ' + +'
  • В стенке (диэлектрик) поляризация молекул — шарик прилипает.
  • ' + +'
  • Молниеотвод собирает индукцией заряд из грозовой тучи и отводит в землю.
  • ' + +'
' + ); + + /* IV1 — Симуляция: палочка + металлический шарик */ + h += '
' + +'
IV-1
Поднеси заряд — увидь индукцию
' + +'
Двигай заряженную палочку (slider) — наблюдай, как электроны в металлическом шарике перераспределяются.
' + +'
' + +'' + +'' + +'
' + +'' + +'
' + +'Ближний конец шара: + (противоположный палочке)' + +'Дальний конец шара: (того же знака)' + +'
' + +'
'; + + /* IV2 — викторина: «что будет с шаром если…» */ + h += '
' + +'
IV-2
Что произойдёт?
' + +'
Дана ситуация — определи итог.
' + +'
' + +'
' + +'
Раунд: 1 / 5Правильно: 0
' + +'
'; + + /* IV3 — DnD: «в проводнике / в диэлектрике» */ + h += '
' + +'
IV-3
Где идёт индукция, а где — поляризация?
' + +'
В проводниках — индукция (электроны бегут); в диэлектриках — поляризация (молекулы поворачиваются).
' + +'
' + +'
' + +'
Индукция (в проводнике)
' + +'
Поляризация (в диэлектрике)
' + +'
' + +'
' + +'' + +'
'; + + /* IV4 — MCQ */ + h += '
' + +'
IV-4
Тренажёр: 6 вопросов
' + +'
4+ правильных — +15 XP.
' + +'
' + +'
Вопрос: 1 / 6Правильно: 0
' + +'
'; + + box.innerHTML = h + secNavFor('p14') + readButton('p14'); + renderMath(box); + wireReadBtn('p14'); + + _initP14_sim(); + _initP14_quiz(); + _initP14_dnd(); + _initP14_mcq(); +} + +function _initP14_sim(){ + const svg = document.getElementById('p14-sim'); if(!svg) return; + function draw(){ + const sx = +document.getElementById('p14-x').value; + const sig = +document.getElementById('p14-sig').value; + document.getElementById('p14-xv').textContent = sx < 80 ? 'далеко' : (sx < 130 ? 'близко' : 'почти касается'); + /* у шарика: nearLabel = противоп. знаку палочки */ + const nearSym = sig > 0 ? '−' : '+'; + const farSym = sig > 0 ? '+' : '−'; + document.getElementById('p14-near').innerHTML = nearSym; + document.getElementById('p14-far').innerHTML = farSym; + /* draw */ + let s = ''; + /* палочка слева */ + s += ''; + const rodCol = sig > 0 ? '#dc2626' : '#2563eb'; + const rodTxt = sig > 0 ? '+' : '−'; + for(let i=0;i<4;i++) s += ''+rodTxt+''; + /* металлический шарик в центре */ + const shCx = 260, shCy = 90, shR = 56; + s += ''; + /* концентрация электронов на ближнем конце (если sig=+, электроны к палочке) или ионов */ + const intensity = Math.min(1, (180 - sx) / 100); /* чем ближе палочка, тем сильнее эффект */ + /* near = слева от шара (ближе к палочке), far = справа */ + /* ставим знаки. Если палочка -, на ближнем + (т.е. на левой стороне +) */ + const nearCol = sig > 0 ? '#2563eb' : '#dc2626'; + const farCol = sig > 0 ? '#dc2626' : '#2563eb'; + const nearTxt = sig > 0 ? '−' : '+'; + const farTxt = sig > 0 ? '+' : '−'; + for(let i=0;i<6;i++){ + const ang = -Math.PI/2 + (i-2.5)*0.18; + const r = shR - 14; + /* near (слева) */ + const nx = shCx + r*Math.cos(Math.PI + ang*0.4); + const ny = shCy + r*Math.sin(Math.PI + ang*0.4) - i*0; + s += ''+nearTxt+''; + /* far (справа) */ + const fx = shCx + r*Math.cos(ang*0.4); + const fy = shCy + r*Math.sin(ang*0.4); + s += ''+farTxt+''; + } + s += 'МЕТАЛЛ. ШАР (нейтральный)'; + /* подпись индукции */ + if(intensity > 0.3){ + s += 'индукция!'; + } + svg.innerHTML = s; + } + document.getElementById('p14-x').addEventListener('input', draw); + document.getElementById('p14-sig').addEventListener('change', draw); + draw(); +} + +function _initP14_quiz(){ + const QS = [ + {sit:'$+q$ поднесли к нейтральному металлическому шару, не касаясь.', opts:['шар стал +','шар стал −','шар стал нейтральным с разделёнными зарядами','шар не изменился'], ans:2, why:'Произошла индукция: внутри шара разделились заряды, но в целом он остался нейтральным.'}, + {sit:'$-q$ поднесли к шару и коснулись его.', opts:['заряды шара не изменились','шар стал отрицательным','шар стал положительным','шар стал нейтральным'], ans:1, why:'Электроны с палочки перешли на шар.'}, + {sit:'$+q$ долго держали возле шара, а потом убрали (не касаясь).', opts:['шар остался заряженным','шар нейтральный','шар стал отрицательным','шар стал положительным'], ans:1, why:'Без касания заряд просто перераспределялся; при удалении источника всё возвращается, шар нейтрален.'}, + {sit:'$+q$ поднесли к двум прижатым друг к другу шарам. Их разъединили (не убирая $+q$), затем убрали $+q$.', opts:['оба нейтральны','оба +','оба −','один +, другой −'], ans:3, why:'При разделении в присутствии $+q$ заряды зафиксировались: дальний шар стал +, ближний −.'}, + {sit:'$-q$ поднесли к листку бумаги (диэлектрик).', opts:['ничего','бумага зарядилась +','в бумаге поляризация, она притянулась','бумага оттолкнулась'], ans:2, why:'В диэлектрике молекулы поляризуются, листок притягивается.'} + ]; + let i = 0, ok = 0; + function render(){ + const q = QS[i]; const wrap = document.getElementById('p14-quiz'); if(!wrap) return; + let html = '
'+q.sit+'
'; + q.opts.forEach((opt,k)=>{ html += ''; }); + html += '
'; + wrap.innerHTML = html; + document.getElementById('p14-quiz-r').textContent = (i+1); + document.getElementById('p14-quiz-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('p14-quiz-fb'); + if(k===q.ans){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p14-quiz'); bumpProgress('p14', 4); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p14-quiz-ok').textContent = ok; + }); + }); + } + document.getElementById('p14-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); }); + render(); +} + +function _initP14_dnd(){ + const items = [ + {id:'ms', cat:'ind', html:'$+q$ возле металлического шара'}, + {id:'mf', cat:'ind', html:'заряженный шар возле фольги'}, + {id:'mp', cat:'ind', html:'заряженный шар возле железной пластины'}, + {id:'mw', cat:'ind', html:'$+q$ возле провода'}, + {id:'pl', cat:'pol', html:'$-q$ возле клочка бумаги'}, + {id:'pg', cat:'pol', html:'$+q$ возле стеклянной палочки'}, + {id:'pw', cat:'pol', html:'$-q$ возле деревянной планки'}, + {id:'pp', cat:'pol', html:'$+q$ возле пластиковой пластины'} + ]; + const dnd = setupSorter({ poolId:'p14-dnd-pool', scopeSelector:'#sec-p14', cats:['ind','pol'], items, columnLayout:false }); + document.getElementById('p14-dnd-check').addEventListener('click', ()=>{ + const fb = document.getElementById('p14-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,'p14-dnd'); bumpProgress('p14', 20); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Металлы и фольга — проводники, остальное — диэлектрики.'; } + }); + document.getElementById('p14-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p14-dnd-fb'); fb.style.display='none'; }); +} + +function _initP14_mcq(){ + const QS = [ + {q:'Что такое электризация через влияние?', opts:['заряжение трением','перенос заряда касанием','разделение зарядов в проводнике без касания','испускание электронов'], ans:2, why:'Это разделение зарядов внутри проводника под действием внешнего заряда.'}, + {q:'Ближний к источнику конец проводника получает заряд…', opts:['того же знака','противоположного','становится нейтральным','положительный'], ans:1, why:'Притягиваются заряды противоположного знака.'}, + {q:'После убирания внешнего заряда (без касания) проводник…', opts:['остаётся заряженным','становится нейтральным','меняет знак','раскалывается'], ans:1, why:'Перераспределение исчезает, и проводник снова нейтрален.'}, + {q:'Если в присутствии $+q$ разъединить шар на 2 части, что станет с частями после убирания $+q$?', opts:['обе +','обе −','одна +, другая −','обе нейтральны'], ans:2, why:'Разделение зафиксировалось: ближняя часть −, дальняя +.'}, + {q:'Почему листочки бумаги притягиваются к расчёске?', opts:['индукция','поляризация молекул в диэлектрике','магнетизм','гравитация'], ans:1, why:'В диэлектрике молекулы поляризуются, и листок притягивается.'}, + {q:'Молниеотвод использует…', opts:['индукцию','теплопередачу','излучение','реакцию горения'], ans:0, why:'Индукция собирает заряд из тучи на острие и отводит его в землю.'} + ]; + let i = 0, ok = 0, done = 0, awarded = false; + function render(){ + const q = QS[i]; const wrap = document.getElementById('p14-mcq'); if(!wrap) return; + let h = '
Вопрос '+(i+1)+'. '+q.q+'
'; + q.opts.forEach((opt,k)=>{ h += ''; }); + h += '
'; + wrap.innerHTML = h; + document.getElementById('p14-mcq-i').textContent = (i+1); + document.getElementById('p14-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('p14-mcq-fb'); + if(k===q.ans){ ok++; done++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(2,'p14-mcq'); bumpProgress('p14', 3); } + else { done++; fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p14-mcq-ok').textContent = ok; + renderMath(wrap); + if(done >= QS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p14-mcq-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — тренажёр пройден ('+ok+'/'+QS.length+').'; addXp(15,'p14-mcq-bonus'); bumpProgress('p14', 15); }, 600); } + }); + }); + const nb = document.getElementById('p14-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);