Files
Learn_System/frontend/textbooks/physics_11_ch2.html
T
Maxim Dolgolyov a09616450f feat(phys11 W3): Глава 2 §7-§9 + расширение phys-fx.js (LCcircuit, ACgen, Transformer)
phys-fx.js (+3 электротехнических компонента):
- PHYS.LCcircuit: колебательный контур со схемой C↔L, провода, стрелка тока,
  заряды на пластинах (меняют знак), энергетические столбцы W_C и W_L,
  формула T=2π√(LC) с актуальным значением
- PHYS.ACgen: генератор переменного тока — слева вращающаяся рамка в B,
  справа график U(t)=U₀sin(ωt) с историей
- PHYS.Transformer: схема трансформатора с сердечником, обмотки N₁, N₂,
  входное U₁, расчётное U₂, коэф. трансформации k, отметка повышающий/понижающий

physics_11_ch2.html (~63 КБ, violet-тема):
- 2-кол layout с col-side, hero violet-градиент
- psel-grid 8 карточек (§7-§13 + Финал); §7-§9 активны
- Watermarks: LC, ∿, ≡, , ⚙, λ, ☣, ★

§7 Колебательный контур. Формула Томсона:
- 3 теор. карточки (контур, формула Томсона, превращения энергии)
- Инт. 1: LCcircuit с ползунками L (1-100 мГн), C (0.1-10 мкФ)
- Инт. 2: расчёт T, ν (5 input)
- Инт. 3: аналогии и свойства (5 MC)
- Босс §7: 5 этапов, +70 XP

§8 Вынужденные ЭМ колеб. Переменный ток:
- 2 теор. карточки (генератор, действ. значения I₀/√2)
- Инт. 1: ACgen (вращ. рамка → синусоида) с ползунком ω
- Инт. 2: расчёт I/I₀, U/U₀ (5 input)
- Инт. 3: теория действующих значений (5 MC)
- Босс §8: 5 этапов, +70 XP

§9 Трансформатор:
- 2 теор. карточки (устройство, коэф. трансформации, I₁U₁=I₂U₂)
- Инт. 1: Transformer с ползунками N₁ (50-1000), N₂ (10-1000), U₁ (12-10000 В)
- Инт. 2: расчёт U₂, I₂, k (5 input)
- Инт. 3: повышающий/понижающий (5 MC)
- Босс §9: 5 этапов, +70 XP

§10-§13, Финал — stub-карточки 'в разработке (W4)'.

LocalStorage: physics11_ch2_*, общий physics11_xp
Server sync: /api/textbooks/physics-11-ch2/progress
2026-05-29 18:15:00 +03:00

915 lines
68 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<title>Физика 11 · Глава 2 · «Электромагнитные колебания и волны»</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
onload="renderMathInElement(document.body,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false})"></script>
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/phys-fx.js?v=1"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800;900&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<style>
:root{
--bg:#fafafa; --card:#fff; --card-soft:#f8fafc; --text:#0f172a; --ink:#0f172a; --muted:#64748b;
--border:#e2e8f0; --sh:0 1px 3px rgba(0,0,0,.06); --sh2:0 4px 14px rgba(0,0,0,.08);
--pri:#7c3aed; --pri2:#5b21b6; --pri-soft:#ede9fe;
--acc:#a78bfa; --acc2:#7c3aed; --acc-soft:#ddd6fe;
--ok:#10b981; --ok-bg:#d1fae5; --warn:#f59e0b; --warn-bg:#fef3c7;
--bad:#ef4444; --fail:#dc2626; --fail-bg:#fee2e2;
}
.dark{--bg:#13042a; --card:#1e0a3d; --card-soft:#241050; --text:#ede9fe; --ink:#ede9fe; --muted:#a78bfa; --border:#5b21b6}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.55;font-size:15px}
button,input,select,textarea{font-family:inherit;font-size:inherit}
button{cursor:pointer;border:0;background:transparent;color:inherit}
a{color:inherit;text-decoration:none}
.ic{width:16px;height:16px;display:inline-block;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle}
.hdr{position:relative;background:linear-gradient(110deg,#5b21b6 0%,#7c3aed 55%,#c4b5fd 100%);color:#fff;padding:46px 22px 30px;overflow:hidden;border-bottom:2px solid rgba(196,181,253,.2);min-height:130px}
.hdr::before{content:'ГЛАВА 2';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(5rem,15vw,11rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.12);line-height:1;pointer-events:none;user-select:none;z-index:0}
.hdr-row{position:relative;z-index:1;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.hdr h1{font-family:'Unbounded',sans-serif;font-size:1.5rem;font-weight:900;letter-spacing:-.01em;line-height:1.3;padding-top:4px}
.hdr-sub{font-size:.85rem;opacity:.88;margin-top:6px;font-weight:500;line-height:1.4}
.hdr-side{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.hdr-btn{padding:7px 12px;border-radius:9px;background:rgba(255,255,255,.14);color:#fff;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;text-decoration:none}
.hdr-btn:hover{background:rgba(255,255,255,.24)}
.main{max-width:1240px;margin:0 auto;padding:22px;width:100%;display:grid;grid-template-columns:1fr 280px;gap:24px}
@media(max-width:980px){.main{grid-template-columns:1fr;padding:14px}}
.col-main{min-width:0}
.hero{background:linear-gradient(135deg,var(--pri-soft) 0%,var(--acc-soft) 50%,var(--pri-soft) 100%);background-size:200% 200%;animation:heroShift 12s ease-in-out infinite;border:1px solid var(--border);border-radius:18px;padding:24px 22px;margin-bottom:24px;position:relative;overflow:hidden}
@keyframes heroShift{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.hero::before{content:'\26A1';position:absolute;right:0;top:-30px;font-size:clamp(2rem,12vw,8rem);font-weight:900;color:var(--pri);opacity:.10;line-height:1;pointer-events:none;font-family:'Unbounded',sans-serif}
.hero h2{font-family:'Unbounded',sans-serif;font-size:1.55rem;font-weight:800;color:var(--pri2);margin-bottom:10px;letter-spacing:-.01em}
.hero p{font-size:.95rem;color:var(--text);opacity:.88;margin-bottom:14px;max-width:640px}
.hero-row{display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.btn-primary{padding:11px 22px;background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;border-radius:11px;font-weight:700;font-size:.92rem;display:inline-flex;align-items:center;gap:8px;box-shadow:var(--sh2);transition:transform .15s,box-shadow .15s}
.btn-primary:hover{transform:translateY(-1px);box-shadow:0 8px 28px rgba(0,0,0,.18)}
.hero-progress{flex:1;min-width:200px;max-width:280px}
.hp-label{font-size:.74rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:5px}
.hp-bar{height:8px;background:rgba(0,0,0,.12);border-radius:5px;overflow:hidden}
.hp-fill{height:100%;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:5px;width:0%;transition:width .6s cubic-bezier(.16,1,.3,1)}
.hp-text{font-size:.78rem;color:var(--muted);font-weight:700;margin-top:4px;display:block}
.hero-xp-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:linear-gradient(135deg,var(--warn,#f59e0b),var(--pri));color:#fff;border-radius:99px;font-size:.82rem;font-weight:800;letter-spacing:.02em;box-shadow:0 4px 12px rgba(0,0,0,.18);font-family:'Unbounded',sans-serif}
.psel{margin-bottom:24px}
.psel-title{font-size:.72rem;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}
.psel-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
.psel-card{background:var(--card);border:1.5px solid var(--border);border-radius:13px;padding:14px;cursor:pointer;transition:transform .2s,box-shadow .2s,border-color .2s;text-align:left;position:relative}
.psel-card:hover{transform:translateY(-3px);box-shadow:var(--sh2);border-color:var(--pri)}
.psel-card.active{border-color:var(--pri);background:linear-gradient(135deg,var(--pri-soft),var(--card));box-shadow:var(--sh2)}
.psel-card.active::after{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:13px 13px 0 0}
.psel-num{font-family:'Unbounded',sans-serif;font-size:.72rem;font-weight:800;color:var(--pri);text-transform:uppercase;letter-spacing:.08em;margin-bottom:5px}
.psel-name{font-size:.82rem;font-weight:700;color:var(--text);line-height:1.3;margin-bottom:8px}
.psel-prog{height:4px;background:rgba(0,0,0,.10);border-radius:3px;overflow:hidden}
.psel-prog-fill{height:100%;background:var(--pri);width:0%;transition:width .4s}
.psel-card.final{background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft))}
.psel-card.final .psel-num{color:var(--warn)}
.psel-card.locked{opacity:.55}
.psel-card .psel-done{position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:50%;background:#10b981;display:none;align-items:center;justify-content:center;box-shadow:0 2px 6px rgba(16,185,129,.45);z-index:2}
.psel-card .psel-done svg{width:11px;height:11px;stroke:#fff;fill:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.psel-card.done .psel-done{display:flex}
.sec{display:none;position:relative;animation:fadeIn .35s ease}
.sec.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.sec::before{content:attr(data-watermark);position:absolute;right:-20px;top:10%;font-family:'Unbounded',sans-serif;font-size:clamp(6rem,18vw,14rem);font-weight:900;color:transparent;-webkit-text-stroke:1.5px var(--pri-soft);line-height:1;pointer-events:none;user-select:none;z-index:0;opacity:.35}
.sec-header{margin-bottom:22px;padding-bottom:14px;border-bottom:2px solid var(--pri-soft);position:relative;z-index:1}
.sec-num{display:inline-block;padding:4px 10px;background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;border-radius:7px;font-family:'Unbounded',sans-serif;font-size:.78rem;font-weight:800;letter-spacing:.04em;margin-bottom:8px}
.sec-h{font-family:'Unbounded',sans-serif;font-size:1.5rem;font-weight:800;color:var(--pri2);letter-spacing:-.01em;line-height:1.25}
.card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:18px 20px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.04),0 8px 24px rgba(0,0,0,.04);position:relative;z-index:1;transition:transform .25s cubic-bezier(.16,1,.3,1),box-shadow .25s}
.card:hover{transform:translateY(-2px);box-shadow:0 4px 10px rgba(0,0,0,.06),0 16px 36px rgba(0,0,0,.08)}
.card-header{display:flex;align-items:center;gap:10px;margin-bottom:12px;padding-bottom:10px;border-bottom:1px dashed var(--border)}
.card-icon{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff}
.card-icon.repeat{background:#0ea5e9}.card-icon.theory{background:#8b5cf6}.card-icon.algo{background:#f59e0b}.card-icon.rule{background:#ec4899}.card-icon.example{background:#10b981}
.card-icon .ic{width:18px;height:18px}
.card-title{font-family:'Unbounded',sans-serif;font-size:.82rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);flex:1}
.card-num{font-size:.74rem;font-weight:700;color:var(--muted);background:var(--pri-soft);padding:3px 7px;border-radius:5px}
.card-body{font-size:.94rem;line-height:1.65}
.card-body p{margin-bottom:8px}
.card-body p:last-child{margin-bottom:0}
.card-body ul{margin:6px 0 6px 22px;line-height:1.7}
.btn{padding:8px 16px;border-radius:8px;background:var(--card);color:var(--text);border:1.5px solid var(--border);font-weight:600;font-size:.88rem;transition:background .15s,border-color .15s,transform .1s}
.btn:hover{background:var(--pri-soft);border-color:var(--pri)}
.btn:active{transform:scale(.96)}
.btn.primary{background:var(--pri);color:#fff;border-color:var(--pri)}
.btn.primary:hover{background:var(--pri2);border-color:var(--pri2)}
.feedback{padding:10px 14px;border-radius:9px;font-weight:600;font-size:.88rem;margin-top:8px;display:none}
.feedback.ok{display:block;background:var(--ok-bg);color:#065f46;border-left:4px solid var(--ok)}
.feedback.fail{display:block;background:var(--fail-bg);color:#7f1d1d;border-left:4px solid var(--fail)}
.wg{background:linear-gradient(135deg,var(--card),var(--pri-soft));border:1.5px solid var(--pri);border-radius:14px;padding:18px 20px;margin-bottom:18px;box-shadow:var(--sh2);position:relative;z-index:1}
.wg-header{display:flex;align-items:center;gap:8px;margin-bottom:14px}
.wg-badge{padding:4px 9px;background:var(--pri);color:#fff;border-radius:6px;font-family:'Unbounded',sans-serif;font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em}
.wg-title{font-family:'Unbounded',sans-serif;font-size:1.05rem;font-weight:800;color:var(--pri2);flex:1}
.wg-help{font-size:.88rem;color:var(--text);margin-bottom:12px;line-height:1.55;background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft));border-left:4px solid var(--warn);padding:9px 14px;border-radius:9px}
.tinp{padding:8px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--card);color:var(--text);transition:border-color .15s;font-family:'JetBrains Mono',monospace;width:140px}
.tinp:focus{outline:0;border-color:var(--pri);box-shadow:0 0 0 3px var(--pri-soft)}
.actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;align-items:center}
.opts-row{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.opt-btn{padding:8px 14px;background:var(--card);border:1.5px solid var(--border);border-radius:9px;font-weight:700;font-size:.88rem;color:var(--text);cursor:pointer;transition:all .15s}
.opt-btn:hover{background:var(--pri-soft);border-color:var(--pri)}
.opt-btn.correct{background:var(--ok-bg);border-color:var(--ok);color:#065f46}
.opt-btn.wrong{background:var(--fail-bg);border-color:var(--fail);color:#991b1b}
.col-side{position:sticky;top:14px;align-self:start;height:fit-content;max-height:calc(100vh - 28px);overflow-y:auto}
.sidecard{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:16px;margin-bottom:14px;box-shadow:var(--sh)}
.sidecard h4{font-family:'Unbounded',sans-serif;font-size:.74rem;font-weight:800;color:var(--pri2);text-transform:uppercase;letter-spacing:.07em;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--border)}
.sidecard-row{margin-bottom:8px;font-size:.84rem;line-height:1.55}
.sidecard-row b{color:var(--pri);font-weight:700}
.sidecard-row:last-child{margin-bottom:0}
@media(max-width:980px){.col-side{position:static;max-height:none}}
.xp-card{background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft));border:1.5px solid var(--warn);border-radius:12px;padding:14px;margin-bottom:14px}
.xp-card-title{font-size:.68rem;font-weight:800;color:var(--warn);text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between}
.xp-level{font-size:1.1rem;font-weight:900;color:#92400e;font-family:'Unbounded',sans-serif}
.xp-bar{height:9px;background:rgba(0,0,0,.10);border-radius:6px;overflow:hidden;margin:7px 0}
.xp-fill{height:100%;background:linear-gradient(90deg,var(--warn),var(--pri));border-radius:6px;transition:width .5s cubic-bezier(.4,0,.2,1)}
.xp-nums{font-size:.74rem;color:var(--muted);display:flex;justify-content:space-between}
.sec-nav{display:flex;gap:10px;margin-top:24px;padding-top:20px;border-top:1px solid var(--border);justify-content:space-between;flex-wrap:wrap}
.foot{text-align:center;padding:30px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
.ach-popup{position:fixed;top:80px;right:18px;background:linear-gradient(135deg,var(--pri),var(--warn));color:#fff;padding:12px 18px;border-radius:11px;font-weight:700;font-size:.9rem;box-shadow:0 8px 28px rgba(0,0,0,.32);z-index:1002;display:none;align-items:center;gap:8px;max-width:340px}
.ach-popup.show{display:flex}
.fx-holder{margin:10px 0;padding:0;text-align:center}
.fx-sliders{margin-top:10px;display:flex;flex-wrap:wrap;gap:4px;background:rgba(255,255,255,.5);border-radius:9px;padding:6px 4px}
.boss-card{background:var(--card);border:2px solid var(--border);border-radius:14px;padding:16px;margin-bottom:14px;transition:border-color .35s,box-shadow .35s,transform .2s}
.boss-card.solved{border-color:#10b981;box-shadow:0 0 0 3px rgba(16,185,129,.18)}
.boss-head{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.boss-tag{font-size:.7rem;font-weight:800;padding:3px 9px;border-radius:99px;background:var(--pri-soft);color:var(--pri2);letter-spacing:.04em;text-transform:uppercase}
.boss-title{font-family:'Unbounded',sans-serif;font-weight:800;color:var(--text);font-size:1.02rem;flex:1;min-width:0}
.boss-q{padding:12px 14px;background:var(--pri-soft);border-radius:10px;font-size:.96rem;line-height:1.55;margin-bottom:10px;color:var(--text)}
.boss-input{padding:8px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--card);color:var(--text);font-family:'JetBrains Mono',monospace;width:140px;text-align:center;font-size:.95rem}
.boss-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:6px}
.boss-fb{padding:10px 14px;border-radius:9px;font-weight:600;font-size:.88rem;margin-top:8px;display:none;line-height:1.45}
.boss-fb.ok{display:block;background:var(--ok-bg);color:#065f46;border-left:4px solid var(--ok)}
.boss-fb.fail{display:block;background:var(--fail-bg);color:#7f1d1d;border-left:4px solid var(--fail)}
.stub-note{padding:18px 22px;background:linear-gradient(135deg,var(--pri-soft),var(--warn-bg));border:1.5px dashed var(--pri);border-radius:13px;text-align:center;color:var(--text);margin-bottom:14px}
.stub-note h3{font-family:'Unbounded',sans-serif;color:var(--pri2);margin-bottom:8px;font-size:1.05rem}
.stub-note p{color:var(--muted);font-size:.9rem;line-height:1.55}
</style>
</head>
<body>
<header class="hdr">
<div class="hdr-row">
<div>
<h1>Физика 11 · Глава 2</h1>
<div class="hdr-sub">Электромагнитные колебания и волны · колебательный контур, переменный ток, трансформатор, ЭМ волны, шкала ЭМ</div>
</div>
<div class="hdr-side">
<a href="/textbook/physics-11" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> К физике 11</a>
<button id="theme-btn" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg><span id="theme-lab">Тёмная</span></button>
</div>
</div>
</header>
<main class="main">
<div class="col-main">
<section class="hero">
<h2>Электромагнитные колебания и волны</h2>
<p>Аналогия механических колебаний — электромагнитные. Колебательный контур, переменный ток, трансформаторы, передача электроэнергии и шкала ЭМ волн от радио до γ-излучения.</p>
<div class="hero-row">
<button class="btn-primary" onclick="goTo('p1')"><svg class="ic" viewBox="0 0 24 24"><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></svg> Начать § 7</button>
<div class="hero-progress">
<span class="hp-label">Прогресс по главе</span>
<div class="hp-bar"><div id="hero-hp-fill" class="hp-fill"></div></div>
<span id="hero-hp-text" class="hp-text">0%</span>
</div>
<div id="hero-xp-badge" class="hero-xp-badge"></div>
</div>
</section>
<section class="psel">
<div class="psel-title">Параграфы главы</div>
<div id="psel-grid" class="psel-grid"></div>
</section>
<section id="sec-p1" class="sec" data-watermark="LC"><div class="sec-header"><span class="sec-num">§ 7</span><h2 class="sec-h">Колебательный контур. Формула Томсона</h2></div><div id="p1-body"></div></section>
<section id="sec-p2" class="sec" data-watermark="&#8767;"><div class="sec-header"><span class="sec-num">§ 8</span><h2 class="sec-h">Вынужденные ЭМ колеб. Переменный ток</h2></div><div id="p2-body"></div></section>
<section id="sec-p3" class="sec" data-watermark="&#8801;"><div class="sec-header"><span class="sec-num">§ 9</span><h2 class="sec-h">Трансформатор</h2></div><div id="p3-body"></div></section>
<section id="sec-p4" class="sec" data-watermark="&#9889;"><div class="sec-header"><span class="sec-num">§ 10</span><h2 class="sec-h">Производство и передача электроэнергии</h2></div><div id="p4-body"></div></section>
<section id="sec-p5" class="sec" data-watermark="&#9881;"><div class="sec-header"><span class="sec-num">§ 11</span><h2 class="sec-h">Экологические проблемы энергетики</h2></div><div id="p5-body"></div></section>
<section id="sec-p6" class="sec" data-watermark="&#955;"><div class="sec-header"><span class="sec-num">§ 12</span><h2 class="sec-h">ЭМ волны. Шкала ЭМ волн</h2></div><div id="p6-body"></div></section>
<section id="sec-p7" class="sec" data-watermark="&#9763;"><div class="sec-header"><span class="sec-num">§ 13</span><h2 class="sec-h">Действие ЭМ излучения на живые организмы</h2></div><div id="p7-body"></div></section>
<section id="sec-final" class="sec" data-watermark="&#9733;"><div class="sec-header"><span class="sec-num" style="background:linear-gradient(135deg,#d97706,#f59e0b)">&#9733;</span><h2 class="sec-h">Финал главы 2</h2></div><div id="final-body"></div></section>
</div>
<aside class="col-side"><div id="sidebar-content"></div></aside>
</main>
<footer class="foot">Интерактивный учебник «Физика 11» · Глава 2 · «Электромагнитные колебания и волны» · LearnSpace</footer>
<div id="ach-popup" class="ach-popup"><svg class="ic" viewBox="0 0 24 24" style="width:22px;height:22px"><polygon points="12,2 22,20 2,20"/></svg><span id="ach-text">Достижение!</span></div>
<script>
'use strict';
const STATE = { current:'p1', progress:{}, achievements:new Map(), xp:0, level:1 };
const TOTAL_PARAS = 7;
const _TB_SLUG = 'physics-11-ch2';
const PARAS = [
{ id:'p1', num:'§ 7', name:'LC-контур, формула Томсона', sub:'$T = 2\\pi\\sqrt{LC}$', built:true },
{ id:'p2', num:'§ 8', name:'Переменный ток', sub:'$I = I_0/\\sqrt{2}$', built:true },
{ id:'p3', num:'§ 9', name:'Трансформатор', sub:'$k = N_1/N_2$', built:true },
{ id:'p4', num:'§ 10', name:'Передача электроэнергии', sub:'Будет в W4', built:false },
{ id:'p5', num:'§ 11', name:'Эко-проблемы', sub:'Будет в W4', built:false },
{ id:'p6', num:'§ 12', name:'Шкала ЭМ волн', sub:'$c = 3 \\cdot 10^8$ м/с', built:false },
{ id:'p7', num:'§ 13', name:'ЭМ и живые орг.', sub:'Будет в W4', built:false },
{ id:'final', num:'★', name:'Финал главы', sub:'4 интегр. босса · W4', final:true, built:false }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
function calcLevel(xp){ return Math.floor(Math.sqrt((xp||0)/100))+1; }
function _xpForLevel(lv){ return (lv-1)*(lv-1)*100; }
const ACH_LABELS = {
p1_done:'§7 — LC-контур освоен',
p2_done:'§8 — переменный ток освоен',
p3_done:'§9 — трансформатор освоен',
p4_done:'§10 — передача э/э освоена',
p5_done:'§11 — экология освоена',
p6_done:'§12 — шкала ЭМ освоена',
p7_done:'§13 — действие ЭМ освоено',
start:'Начало главы 2!',
ch2_done:'Глава 2 пройдена — ЭМ колебания и волны!'
};
function loadProgress(){
try{
const s=localStorage.getItem('physics11_ch2_progress'); if(s) Object.assign(STATE.progress, JSON.parse(s));
const a=localStorage.getItem('physics11_ch2_achievements');
if(a){ const p=JSON.parse(a); if(p&&typeof p==='object'){ for(const[id,t] of Object.entries(p)) STATE.achievements.set(id,(t&&t!==id)?t:(ACH_LABELS[id]||id)); } }
STATE.xp=+(localStorage.getItem('physics11_xp')||0); STATE.level=calcLevel(STATE.xp);
}catch(e){}
}
function saveProgress(){
try{
localStorage.setItem('physics11_ch2_progress', JSON.stringify(STATE.progress));
localStorage.setItem('physics11_ch2_achievements', JSON.stringify(Object.fromEntries(STATE.achievements)));
localStorage.setItem('physics11_xp', String(STATE.xp));
}catch(e){}
}
function bumpProgress(key, delta){
STATE.progress[key]=Math.max(0,Math.min(100,(STATE.progress[key]||0)+delta));
saveProgress(); refreshProgressUI();
if(STATE.progress[key]>=50) markParaRead(key);
}
const _markedRead=new Set();
let _pendingProgressBody=null, _progressTimer=null;
function _flushProgress(){
const body=_pendingProgressBody; _pendingProgressBody=null; if(!body) return;
const tok=(window.LS&&LS.getToken)?LS.getToken():''; if(!tok) return;
fetch('/api/textbooks/'+_TB_SLUG+'/progress',{method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer '+tok},body:JSON.stringify(body),keepalive:true}).catch(()=>{});
}
function _queueProgress(patch){ _pendingProgressBody=Object.assign(_pendingProgressBody||{},patch); if(_progressTimer) clearTimeout(_progressTimer); _progressTimer=setTimeout(_flushProgress, 600); }
function markLastPara(id){ _queueProgress({last_para:id}); }
function markParaRead(id){ if(_markedRead.has(id)) return; _markedRead.add(id); _queueProgress({mark_read:id}); }
window.addEventListener('beforeunload', _flushProgress);
function addXp(n,src){
if(!n) return;
const prev=STATE.level; STATE.xp=Math.max(0,(STATE.xp||0)+n); STATE.level=calcLevel(STATE.xp);
saveProgress(); refreshProgressUI();
if(window.LS&&window.LS.xp) window.LS.xp.add(n,'physics11-ch2-'+(src||'misc'));
if(STATE.level>prev){
const pop=document.getElementById('ach-popup');
if(pop){ document.getElementById('ach-text').textContent='Уровень '+STATE.level+'!'; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'),2600); }
}
}
function refreshProgressUI(){
const total=Math.round(Object.values(STATE.progress).reduce((a,b)=>a+b,0)/TOTAL_PARAS);
const f=document.getElementById('hero-hp-fill'); if(f) f.style.width=total+'%';
const t=document.getElementById('hero-hp-text'); if(t) t.textContent=total+'% пройдено';
document.querySelectorAll('[data-prog-card]').forEach(el=>{ const k=el.dataset.progCard; const fl=el.querySelector('.psel-prog-fill'); if(fl) fl.style.width=(STATE.progress[k]||0)+'%'; if((STATE.progress[k]||0)>=100) el.classList.add('done'); });
const xpBadge=document.getElementById('hero-xp-badge');
if(xpBadge){ xpBadge.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:13px;height:13px"><polygon points="12 2 22 20 2 20"/></svg> Ур. '+STATE.level+' \xb7 '+(STATE.xp||0)+' XP'; }
if(STATE.current && document.getElementById('sidebar-content')){ try{ buildSidebar(STATE.current); }catch(e){} }
}
function achievement(id,text){
if(STATE.achievements.has(id)) return;
STATE.achievements.set(id, text||ACH_LABELS[id]||id); saveProgress();
const pop=document.getElementById('ach-popup');
if(pop){ document.getElementById('ach-text').textContent=text||ACH_LABELS[id]||id; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'),3300); }
addXp(20,'ach-'+id);
}
function buildParaSelector(){
const g=document.getElementById('psel-grid'); g.innerHTML='';
PARAS.forEach(p=>{
const card=document.createElement('div');
card.className='psel-card'+(p.final?' final':'')+(p.built?'':' locked');
card.dataset.id=p.id; card.dataset.progCard=p.id;
card.innerHTML='<div class="psel-num">'+p.num+'</div><div class="psel-name">'+p.name+'</div><div class="psel-prog"><div class="psel-prog-fill"></div></div><div class="psel-done"><svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"/></svg></div>';
card.addEventListener('click', ()=>goTo(p.id));
g.appendChild(card);
});
if(window.renderMathInElement) try{ renderMath(g); }catch(e){}
}
const BUILT=new Set();
const BUILDERS = {
p1:()=>buildP1(), p2:()=>buildP2(), p3:()=>buildP3(),
p4:()=>buildStubP('p4','§ 10','§10 в разработке (W4) — производство и передача электроэнергии, потери $P = I^2 R$, ЛЭП высокого напряжения.'),
p5:()=>buildStubP('p5','§ 11','§11 в разработке (W4) — экологические проблемы: ВЭС, СЭС, гео- и приливные электростанции.'),
p6:()=>buildStubP('p6','§ 12','§12 в разработке (W4) — ЭМ волны, шкала ЭМ от радио до γ, $c = 3 \\cdot 10^8$ м/с.'),
p7:()=>buildStubP('p7','§ 13','§13 в разработке (W4) — действие ЭМ излучения на живые организмы.'),
final:()=>buildStubP('final','Финал','Финал главы 2 — в волне W4 (4 интегр. босса + ачивка ch2_done).')
};
function ensureBuilt(id){ if(BUILT.has(id)) return; const fn=BUILDERS[id]; if(fn){ fn(); BUILT.add(id); } }
function goTo(id){
STATE.current=id; ensureBuilt(id);
document.querySelectorAll('.sec').forEach(s=>s.classList.remove('active'));
const el=document.getElementById('sec-'+id); if(el) el.classList.add('active');
document.querySelectorAll('.psel-card').forEach(c=>c.classList.toggle('active', c.dataset.id===id));
buildSidebar(id);
window.scrollTo({top:0,behavior:'smooth'});
if((STATE.progress[id]||0)<10) bumpProgress(id, 10);
if(window.renderMathInElement) setTimeout(()=>renderMath(el), 0);
markLastPara(id);
}
const SIDEBARS = {
p1:{title:'Шпаргалка § 7', rows:[['LC-контур','$T = 2\\pi\\sqrt{LC}$'],['Циклическая ω','$\\omega = 1/\\sqrt{LC}$'],['Заряд','$q = Q_0\\cos(\\omega t)$'],['Ток','$i = -Q_0\\omega\\sin(\\omega t)$'],['Аналог','$L \\leftrightarrow m$, $1/C \\leftrightarrow k$']]},
p2:{title:'Шпаргалка § 8', rows:[['Мгн. ток','$i = I_0\\sin(\\omega t)$'],['Действ. ток','$I = I_0/\\sqrt{2}$'],['Действ. напр.','$U = U_0/\\sqrt{2}$'],['Сеть Беларуси','220 В, 50 Гц'],['$U_0$ сети','$U_0 = U\\sqrt{2} \\approx 311$ В']]},
p3:{title:'Шпаргалка § 9', rows:[['Коэф. трансф.','$k = N_1/N_2 = U_1/U_2$'],['$k > 1$','понижающий'],['$k < 1$','повышающий'],['КПД','$\\eta = P_2/P_1$'],['$I_2/I_1$','$\\approx N_1/N_2 = k$']]},
p4:{title:'§ 10', rows:[['Тема','Передача э/э'],['Статус','В разработке (W4)']]},
p5:{title:'§ 11', rows:[['Тема','Экология'],['Статус','В разработке (W4)']]},
p6:{title:'§ 12', rows:[['Тема','Шкала ЭМ волн'],['Статус','В разработке (W4)']]},
p7:{title:'§ 13', rows:[['Тема','ЭМ и жизнь'],['Статус','В разработке (W4)']]},
final:{title:'Финал главы 2', rows:[['Статус','В разработке (W4)'],['Боссов','4 интегрированных'],['Награда','+100 XP + ачивка']]}
};
const TIPS=[
{sec:'p1',html:'§ 7 — крути ползунки $L$ и $C$, наблюдай как период $T = 2\\pi\\sqrt{LC}$ меняется. Энергия колеблется между конденсатором и катушкой.'},
{sec:'p2',html:'§ 8 — действующее значение тока в $\\sqrt{2}$ раз меньше амплитуды. В сети 220 В: $U_0 \\approx 311$ В.'},
{sec:'p3',html:'§ 9 — $k > 1$ — понижающий, $k < 1$ — повышающий. Меняй $N_1, N_2, U_1$ — $U_2$ пересчитывается сразу.'},
{sec:'p4',html:'§ 10 — в разработке (W4).'},
{sec:'p5',html:'§ 11 — в разработке (W4).'},
{sec:'p6',html:'§ 12 — в разработке (W4).'},
{sec:'p7',html:'§ 13 — в разработке (W4).'},
{sec:'final',html:'Финал главы 2 — в разработке (W4).'}
];
function buildSidebar(id){
const box=document.getElementById('sidebar-content');
const sb=SIDEBARS[id]||SIDEBARS[PARAS[0].id];
let html='';
const xpForLv=_xpForLevel(STATE.level), xpNext=_xpForLevel(STATE.level+1);
const xpInLv=STATE.xp-xpForLv, xpRange=xpNext-xpForLv;
const xpPct=xpRange>0?Math.round(xpInLv/xpRange*100):100;
html+='<div class="xp-card"><div class="xp-card-title"><span>XP-прогресс</span><span class="xp-level">Ур. '+STATE.level+'</span></div><div class="xp-bar"><div class="xp-fill" style="width:'+xpPct+'%"></div></div><div class="xp-nums"><span>'+STATE.xp+' XP</span><span>'+xpNext+' XP</span></div></div>';
html+='<div class="sidecard"><h4>'+sb.title+'</h4>';
sb.rows.forEach(([k,v])=>{ html+='<div class="sidecard-row"><b>'+k+'</b>'+(v?' — '+v:'')+'</div>'; });
html+='</div>';
const tip=TIPS.find(t=>t.sec===id)||TIPS[0];
if(tip){
html+='<div class="sidecard" style="background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft));border-color:var(--warn)"><h4 style="color:#92400e;display:flex;align-items:center;gap:6px"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:14px;height:14px"><polygon points="12,2 22,20 2,20"/></svg>Подсказка</h4><div class="sidecard-row" style="margin-bottom:0;font-size:.82rem;line-height:1.55">'+tip.html+'</div></div>';
}
if(STATE.achievements.size>0){
html+='<div class="sidecard"><h4>Достижения <span style="color:var(--warn);float:right">'+STATE.achievements.size+'</span></h4>';
[...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='<div class="sidecard-row" style="font-size:.78rem;color:var(--ok)">&#10003; '+text+'</div>'; });
html+='</div>';
}
box.innerHTML=html;
if(window.renderMathInElement) try{ renderMath(box); }catch(e){}
}
function initTheme(){
const t=localStorage.getItem('physics11_theme')||localStorage.getItem('theme')||'light';
if(t==='dark') document.documentElement.classList.add('dark');
document.getElementById('theme-lab').textContent=t==='dark'?'Светлая':'Тёмная';
document.getElementById('theme-btn').addEventListener('click', ()=>{
document.documentElement.classList.toggle('dark');
const dark=document.documentElement.classList.contains('dark');
localStorage.setItem('physics11_theme', dark?'dark':'light');
localStorage.setItem('theme', dark?'dark':'light');
document.getElementById('theme-lab').textContent=dark?'Светлая':'Тёмная';
});
}
function renderMath(root){ if(window.renderMathInElement){ try{ renderMathInElement(root, {delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false}); }catch(e){} } }
const ICONS = {
repeat:'<svg class="ic" viewBox="0 0 24 24"><polyline points="9 11 12 14 22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>',
theory:'<svg class="ic" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>',
algo:'<svg class="ic" viewBox="0 0 24 24"><polyline points="17 11 21 7 17 3"/><line x1="21" y1="7" x2="9" y2="7"/><polyline points="7 13 3 17 7 21"/><line x1="3" y1="17" x2="15" y2="17"/></svg>',
rule:'<svg class="ic" viewBox="0 0 24 24"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg>',
example:'<svg class="ic" viewBox="0 0 24 24"><path d="M9 18h6"/><path d="M10 22h4"/><path d="M12 2a7 7 0 0 0-4 13c1 1 2 2 2 4h4c0-2 1-3 2-4a7 7 0 0 0-4-13z"/></svg>'
};
function makeCard(kind, title, num, body){
const labels = {repeat:'Повторение',theory:'Теория',algo:'Алгоритм',rule:'Правило',example:'Пример'};
return '<div class="card"><div class="card-header"><div class="card-icon '+kind+'">'+ICONS[kind]+'</div><div class="card-title">'+(labels[kind]||'')+(title&&title!==labels[kind]?' \xb7 '+title:'')+'</div>'+(num?'<div class="card-num">'+num+'</div>':'')+'</div><div class="card-body">'+body+'</div></div>';
}
function secNavFor(curId){
const idx = PARAS.findIndex(p => p.id === curId);
const prev = idx > 0 ? PARAS[idx-1].id : null;
const next = idx < PARAS.length - 1 ? PARAS[idx+1].id : null;
const NAMES = {p1:'\xA77',p2:'\xA78',p3:'\xA79',p4:'\xA710',p5:'\xA711',p6:'\xA712',p7:'\xA713',final:'Финал'};
let h='<div class="sec-nav">';
h+=prev?'<button class="btn" onclick="goTo(\''+prev+'\')"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> '+NAMES[prev]+'</button>':'<span></span>';
h+=next?'<button class="btn primary" onclick="goTo(\''+next+'\')">'+NAMES[next]+' <svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></button>':'<span></span>';
h+='</div>'; return h;
}
function readButton(paraId){
const p = PARAS.find(x => x.id === paraId);
const labelTail = p && p.final ? 'финал' : (p ? p.num : '\xA7?');
return '<div style="margin-top:18px;display:flex;justify-content:center"><button class="btn primary" id="'+paraId+'-read-btn">'
+'<svg class="ic" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>'
+' Я прочитал — '+labelTail+' (+10 XP)</button></div>';
}
function wireReadBtn(paraId){
const btn = document.getElementById(paraId+'-read-btn'); if(!btn) return;
btn.addEventListener('click', ()=>{
addXp(10, paraId+'-read'); bumpProgress(paraId, 30);
btn.textContent='Прочитано! +10 XP'; btn.disabled=true; btn.style.opacity=.6;
const aId = paraId+'_done';
if(ACH_LABELS[aId]) achievement(aId);
});
}
function normalizeAns(s){
return String(s||'').toLowerCase().replace(/\s+/g,'').replace(/°/g,'').replace(/sqrt/g,'√').replace(/корень/g,'√').replace(/,/g,'.');
}
function makeBoss(id, def){
const stage = (typeof def.stage === 'number') ? def.stage : 0;
const solved = !!def.solved;
const total = def.stages.length;
const stageObj = def.stages[Math.min(stage, total-1)];
let optsHtml = '';
if(solved){
return '<div class="boss-card solved" id="boss-'+id+'"><div class="boss-head"><span class="boss-tag">'+(def.tag||'Босс')+'</span><span class="boss-title">'+def.title+'</span></div><div class="boss-q">Побеждён! +'+def.xp+' XP получены.</div></div>';
}
if(stageObj.type === 'mc'){
optsHtml = '<div class="opts-row">';
stageObj.opts.forEach((o,i)=>{ optsHtml += '<button class="opt-btn" data-i="'+i+'">'+o+'</button>'; });
optsHtml += '</div>';
} else {
optsHtml = '<div class="boss-row"><input class="boss-input" id="boss-'+id+'-inp" placeholder="ответ"><button class="btn primary" id="boss-'+id+'-go">Атака</button></div>';
}
return '<div class="boss-card" id="boss-'+id+'"><div class="boss-head"><span class="boss-tag">'+(def.tag||'Босс')+'</span><span class="boss-title">'+def.title+' — этап '+(stage+1)+' / '+total+'</span></div><div class="boss-q">'+stageObj.q+'</div>'+optsHtml+'<div class="boss-fb" id="boss-'+id+'-fb"></div></div>';
}
function bindBoss(id, def, state, save, onWin){
const card = document.getElementById('boss-'+id);
if(!card || state.solved) return;
const stageObj = def.stages[state.stage];
const fb = document.getElementById('boss-'+id+'-fb');
function advance(){
state.stage++;
if(state.stage >= def.stages.length){
state.solved = true; save(); addXp(def.xp, 'boss-'+id);
if(onWin) onWin();
} else { save(); }
rebuildBoss(id, def, state, save, onWin);
}
if(stageObj.type === 'mc'){
card.querySelectorAll('.opt-btn').forEach(btn=>{
btn.addEventListener('click', ()=>{
const i = +btn.dataset.i;
if(i === stageObj.correct){
btn.classList.add('correct');
fb.className='feedback ok'; fb.innerHTML='&#10003; Верно. '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb);
setTimeout(advance, 700);
} else {
btn.classList.add('wrong');
fb.className='feedback fail'; fb.innerHTML='&#10007; Не так. '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb);
}
});
});
} else {
const inp = document.getElementById('boss-'+id+'-inp');
const go = document.getElementById('boss-'+id+'-go');
function attack(){
const v = normalizeAns(inp.value);
const ans = Array.isArray(stageObj.a) ? stageObj.a.map(normalizeAns) : [normalizeAns(stageObj.a)];
if(ans.indexOf(v) >= 0){
fb.className='feedback ok'; fb.innerHTML='&#10003; Верно! '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb);
setTimeout(advance, 600);
} else {
fb.className='feedback fail'; fb.innerHTML='&#10007; Не то. '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb);
}
}
go.addEventListener('click', attack);
inp.addEventListener('keydown', e=>{ if(e.key==='Enter'){ e.preventDefault(); attack(); } });
}
}
function rebuildBoss(id, def, state, save, onWin){
const card = document.getElementById('boss-'+id);
if(!card) return;
card.outerHTML = makeBoss(id, Object.assign({}, def, state));
bindBoss(id, def, state, save, onWin);
renderMath(document.getElementById('boss-'+id));
}
function makeAndBindBoss(slotId, id, def, state, save, onWin){
const slot = document.getElementById(slotId); if(!slot) return;
slot.innerHTML = makeBoss(id, Object.assign({}, def, state));
bindBoss(id, def, state, save, onWin);
renderMath(slot);
}
function ensureFx(cb){ if(window.PHYS) return cb(); setTimeout(()=>ensureFx(cb), 60); }
/* ===== §7 LC-контур ===== */
function buildP1(){
const box = document.getElementById('p1-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Колебательный контур', '§ 7.1',
'<p><b>Колебательный контур</b> — электрическая цепь, состоящая из конденсатора $C$ и катушки индуктивности $L$, соединённых последовательно.</p>'
+ '<p>Если зарядить конденсатор и замкнуть контур, в нём возникнут <b>свободные ЭМ колебания</b> — заряд $q$ на конденсаторе и ток $i$ в катушке будут изменяться периодически.</p>'
+ '<p>Колебательный контур — электрический аналог пружинного маятника:</p>'
+ '<ul>'
+ '<li>$L \\leftrightarrow m$ (индуктивность $\\sim$ масса);</li>'
+ '<li>$1/C \\leftrightarrow k$ (обратная ёмкость $\\sim$ жёсткость);</li>'
+ '<li>$q \\leftrightarrow x$ (заряд $\\sim$ смещение);</li>'
+ '<li>$i \\leftrightarrow v$ (ток $\\sim$ скорость).</li>'
+ '</ul>');
html += makeCard('rule', 'Формула Томсона', '§ 7.2',
'<p>Период свободных ЭМ колебаний в идеальном контуре:</p>'
+ '<p style="text-align:center;margin:8px 0">$$T = 2\\pi\\sqrt{LC}$$</p>'
+ '<p>Это <b>формула Томсона</b> (Уильям Томсон, лорд Кельвин, 1853).</p>'
+ '<p>Циклическая частота: $\\omega = 1/\\sqrt{LC}$. Частота: $\\nu = 1/(2\\pi\\sqrt{LC})$.</p>'
+ '<p>Заряд и ток в контуре:</p>'
+ '<p style="text-align:center;margin:6px 0">$$q(t) = Q_0\\cos(\\omega t), \\quad i(t) = -Q_0\\omega\\sin(\\omega t)$$</p>'
+ '<p>Ток сдвинут по фазе относительно заряда на $\\pi/2$.</p>');
html += makeCard('example', 'Превращения энергии', '§ 7.3',
'<p>Аналогично механическим колебаниям, в LC-контуре энергия переходит:</p>'
+ '<ul>'
+ '<li><b>Электрическое поле конденсатора</b>: $W_C = \\dfrac{q^2}{2C} = \\dfrac{CU^2}{2}$;</li>'
+ '<li><b>Магнитное поле катушки</b>: $W_L = \\dfrac{Li^2}{2}$.</li>'
+ '</ul>'
+ '<p>В идеальном контуре полная энергия сохраняется:</p>'
+ '<p style="text-align:center;margin:6px 0">$$W_C + W_L = \\dfrac{Q_0^2}{2C} = \\text{const}$$</p>'
+ '<p>В момент максимального заряда $W_C = $ max, $W_L = 0$. В момент максимального тока — наоборот.</p>');
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><span class="wg-title">LC-контур в реальном времени</span></div>'
+ '<div class="wg-help">Заряд на пластинах меняет знак, стрелка тока меняет направление. Бары $W_C$ (красный) и $W_L$ (синий) показывают энергии. Двигай $L, C$ — наблюдай период.</div>'
+ '<div class="fx-holder" id="fx-lc"></div>'
+ '<div class="fx-sliders" id="fx-lc-sl"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 2</span><span class="wg-title">Формула Томсона: расчёт $T$ и $\\nu$</span></div>'
+ '<div class="wg-help">$T = 2\\pi\\sqrt{LC}$. Помни: $1$ мГн $= 10^{-3}$ Гн, $1$ мкФ $= 10^{-6}$ Ф. Решено: <b id="i1-calc-score">0</b> / 5.</div>'
+ '<div id="i1-calc-q" style="margin:8px 0"></div><div class="actions"><input class="tinp" id="i1-calc-inp" placeholder="ответ"><button class="btn primary" id="i1-calc-go">Проверить</button></div><div class="feedback" id="i1-calc-fb"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 3</span><span class="wg-title">Аналогии и свойства</span></div>'
+ '<div class="wg-help">Решено: <b id="i1-anal-score">0</b> / 5.</div>'
+ '<div id="i1-anal-q" style="margin:8px 0"></div><div class="opts-row" id="i1-anal-opts"></div><div class="feedback" id="i1-anal-fb"></div></div>';
html += '<div id="boss-1-slot"></div>';
html += readButton('p1');
html += secNavFor('p1');
box.innerHTML = html;
ensureFx(()=>{
const lcEl = document.getElementById('fx-lc');
const lc = new PHYS.LCcircuit(lcEl, {width:480, height:240, L:0.01, C:1e-6});
const slBox = document.getElementById('fx-lc-sl');
const slL = PHYS.util.slider({label:'L (мГн)', min:1, max:100, step:1, value:10, fmt:v=>v.toFixed(0), onChange:v=>lc.setL(v*1e-3)});
const slC = PHYS.util.slider({label:'C (мкФ)', min:0.1, max:10, step:0.1, value:1, fmt:v=>v.toFixed(1), onChange:v=>lc.setC(v*1e-6)});
slBox.innerHTML = slL.html + slC.html;
slL.wire(slBox); slC.wire(slBox);
});
runQuizInput('i1-calc', I1_CALC_ITEMS, 14);
runQuizMC('i1-anal', I1_ANAL_ITEMS, 12);
const bs = loadBossState('boss-1') || { stage:0, solved:false };
makeAndBindBoss('boss-1-slot', '1', BOSS_DEFS.b1, bs,
()=>saveBossState('boss-1', bs),
()=>{ bumpProgress('p1', 40); achievement('p1_done'); });
wireReadBtn('p1');
renderMath(box);
}
/* ===== §8 Переменный ток ===== */
function buildP2(){
const box = document.getElementById('p2-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Генератор переменного тока', '§ 8.1',
'<p><b>Переменный ток</b> — ток, периодически изменяющийся по величине и направлению.</p>'
+ '<p>Получают вращением рамки в однородном магнитном поле. При угле $\\alpha = \\omega t$ ЭДС индукции:</p>'
+ '<p style="text-align:center;margin:6px 0">$$\\varepsilon(t) = \\varepsilon_0\\sin(\\omega t)$$</p>'
+ '<p>где $\\varepsilon_0 = BSN\\omega$ — амплитуда ЭДС ($B$ — индукция, $S$ — площадь рамки, $N$ — число витков).</p>'
+ '<p>Соответственно ток и напряжение в цепи синусоидальны:</p>'
+ '<p style="text-align:center;margin:6px 0">$$i(t) = I_0\\sin(\\omega t), \\quad u(t) = U_0\\sin(\\omega t + \\varphi)$$</p>');
html += makeCard('rule', 'Действующие значения', '§ 8.2',
'<p><b>Действующее значение</b> (среднее квадратичное) переменного тока — значение постоянного тока, который выделяет в той же нагрузке то же количество теплоты за то же время.</p>'
+ '<p style="text-align:center;margin:8px 0">$$I = \\dfrac{I_0}{\\sqrt{2}}, \\quad U = \\dfrac{U_0}{\\sqrt{2}}$$</p>'
+ '<p>На приборах (амперметрах, вольтметрах) показано именно <b>действующее</b> значение.</p>'
+ '<p><b>Бытовая сеть Беларуси:</b> $U = 220$ В (действ.), $\\nu = 50$ Гц.</p>'
+ '<p>Амплитудное напряжение: $U_0 = U\\sqrt{2} \\approx 311$ В.</p>'
+ '<p>Мощность: $P = UI\\cos\\varphi$, где $\\varphi$ — сдвиг фаз. Для чисто активной нагрузки $\\cos\\varphi = 1$, и $P = UI$.</p>');
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><span class="wg-title">Генератор переменного тока — вращение рамки → синусоида</span></div>'
+ '<div class="wg-help">Слева видна вращающаяся рамка в магнитном поле, справа график $U(t)$ — синусоида. Меняй частоту $\\omega$.</div>'
+ '<div class="fx-holder" id="fx-ac"></div>'
+ '<div class="fx-sliders" id="fx-ac-sl"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 2</span><span class="wg-title">Расчёт действующих значений</span></div>'
+ '<div class="wg-help">$I = I_0/\\sqrt{2}$, $U_0 = U\\sqrt{2}$. Решено: <b id="i2-calc-score">0</b> / 5.</div>'
+ '<div id="i2-calc-q" style="margin:8px 0"></div><div class="actions"><input class="tinp" id="i2-calc-inp" placeholder="ответ"><button class="btn primary" id="i2-calc-go">Проверить</button></div><div class="feedback" id="i2-calc-fb"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 3</span><span class="wg-title">Переменный ток: теория</span></div>'
+ '<div class="wg-help">Решено: <b id="i2-th-score">0</b> / 5.</div>'
+ '<div id="i2-th-q" style="margin:8px 0"></div><div class="opts-row" id="i2-th-opts"></div><div class="feedback" id="i2-th-fb"></div></div>';
html += '<div id="boss-2-slot"></div>';
html += readButton('p2');
html += secNavFor('p2');
box.innerHTML = html;
ensureFx(()=>{
const acEl = document.getElementById('fx-ac');
const ac = new PHYS.ACgen(acEl, {width:560, height:240, omega:2*Math.PI, U0:1.0});
const slBox = document.getElementById('fx-ac-sl');
const slW = PHYS.util.slider({label:'ω (рад/с)', min:1, max:12, step:0.5, value:2*Math.PI, fmt:v=>v.toFixed(1), onChange:v=>ac.setOmega(v)});
slBox.innerHTML = slW.html;
slW.wire(slBox);
});
runQuizInput('i2-calc', I2_CALC_ITEMS, 14);
runQuizMC('i2-th', I2_TH_ITEMS, 12);
const bs = loadBossState('boss-2') || { stage:0, solved:false };
makeAndBindBoss('boss-2-slot', '2', BOSS_DEFS.b2, bs,
()=>saveBossState('boss-2', bs),
()=>{ bumpProgress('p2', 40); achievement('p2_done'); });
wireReadBtn('p2');
renderMath(box);
}
/* ===== §9 Трансформатор ===== */
function buildP3(){
const box = document.getElementById('p3-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Устройство трансформатора', '§ 9.1',
'<p><b>Трансформатор</b> — устройство для преобразования переменного напряжения (тока) одной величины в напряжение (ток) другой величины при той же частоте.</p>'
+ '<p>Состоит из:</p>'
+ '<ul>'
+ '<li><b>Сердечника</b> из ферромагнитного материала (для усиления магнитного потока);</li>'
+ '<li><b>Первичной обмотки</b> с $N_1$ витками (вход);</li>'
+ '<li><b>Вторичной обмотки</b> с $N_2$ витками (выход).</li>'
+ '</ul>'
+ '<p>Принцип работы основан на явлении <b>электромагнитной индукции</b>: переменный ток в первичной обмотке создаёт переменный магнитный поток в сердечнике, который наводит ЭДС во вторичной обмотке.</p>');
html += makeCard('rule', 'Коэффициент трансформации', '§ 9.2',
'<p>В идеальном трансформаторе (без потерь):</p>'
+ '<p style="text-align:center;margin:8px 0">$$k = \\dfrac{N_1}{N_2} = \\dfrac{U_1}{U_2}$$</p>'
+ '<p>где $k$ — <b>коэффициент трансформации</b>.</p>'
+ '<ul>'
+ '<li>Если $k > 1$ ($N_1 > N_2$) — <b>понижающий</b> трансформатор ($U_2 < U_1$);</li>'
+ '<li>Если $k < 1$ ($N_1 < N_2$) — <b>повышающий</b> трансформатор ($U_2 > U_1$).</li>'
+ '</ul>'
+ '<p>Из закона сохранения энергии (для идеального трансф.):</p>'
+ '<p style="text-align:center;margin:6px 0">$$P_1 = P_2 \\Rightarrow U_1 I_1 = U_2 I_2 \\Rightarrow \\dfrac{I_2}{I_1} = \\dfrac{N_1}{N_2} = k$$</p>'
+ '<p>То есть если напряжение повышается в $k$ раз, ток уменьшается в $k$ раз (и наоборот).</p>'
+ '<p><b>КПД</b> реального трансформатора: $\\eta = P_2/P_1 \\approx 9599\\%$.</p>');
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><span class="wg-title">Трансформатор — подбери $N_1, N_2, U_1$</span></div>'
+ '<div class="wg-help">Меняй число витков в обмотках и входное напряжение — $U_2$ пересчитывается мгновенно. Внизу показано: повышающий или понижающий.</div>'
+ '<div class="fx-holder" id="fx-tr"></div>'
+ '<div class="fx-sliders" id="fx-tr-sl"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 2</span><span class="wg-title">Расчёт $U_2, I_2, k$</span></div>'
+ '<div class="wg-help">Используй $k = N_1/N_2 = U_1/U_2$ и $I_2/I_1 = k$. Решено: <b id="i3-calc-score">0</b> / 5.</div>'
+ '<div id="i3-calc-q" style="margin:8px 0"></div><div class="actions"><input class="tinp" id="i3-calc-inp" placeholder="ответ"><button class="btn primary" id="i3-calc-go">Проверить</button></div><div class="feedback" id="i3-calc-fb"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 3</span><span class="wg-title">Повышающий или понижающий?</span></div>'
+ '<div class="wg-help">Решено: <b id="i3-type-score">0</b> / 5.</div>'
+ '<div id="i3-type-q" style="margin:8px 0"></div><div class="opts-row" id="i3-type-opts"></div><div class="feedback" id="i3-type-fb"></div></div>';
html += '<div id="boss-3-slot"></div>';
html += readButton('p3');
html += secNavFor('p3');
box.innerHTML = html;
ensureFx(()=>{
const trEl = document.getElementById('fx-tr');
const tr = new PHYS.Transformer(trEl, {width:520, height:240, N1:200, N2:50, U1:220});
const slBox = document.getElementById('fx-tr-sl');
const slN1 = PHYS.util.slider({label:'N₁ (витков)', min:50, max:1000, step:10, value:200, fmt:v=>v.toFixed(0), onChange:v=>tr.setN1(v)});
const slN2 = PHYS.util.slider({label:'N₂ (витков)', min:10, max:1000, step:10, value:50, fmt:v=>v.toFixed(0), onChange:v=>tr.setN2(v)});
const slU1 = PHYS.util.slider({label:'U₁ (В)', min:12, max:10000, step:10, value:220, fmt:v=>v.toFixed(0), onChange:v=>tr.setU1(v)});
slBox.innerHTML = slN1.html + slN2.html + slU1.html;
slN1.wire(slBox); slN2.wire(slBox); slU1.wire(slBox);
});
runQuizInput('i3-calc', I3_CALC_ITEMS, 14);
runQuizMC('i3-type', I3_TYPE_ITEMS, 12);
const bs = loadBossState('boss-3') || { stage:0, solved:false };
makeAndBindBoss('boss-3-slot', '3', BOSS_DEFS.b3, bs,
()=>saveBossState('boss-3', bs),
()=>{ bumpProgress('p3', 40); achievement('p3_done'); });
wireReadBtn('p3');
renderMath(box);
}
/* ===== Stubs §10-§13, Final ===== */
function buildStubP(id, label, message){
const box = document.getElementById(id + '-body'); if(!box) return;
let html = '<div class="stub-note"><h3>' + label + ' — в разработке</h3><p>' + message + '</p></div>';
html += secNavFor(id);
box.innerHTML = html;
renderMath(box);
}
/* ===== Boss state ===== */
function loadBossState(key){ try{ return JSON.parse(localStorage.getItem('physics11_ch2_'+key)||'null'); }catch(e){ return null; } }
function saveBossState(key, state){ try{ localStorage.setItem('physics11_ch2_'+key, JSON.stringify(state)); }catch(e){} }
/* ===== Quiz engines ===== */
function runQuizMC(id, items, xpReward){
const state = JSON.parse(localStorage.getItem('physics11_ch2_quiz_'+id)||'null') || { idx:0, solved:0, awarded:false };
const qEl = document.getElementById(id+'-q');
const optsEl = document.getElementById(id+'-opts');
const fbEl = document.getElementById(id+'-fb');
const scoreEl = document.getElementById(id+'-score');
function save(){ localStorage.setItem('physics11_ch2_quiz_'+id, JSON.stringify(state)); }
function render(){
if(state.solved >= items.length){
qEl.innerHTML = '<b style="color:var(--ok)">Все задания решены!</b> +'+xpReward+' XP.';
optsEl.innerHTML = ''; fbEl.style.display='none';
if(scoreEl) scoreEl.textContent = state.solved;
if(!state.awarded){ state.awarded = true; save(); addXp(xpReward, 'quiz-'+id); }
return;
}
const it = items[state.idx % items.length];
qEl.innerHTML = it.q; optsEl.innerHTML = ''; fbEl.style.display='none';
if(scoreEl) scoreEl.textContent = state.solved;
it.opts.forEach((o,i)=>{
const b = document.createElement('button'); b.className = 'opt-btn'; b.innerHTML = o;
b.addEventListener('click', ()=>{
if(i === it.correct){
b.classList.add('correct'); state.solved++; state.idx++; save();
if(scoreEl) scoreEl.textContent = state.solved;
fbEl.className='feedback ok'; fbEl.innerHTML='&#10003; Верно. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl);
setTimeout(render, 850);
} else {
b.classList.add('wrong');
fbEl.className='feedback fail'; fbEl.innerHTML='&#10007; Не так. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl);
}
});
optsEl.appendChild(b);
});
renderMath(qEl);
}
render();
}
function runQuizInput(id, items, xpReward){
const state = JSON.parse(localStorage.getItem('physics11_ch2_quiz_'+id)||'null') || { idx:0, solved:0, awarded:false };
const qEl = document.getElementById(id+'-q');
const inp = document.getElementById(id+'-inp');
const go = document.getElementById(id+'-go');
const fbEl = document.getElementById(id+'-fb');
const scoreEl = document.getElementById(id+'-score');
function save(){ localStorage.setItem('physics11_ch2_quiz_'+id, JSON.stringify(state)); }
function render(){
if(state.solved >= items.length){
qEl.innerHTML = '<b style="color:var(--ok)">Все задания решены!</b> +'+xpReward+' XP.';
inp.value=''; inp.disabled=true; go.disabled=true;
if(scoreEl) scoreEl.textContent = state.solved;
if(!state.awarded){ state.awarded = true; save(); addXp(xpReward, 'quiz-'+id); }
return;
}
const it = items[state.idx % items.length];
qEl.innerHTML = it.q; inp.value=''; inp.disabled=false; go.disabled=false; fbEl.style.display='none';
if(scoreEl) scoreEl.textContent = state.solved;
renderMath(qEl);
}
function check(){
const it = items[state.idx % items.length];
const v = normalizeAns(inp.value);
const ans = Array.isArray(it.answer) ? it.answer.map(normalizeAns) : [normalizeAns(it.answer)];
if(ans.indexOf(v) >= 0){
state.solved++; state.idx++; save();
if(scoreEl) scoreEl.textContent = state.solved;
fbEl.className='feedback ok'; fbEl.innerHTML='&#10003; Верно. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl);
setTimeout(render, 850);
} else {
fbEl.className='feedback fail'; fbEl.innerHTML='&#10007; Не так. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl);
}
}
go.addEventListener('click', check);
inp.addEventListener('keydown', e=>{ if(e.key==='Enter'){ e.preventDefault(); check(); } });
render();
}
/* ===== Quiz items ===== */
const I1_CALC_ITEMS = [
{ q:'$L = 10$ мГн, $C = 10$ мкФ. $T$ (мс)?', answer:['2','2.0','1.99'], explain:'$T = 2\\pi\\sqrt{0{,}01 \\cdot 10^{-5}} \\approx 2 \\cdot 10^{-3}$ с = 2 мс.' },
{ q:'$L = 1$ мГн, $C = 1$ нФ. $T$ (мкс)?', answer:['6.28','6.3','2π'], explain:'$T = 2\\pi\\sqrt{10^{-3} \\cdot 10^{-9}} = 2\\pi \\cdot 10^{-6}$ с ≈ 6,28 мкс.' },
{ q:'$L = 4$ мГн, $C = 1$ мкФ. $\\nu$ (Гц), округли до целого:', answer:['2516','2500','2517'], explain:'$\\nu = 1/(2\\pi\\sqrt{4 \\cdot 10^{-9}}) \\approx 2516$ Гц.' },
{ q:'$T = 1$ мс. Если увеличить $C$ в 4 раза, $T$ станет (мс):', answer:'2', explain:'$T \\propto \\sqrt{C}$, $\\sqrt{4} = 2$.' },
{ q:'$L = 2$ мГн, $C = 50$ нФ. $\\omega$ (рад/с), округли до тысяч:', answer:['100000','99000'], explain:'$\\omega = 1/\\sqrt{LC} = 1/\\sqrt{10^{-10}} = 10^5$ рад/с.' }
];
const I1_ANAL_ITEMS = [
{ q:'Электрический аналог массы $m$ в LC-контуре:', opts:['$C$','$L$','$q$','$U$'], correct:1, explain:'$L \\leftrightarrow m$.' },
{ q:'Электрический аналог жёсткости $k$:', opts:['$L$','$1/C$','$C$','$1/L$'], correct:1, explain:'$1/C \\leftrightarrow k$.' },
{ q:'Когда заряд максимален ($q = Q_0$), ток в катушке:', opts:['Максимален','Нулевой','$I_0/2$','Отрицателен'], correct:1, explain:'Аналогия: в крайней точке скорость = 0.' },
{ q:'В идеальном контуре энергия:', opts:['Растёт','Затухает','Сохраняется','Колеблется по модулю'], correct:2, explain:'$W_C + W_L = $ const.' },
{ q:'Если $L$ увеличить в 4 раза, период:', opts:['Увеличится в 4','Увеличится в 2','Уменьшится в 2','Не изменится'], correct:1, explain:'$T \\propto \\sqrt{L}$, $\\sqrt{4} = 2$.' }
];
const I2_CALC_ITEMS = [
{ q:'$I_0 = 10$ А. Действ. $I$ (А)?', answer:['7.07','7.1','5√2'], explain:'$I = 10/\\sqrt{2} \\approx 7{,}07$ А.' },
{ q:'$U = 220$ В. Амплитудное $U_0$ (В), округли до целого:', answer:['311','310'], explain:'$U_0 = 220\\sqrt{2} \\approx 311$ В.' },
{ q:'$I = 5$ А (действ.). $I_0$ (А), округли до десятых:', answer:['7.07','7.1','7'], explain:'$I_0 = 5\\sqrt{2} \\approx 7{,}07$ А.' },
{ q:'Сеть Беларуси: $\\nu$ (Гц)?', answer:'50', explain:'50 Гц.' },
{ q:'Активная нагрузка: $U = 220$ В, $I = 4$ А. $P$ (Вт)?', answer:'880', explain:'$P = UI = 880$ Вт.' }
];
const I2_TH_ITEMS = [
{ q:'Действ. значение тока — это:', opts:['Амплитуда','Среднее за период','Эквивалентный постоянный (по теплу)','Минимум'], correct:2, explain:'Производит ту же теплоту, что и постоянный того же значения.' },
{ q:'Связь $I$ и $I_0$:', opts:['$I = I_0$','$I = I_0\\sqrt{2}$','$I = I_0/\\sqrt{2}$','$I = I_0^2$'], correct:2, explain:'$I = I_0/\\sqrt{2}$.' },
{ q:'Сеть «220 В, 50 Гц» — 220 это:', opts:['$U_0$','Действ. $U$','Среднее','Max за минуту'], correct:1, explain:'Действующее значение.' },
{ q:'Что показывает бытовой вольтметр?', opts:['$U_0$','Действ. $U$','Мгновенное','Среднее'], correct:1, explain:'Действующее.' },
{ q:'Период промышленного тока в РБ:', opts:['$1$ с','$0{,}02$ с','$0{,}5$ с','$0{,}1$ с'], correct:1, explain:'$T = 1/50 = 0{,}02$ с.' }
];
const I3_CALC_ITEMS = [
{ q:'$N_1 = 1000$, $N_2 = 100$, $U_1 = 220$ В. $U_2$ (В)?', answer:'22', explain:'$U_2 = U_1 \\cdot N_2/N_1 = 220/10 = 22$ В.' },
{ q:'$N_1 = 200$, $N_2 = 800$, $U_1 = 110$ В. $U_2$ (В)?', answer:'440', explain:'$U_2 = 110 \\cdot 4 = 440$ В.' },
{ q:'$N_1 = 500$, $N_2 = 50$. $k$?', answer:'10', explain:'$k = 500/50 = 10$.' },
{ q:'$I_1 = 2$ А, $k = 5$. $I_2$ (А)?', answer:'10', explain:'$I_2 = I_1 \\cdot k = 2 \\cdot 5 = 10$ А (повышающий).' },
{ q:'$U_1 = 6000$ В, $U_2 = 220$ В. $k$?', answer:['27.27','27','27.3'], explain:'$k = 6000/220 \\approx 27{,}3$.' }
];
const I3_TYPE_ITEMS = [
{ q:'$N_1 = 100$, $N_2 = 1000$. Тип:', opts:['Повышающий','Понижающий','Не работает','Равный'], correct:0, explain:'$N_2 > N_1 \\Rightarrow U_2 > U_1$ — повышающий.' },
{ q:'$k = 50$. Тип:', opts:['Повышающий','Понижающий','Идеальный'], correct:1, explain:'$k > 1 \\Rightarrow U_2 < U_1$ — понижающий.' },
{ q:'ЛЭП: с электростанции — 500 кВ, бытовая сеть — 220 В. Сколько раз понижаем?', opts:['$\\approx 2273$','$\\approx 230$','$\\approx 23$','$\\approx 1000$'], correct:0, explain:'$500000/220 \\approx 2273$.' },
{ q:'Зарядка телефона: 220 В → 5 В. Тип:', opts:['Повышающий','Понижающий'], correct:1, explain:'Напряжение понижается.' },
{ q:'Сварочный аппарат: большой ток при низком напряжении. Тип:', opts:['Повышающий','Понижающий'], correct:1, explain:'Низкое $U$, высокий $I$ — понижающий (ток повышается, напр. снижается).' }
];
/* ===== Boss defs ===== */
const BOSS_DEFS = {
b1: { title:'Босс §7 — LC-контур', tag:'§7', xp:70, stages:[
{ q:'$T = 2\\pi\\sqrt{?}$ — формула Томсона. Что под корнем?', type:'mc', opts:['$L+C$','$LC$','$L/C$','$L^2 C^2$'], correct:1, explain:'$T = 2\\pi\\sqrt{LC}$.' },
{ q:'$L = 100$ мГн, $C = 10$ мкФ. $T$ (мс)?', type:'input', a:['6.28','6.3','2π'], explain:'$T = 2\\pi\\sqrt{10^{-6}} = 2\\pi$ мс ≈ 6,28 мс.' },
{ q:'Электр. аналог массы $m$:', type:'mc', opts:['$C$','$L$','$q$','$R$'], correct:1, explain:'$L$.' },
{ q:'При $q = Q_0$ ток:', type:'mc', opts:['Max','0','Среднее','$I_0/2$'], correct:1, explain:'Аналог: в крайней точке $v=0$.' },
{ q:'Увеличить $C$ в 9 раз. $T$ изменится в:', type:'input', a:'3', explain:'$\\sqrt{9} = 3$ раза.' }
]},
b2: { title:'Босс §8 — Переменный ток', tag:'§8', xp:70, stages:[
{ q:'$U = 220$ В. $U_0$ (В) (округли до целого):', type:'input', a:['311','310'], explain:'$U_0 = 220\\sqrt{2} \\approx 311$ В.' },
{ q:'Связь $I$ и $I_0$:', type:'mc', opts:['$I = I_0$','$I = I_0\\sqrt{2}$','$I = I_0/\\sqrt{2}$','$I = 2I_0$'], correct:2, explain:'$I = I_0/\\sqrt{2}$.' },
{ q:'Что показывает бытовой амперметр?', type:'mc', opts:['$I_0$','Действ. $I$','Мгн. $i$','Среднее $i$'], correct:1, explain:'Действующее.' },
{ q:'Период бел. сети 50 Гц (мс)?', type:'input', a:'20', explain:'$T = 1/50 = 0{,}02$ с = 20 мс.' },
{ q:'$U = 110$ В, $I = 3$ А, активная нагр. $P$ (Вт)?', type:'input', a:'330', explain:'$P = UI = 330$ Вт.' }
]},
b3: { title:'Босс §9 — Трансформатор', tag:'§9', xp:70, stages:[
{ q:'$N_1 = 800$, $N_2 = 100$, $U_1 = 240$ В. $U_2$ (В)?', type:'input', a:'30', explain:'$U_2 = 240/8 = 30$ В.' },
{ q:'$k > 1$ это:', type:'mc', opts:['Повышающий','Понижающий','Идеальный','Не работает'], correct:1, explain:'$U_2 < U_1$ — понижающий.' },
{ q:'$I_1 = 0{,}5$ А, $k = 10$ (повышающий: $U$ растёт). $I_2$ (А)?', type:'input', a:'0.05', explain:'$I_2 = I_1/k = 0{,}05$ А.' },
{ q:'Принцип работы трансформатора:', type:'mc', opts:['Закон Ома','Эл-магн. индукция','Сила Ампера','Эл-статика'], correct:1, explain:'ЭМ индукция Фарадея.' },
{ q:'Зачем сердечник?', type:'mc', opts:['Усиление магн. потока','Питание','Охлаждение','Изоляция'], correct:0, explain:'Концентрирует магнитный поток.' }
]}
};
/* ===== Init ===== */
function init(){
loadProgress();
initTheme();
buildParaSelector();
goTo('p1');
refreshProgressUI();
if(!STATE.achievements.has('start')) achievement('start');
}
if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
else init();
</script>
</body>
</html>