Files
Learn_System/frontend/textbooks/physics_11_ch2.html
T
Maxim Dolgolyov e192feefcc feat(phys11 W4): Глава 2 §10-§13 + Финал главы 2
§10 Производство и передача электроэнергии:
- ТЭС/ГЭС/АЭС; формула потерь P=I²R
- Идея высоковольтных ЛЭП: чтобы уменьшить потери, повышают U
- Магистральные ЛЭП до 750 кВ → 220 В у потребителя
- 5 расчётов (включая повышение U в k раз → потери /k²)
- Босс §10: 5 этапов, +70 XP

§11 Экологические проблемы:
- ВИЭ: ВЭС, СЭС, ГеоТЭС, приливные, биогаз
- Достоинства (без CO₂) и недостатки (погода, площадь)
- 6+5 квизов на типы и плюсы/минусы
- Босс §11: 5 этапов, +70 XP

§12 ЭМ волны. Шкала ЭМ волн:
- ЭМ волна как поперечная, c = 1/√(ε₀μ₀) = 3·10⁸ м/с
- Inline SVG-шкала: радио/СВЧ/ИК/видимый/УФ/рентген/γ
  с радужным градиентом для видимого света
- 5 расчётов λ↔ν + 5 MC на диапазоны
- Босс §12: 5 этапов, +70 XP

§13 Действие ЭМ на живые организмы:
- Ионизирующее (>10 эВ: УФ-С, рентген, γ) vs неионизирующее
- Полезные применения и опасности
- Защита: экранирование (свинец), расстояние, время
- Босс §13: 5 этапов, +65 XP

Финал главы 2:
- 4 интегральных босса (LC+ток, трансф+ЛЭП, ЭМ волны, сборная)
- Celebration: ачивка phys11_ch2_master + 100 XP бонус

Файл 63 → 91 КБ. JS валидируется.
2026-05-29 18:25:30 +03:00

1326 lines
103 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:'$P = I^2 R$', built:true },
{ id:'p5', num:'§ 11', name:'Эко-проблемы', sub:'ВЭС, СЭС, гео-', built:true },
{ id:'p6', num:'§ 12', name:'Шкала ЭМ волн', sub:'$c = 3 \\cdot 10^8$ м/с', built:true },
{ id:'p7', num:'§ 13', name:'ЭМ и живые орг.', sub:'Ионизир. vs нет', built:true },
{ id:'final', num:'★', name:'Финал главы', sub:'4 интегр. босса', final:true, built:true }
];
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:()=>buildP4(), p5:()=>buildP5(), p6:()=>buildP6(), p7:()=>buildP7(),
final:()=>buildFinal()
};
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:[['Потери','$P_{пот} = I^2 R$'],['Идея','$U$ ↑, $I$ ↓ ⇒ потери ↓'],['ЛЭП','220-750 кВ'],['Потребитель','220 В'],['ГЭС/ТЭС/АЭС','3 типа станций']]},
p5:{title:'Шпаргалка § 11', rows:[['ВЭС','ветер'],['СЭС','солнце'],['ГеоТЭС','подземное тепло'],['Приливные','Луна'],['Биогаз','органика']]},
p6:{title:'Шпаргалка § 12', rows:[['Скорость в вакууме','$c = 3 \\cdot 10^8$ м/с'],['ЭМ волна','поперечная'],['Радио','$\\lambda$: км м'],['Видим. свет','380760 нм'],['γ-лучи','$\\lambda < 0{,}01$ нм'],['$c = \\lambda\\nu$','связь']]},
p7:{title:'Шпаргалка § 13', rows:[['Неионизирующее','радио, СВЧ, видим.'],['Ионизирующее','УФ, рентген, γ'],['Тепловое','СВЧ-печь'],['Защита','экранирование, расстояние']]},
final:{title:'Финал главы 2', rows:[['§ 7-§ 13','Все темы'],['Боссов','4 интегрированных'],['Награда','+100 XP + ачивка ch2_done']]}
};
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 — главная идея: чтобы уменьшить потери $P = I^2R$ в ЛЭП, повышают $U$ и понижают $I$ через трансформаторы.'},
{sec:'p5',html:'§ 11 — ВИЭ: солнце, ветер, геотермальная энергия, приливы. Меньше выбросов CO₂, но зависят от погоды.'},
{sec:'p6',html:'§ 12 — кликай по шкале! Связь: $c = \\lambda\\nu = 3 \\cdot 10^8$ м/с. От длинных радиоволн до сверхкоротких γ.'},
{sec:'p7',html:'§ 13 — ионизирующее излучение (УФ-С, рентген, γ) опасно для ДНК. Защита: толща материала и расстояние.'},
{sec:'final',html:'Финал главы 2 — 4 интегральных босса на все темы (контур, ток, трансф., ЛЭП, ЭМ волны). +100 XP + ачивка ch2_done.'}
];
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);
}
/* ===== §10 Передача электроэнергии ===== */
function buildP4(){
const box = document.getElementById('p4-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Производство электроэнергии', '§ 10.1',
'<p>Основные типы электростанций:</p>'
+ '<ul>'
+ '<li><b>ТЭС</b> (тепловые) — сжигают уголь, газ, мазут; КПД 35-40%.</li>'
+ '<li><b>ГЭС</b> (гидроэлектростанции) — используют падение воды; КПД 90-95%.</li>'
+ '<li><b>АЭС</b> (атомные) — энергия деления ядер $^{235}$U; КПД ~30%.</li>'
+ '</ul>'
+ '<p>В Беларуси основные источники: ТЭС, АЭС (Островецкая АЭС с 2020 г.), частично ГЭС и ВИЭ.</p>');
html += makeCard('rule', 'Передача и потери', '§ 10.2',
'<p>Электроэнергия от электростанции до потребителя проходит через линии электропередач (<b>ЛЭП</b>).</p>'
+ '<p>В проводах ЛЭП выделяется тепло за счёт сопротивления — <b>потери мощности</b>:</p>'
+ '<p style="text-align:center;margin:8px 0">$$P_{пот} = I^2 R$$</p>'
+ '<p>где $R$ — сопротивление линии, $I$ — ток.</p>'
+ '<p>Чтобы уменьшить потери при заданной передаваемой мощности $P = UI$:</p>'
+ '<ul>'
+ '<li>Передавать при <b>высоком напряжении</b> $U$ — тогда ток $I$ мал.</li>'
+ '<li>На электростанции — повышающий трансформатор: $220$ В → $110$$750$ кВ.</li>'
+ '<li>У потребителя — понижающий: $750$ кВ → $220$ В.</li>'
+ '</ul>'
+ '<p>В магистральных ЛЭП напряжение достигает $\\mathbf{750}$ <b>кВ</b>!</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">$P_{пот} = I^2 R$, $I = P/U$ (где $P$ — передаваемая мощность). Решено: <b id="i4-calc-score">0</b> / 5.</div>'
+ '<div id="i4-calc-q" style="margin:8px 0"></div><div class="actions"><input class="tinp" id="i4-calc-inp" placeholder="ответ"><button class="btn primary" id="i4-calc-go">Проверить</button></div><div class="feedback" id="i4-calc-fb"></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">Решено: <b id="i4-type-score">0</b> / 5.</div>'
+ '<div id="i4-type-q" style="margin:8px 0"></div><div class="opts-row" id="i4-type-opts"></div><div class="feedback" id="i4-type-fb"></div></div>';
html += '<div id="boss-4-slot"></div>';
html += readButton('p4');
html += secNavFor('p4');
box.innerHTML = html;
runQuizInput('i4-calc', I4_CALC_ITEMS, 14);
runQuizMC('i4-type', I4_TYPE_ITEMS, 12);
const bs = loadBossState('boss-4') || { stage:0, solved:false };
makeAndBindBoss('boss-4-slot', '4', BOSS_DEFS.b4, bs,
()=>saveBossState('boss-4', bs),
()=>{ bumpProgress('p4', 40); achievement('p4_done'); });
wireReadBtn('p4');
renderMath(box);
}
/* ===== §11 Экологические проблемы ===== */
function buildP5(){
const box = document.getElementById('p5-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Возобновляемые источники энергии (ВИЭ)', '§ 11.1',
'<p>Традиционные ТЭС и АЭС связаны с экологическими проблемами:</p>'
+ '<ul>'
+ '<li>ТЭС — выбросы CO₂, SO₂, NOₓ; парниковый эффект, кислотные дожди.</li>'
+ '<li>АЭС — радиоактивные отходы; риск аварий (Чернобыль, Фукусима).</li>'
+ '</ul>'
+ '<p><b>Альтернатива — ВИЭ:</b></p>'
+ '<ul>'
+ '<li><b>ВЭС</b> (ветровые) — кинетическая энергия ветра вращает турбины.</li>'
+ '<li><b>СЭС</b> (солнечные) — фотоэлектрические панели преобразуют свет в ток.</li>'
+ '<li><b>ГеоТЭС</b> — тепло из недр Земли (вулканические регионы).</li>'
+ '<li><b>Приливные</b> — энергия движения воды Луной.</li>'
+ '<li><b>Биогаз</b> — сжигание метана из органических отходов.</li>'
+ '</ul>'
+ '<p>В Беларуси доля ВИЭ растёт, активно развиваются СЭС и ВЭС, биогазовые установки.</p>');
html += makeCard('rule', 'Достоинства и недостатки ВИЭ', '§ 11.2',
'<p><b>Достоинства:</b></p>'
+ '<ul>'
+ '<li>Не истощаются (возобновляются природой);</li>'
+ '<li>Не выбрасывают CO₂ при работе;</li>'
+ '<li>Не образуют радиоактивных отходов.</li>'
+ '</ul>'
+ '<p><b>Недостатки:</b></p>'
+ '<ul>'
+ '<li>Зависят от погоды и времени суток (солнце, ветер);</li>'
+ '<li>Низкая удельная мощность ⇒ большие площади;</li>'
+ '<li>Не подходят для всех регионов (геотермальная, приливные);</li>'
+ '<li>Производство панелей/турбин сейчас энергозатратно.</li>'
+ '</ul>');
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 1</span><span class="wg-title">Тип станции</span></div>'
+ '<div class="wg-help">Решено: <b id="i5-type-score">0</b> / 6.</div>'
+ '<div id="i5-type-q" style="margin:8px 0"></div><div class="opts-row" id="i5-type-opts"></div><div class="feedback" id="i5-type-fb"></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">Решено: <b id="i5-pro-score">0</b> / 5.</div>'
+ '<div id="i5-pro-q" style="margin:8px 0"></div><div class="opts-row" id="i5-pro-opts"></div><div class="feedback" id="i5-pro-fb"></div></div>';
html += '<div id="boss-5-slot"></div>';
html += readButton('p5');
html += secNavFor('p5');
box.innerHTML = html;
runQuizMC('i5-type', I5_TYPE_ITEMS, 12);
runQuizMC('i5-pro', I5_PRO_ITEMS, 10);
const bs = loadBossState('boss-5') || { stage:0, solved:false };
makeAndBindBoss('boss-5-slot', '5', BOSS_DEFS.b5, bs,
()=>saveBossState('boss-5', bs),
()=>{ bumpProgress('p5', 40); achievement('p5_done'); });
wireReadBtn('p5');
renderMath(box);
}
/* ===== §12 Шкала ЭМ волн ===== */
function buildP6(){
const box = document.getElementById('p6-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Электромагнитные волны', '§ 12.1',
'<p><b>Электромагнитная волна</b> — распространение в пространстве переменных электрического и магнитного полей.</p>'
+ '<p>Существование ЭМ волн предсказал <b>Максвелл</b> (1864), экспериментально открыл <b>Герц</b> (1888).</p>'
+ '<p>ЭМ волны <b>поперечные</b>: векторы $\\vec{E}$ и $\\vec{B}$ колеблются $\\perp$ друг другу и $\\perp$ направлению распространения.</p>'
+ '<p>Скорость в вакууме: $c = 3 \\cdot 10^8$ м/с — мировая константа.</p>'
+ '<p style="text-align:center;margin:8px 0">$$c = \\lambda\\nu = \\dfrac{1}{\\sqrt{\\varepsilon_0\\mu_0}}$$</p>');
html += makeCard('rule', 'Шкала ЭМ волн', '§ 12.2',
'<p>В зависимости от частоты (длины волны) ЭМ волны делят на диапазоны:</p>'
+ '<ul style="font-family:JetBrains Mono,monospace;font-size:.86rem">'
+ '<li><b>Радиоволны</b>: $\\lambda$ от км до м, $\\nu$ до $10^{11}$ Гц. Связь, ТВ.</li>'
+ '<li><b>СВЧ</b> (микроволны): $\\lambda$ ≈ 1 м 1 мм. Радары, СВЧ-печи, сотовая связь.</li>'
+ '<li><b>Инфракрасное</b> (ИК): $\\lambda$ ≈ 1 мм 0,76 мкм. Тепловое излучение.</li>'
+ '<li><b>Видимый свет</b>: $\\lambda$ ≈ 760 380 нм. От красного до фиолетового.</li>'
+ '<li><b>УФ</b>: $\\lambda$ ≈ 380 10 нм. Загар, бактерицидные лампы.</li>'
+ '<li><b>Рентгеновское</b>: $\\lambda$ ≈ 10 0,01 нм. Медицина, кристаллография.</li>'
+ '<li><b>γ-излучение</b>: $\\lambda < 0{,}01$ нм. Ядерные превращения.</li>'
+ '</ul>');
/* Inline simple spectrum SVG */
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Шкала</span><span class="wg-title">Шкала ЭМ волн (от радио до γ)</span></div>'
+ '<div class="wg-help">Чем правее — тем выше частота и меньше длина волны. Видимый свет занимает крошечную полоску в центре!</div>'
+ '<div style="text-align:center;margin:10px 0">' + buildSpectrumSVG() + '</div>'
+ '</div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. 1</span><span class="wg-title">Расчёт $\\lambda, \\nu, c$</span></div>'
+ '<div class="wg-help">$c = \\lambda\\nu$. $c = 3 \\cdot 10^8$ м/с. Решено: <b id="i6-calc-score">0</b> / 5.</div>'
+ '<div id="i6-calc-q" style="margin:8px 0"></div><div class="actions"><input class="tinp" id="i6-calc-inp" placeholder="ответ"><button class="btn primary" id="i6-calc-go">Проверить</button></div><div class="feedback" id="i6-calc-fb"></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">Решено: <b id="i6-rng-score">0</b> / 5.</div>'
+ '<div id="i6-rng-q" style="margin:8px 0"></div><div class="opts-row" id="i6-rng-opts"></div><div class="feedback" id="i6-rng-fb"></div></div>';
html += '<div id="boss-6-slot"></div>';
html += readButton('p6');
html += secNavFor('p6');
box.innerHTML = html;
runQuizInput('i6-calc', I6_CALC_ITEMS, 14);
runQuizMC('i6-rng', I6_RNG_ITEMS, 12);
const bs = loadBossState('boss-6') || { stage:0, solved:false };
makeAndBindBoss('boss-6-slot', '6', BOSS_DEFS.b6, bs,
()=>saveBossState('boss-6', bs),
()=>{ bumpProgress('p6', 40); achievement('p6_done'); });
wireReadBtn('p6');
renderMath(box);
}
function buildSpectrumSVG(){
const W = 640, H = 110;
/* Бары для каждого диапазона */
const bands = [
{ name:'Радио', x:0, w:80, color:'#1e40af', sub:'10⁻³ 10¹¹ Гц' },
{ name:'СВЧ', x:80, w:80, color:'#2563eb', sub:'10⁹ 10¹² Гц' },
{ name:'ИК', x:160, w:90, color:'#dc2626', sub:'10¹² 10¹⁴ Гц' },
{ name:'Видимый', x:250, w:60, color:'rainbow', sub:'10¹⁴ 10¹⁵' },
{ name:'УФ', x:310, w:80, color:'#7c3aed', sub:'10¹⁵ 10¹⁷' },
{ name:'Рентген', x:390, w:110, color:'#6b21a8', sub:'10¹⁷ 10¹⁹' },
{ name:'γ', x:500, w:140, color:'#1e1b4b', sub:'> 10¹⁹ Гц' }
];
let svg = '<svg viewBox="0 0 ' + W + ' ' + H + '" style="width:100%;max-width:640px;height:auto;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px">';
svg += '<defs><linearGradient id="rainbow" x1="0" y1="0" x2="1" y2="0">'
+ '<stop offset="0%" stop-color="#dc2626"/>'
+ '<stop offset="20%" stop-color="#f59e0b"/>'
+ '<stop offset="40%" stop-color="#facc15"/>'
+ '<stop offset="55%" stop-color="#22c55e"/>'
+ '<stop offset="75%" stop-color="#0891b2"/>'
+ '<stop offset="100%" stop-color="#7c3aed"/>'
+ '</linearGradient></defs>';
bands.forEach(b => {
const fill = b.color === 'rainbow' ? 'url(#rainbow)' : b.color;
svg += '<rect x="' + b.x + '" y="20" width="' + b.w + '" height="40" fill="' + fill + '"/>';
svg += '<text x="' + (b.x + b.w/2) + '" y="46" text-anchor="middle" font-family="Outfit,sans-serif" font-size="13" font-weight="800" fill="#fff">' + b.name + '</text>';
svg += '<text x="' + (b.x + b.w/2) + '" y="76" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="9" fill="#64748b">' + b.sub + '</text>';
});
/* Подписи концов */
svg += '<text x="6" y="14" font-family="JetBrains Mono,monospace" font-size="11" fill="#475569">← Большая λ (низкая ν)</text>';
svg += '<text x="' + (W - 6) + '" y="14" text-anchor="end" font-family="JetBrains Mono,monospace" font-size="11" fill="#475569">Малая λ (высокая ν) →</text>';
svg += '<text x="' + (W/2) + '" y="102" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="10" fill="#64748b">все распространяются со скоростью c = 3 · 10⁸ м/с</text>';
svg += '</svg>';
return svg;
}
/* ===== §13 Действие ЭМ на живые организмы ===== */
function buildP7(){
const box = document.getElementById('p7-body'); if(!box) return;
let html = '';
html += makeCard('theory', 'Ионизирующее и неионизирующее излучения', '§ 13.1',
'<p>По способности ионизировать атомы среды ЭМ излучение делят на:</p>'
+ '<ul>'
+ '<li><b>Неионизирующее</b> — низкие энергии квантов ($E = h\\nu < 10$ эВ): радио, СВЧ, ИК, видимый свет, ближний УФ. Может вызвать нагрев.</li>'
+ '<li><b>Ионизирующее</b> — высокие энергии ($E > 10$ эВ): жёсткий УФ, рентген, γ-излучение. Способно «выбивать» электроны из атомов и повреждать ДНК.</li>'
+ '</ul>'
+ '<p>Энергия фотона: $E = h\\nu = hc/\\lambda$, где $h = 6{,}63 \\cdot 10^{-34}$ Дж·с.</p>');
html += makeCard('rule', 'Биологическое действие', '§ 13.2',
'<p><b>Полезные применения:</b></p>'
+ '<ul>'
+ '<li>УФ-С — стерилизация (убивает бактерии);</li>'
+ '<li>УФ-В — образование витамина D в коже;</li>'
+ '<li>ИК — прогревание, физиотерапия;</li>'
+ '<li>Рентген — диагностика (флюорография);</li>'
+ '<li>γ — лучевая терапия онкозаболеваний.</li>'
+ '</ul>'
+ '<p><b>Опасные эффекты:</b></p>'
+ '<ul>'
+ '<li>УФ-А, УФ-В — солнечные ожоги, рак кожи;</li>'
+ '<li>СВЧ — нагрев тканей (особенно глаз);</li>'
+ '<li>Рентген и γ — повреждение ДНК, мутации, лучевая болезнь.</li>'
+ '</ul>'
+ '<p><b>Защита:</b> экранирование (свинец для γ), увеличение расстояния, ограничение времени воздействия.</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">Решено: <b id="i7-ion-score">0</b> / 5.</div>'
+ '<div id="i7-ion-q" style="margin:8px 0"></div><div class="opts-row" id="i7-ion-opts"></div><div class="feedback" id="i7-ion-fb"></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">Решено: <b id="i7-use-score">0</b> / 5.</div>'
+ '<div id="i7-use-q" style="margin:8px 0"></div><div class="opts-row" id="i7-use-opts"></div><div class="feedback" id="i7-use-fb"></div></div>';
html += '<div id="boss-7-slot"></div>';
html += readButton('p7');
html += secNavFor('p7');
box.innerHTML = html;
runQuizMC('i7-ion', I7_ION_ITEMS, 12);
runQuizMC('i7-use', I7_USE_ITEMS, 12);
const bs = loadBossState('boss-7') || { stage:0, solved:false };
makeAndBindBoss('boss-7-slot', '7', BOSS_DEFS.b7, bs,
()=>saveBossState('boss-7', bs),
()=>{ bumpProgress('p7', 40); achievement('p7_done'); });
wireReadBtn('p7');
renderMath(box);
}
/* ===== Финал главы 2 ===== */
function buildFinal(){
const box = document.getElementById('final-body'); if(!box) return;
let html = '';
html += '<div class="stub-note"><h3>Финальное испытание · 4 интегрированных босса</h3><p>Победи 4 финальных боссов (LC-контур+ток, трансформатор+ЛЭП, ЭМ волны, биология ЭМ). После — ачивка <code>phys11_ch2_master</code> + 100 XP бонус.</p></div>';
html += '<div id="boss-f1-slot"></div>';
html += '<div id="boss-f2-slot"></div>';
html += '<div id="boss-f3-slot"></div>';
html += '<div id="boss-f4-slot"></div>';
html += '<div id="celebration" style="display:none;margin-top:18px"></div>';
html += secNavFor('final');
box.innerHTML = html;
['f1','f2','f3','f4'].forEach(id=>{
const def = FINAL_BOSS_DEFS[id];
const st = loadBossState('boss-'+id) || { stage:0, solved:false };
makeAndBindBoss('boss-'+id+'-slot', id, def, st,
()=>saveBossState('boss-'+id, st),
()=>{ checkFinalComplete(); });
});
checkFinalComplete();
renderMath(box);
}
function checkFinalComplete(){
const allBeat = ['f1','f2','f3','f4'].every(k=>{
const st = loadBossState('boss-'+k); return st && st.solved;
});
if(!allBeat) return;
const cel = document.getElementById('celebration');
if(!cel || cel.dataset.shown === '1') return;
cel.dataset.shown = '1'; cel.style.display = 'block';
cel.innerHTML = '<div class="boss-card solved" style="background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft));text-align:center"><div style="font-family:Unbounded,sans-serif;font-size:1.4rem;font-weight:900;color:#92400e;margin-bottom:8px">&#9733; Глава 2 пройдена! &#9733;</div><div style="color:var(--text);margin-bottom:14px">Все 4 финальных босса побеждены. ЭМ колебания и волны — освоены.</div><div style="display:inline-block;padding:8px 18px;background:linear-gradient(135deg,#f59e0b,#dc2626);color:#fff;border-radius:99px;font-family:Unbounded,sans-serif;font-weight:800;font-size:.9rem">+ 100 XP бонус + ачивка phys11_ch2_master</div></div>';
const ach = JSON.parse(localStorage.getItem('physics11_achievements')||'[]');
if(ach.indexOf('phys11_ch2_master') < 0){
ach.push('phys11_ch2_master');
localStorage.setItem('physics11_achievements', JSON.stringify(ach));
addXp(100, 'ch2-master');
achievement('ch2_done');
}
bumpProgress('final', 100);
}
/* ===== 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$ — понижающий (ток повышается, напр. снижается).' }
];
const I4_CALC_ITEMS = [
{ q:'$I = 100$ А, $R = 5$ Ом. $P_{пот}$ (кВт)?', answer:'50', explain:'$P = I^2 R = 100^2 \\cdot 5 = 50000$ Вт = 50 кВт.' },
{ q:'$I$ уменьшили в 10 раз. Потери уменьшились в:', answer:'100', explain:'$P \\propto I^2$, $10^2 = 100$ раз.' },
{ q:'$P = 1$ МВт передаётся при $U = 100$ кВ. $I$ (А)?', answer:'10', explain:'$I = P/U = 10^6 / 10^5 = 10$ А.' },
{ q:'$U$ увеличили в 5 раз (при той же $P$). Потери уменьшатся в:', answer:'25', explain:'$I$ уменьшится в 5 раз, $P_{пот} \\propto I^2 = 25$ раз.' },
{ q:'$P = 100$ кВт, $U = 10$ кВ, $R = 2$ Ом. Потери $P_{пот}$ (кВт)?', answer:'0.2', explain:'$I = 10$ А, $P_{пот} = 100 \\cdot 2 = 200$ Вт = 0,2 кВт.' }
];
const I4_TYPE_ITEMS = [
{ q:'Какой тип электростанции использует энергию падения воды?', opts:['ТЭС','ГЭС','АЭС','СЭС'], correct:1, explain:'ГЭС — гидро.' },
{ q:'Какая станция выделяет больше всего CO₂?', opts:['ТЭС','ГЭС','АЭС','ВЭС'], correct:0, explain:'ТЭС сжигает уголь/газ.' },
{ q:'Островецкая станция в Беларуси — это:', opts:['ТЭС','ГЭС','АЭС','СЭС'], correct:2, explain:'Атомная (с 2020 г.).' },
{ q:'Зачем повышают $U$ в ЛЭП?', opts:['Меньше потерь','Больше мощность','Безопасность','Эстетика'], correct:0, explain:'$P_{пот} = I^2 R$, при $\\uparrow U \\downarrow I$, потери ↓.' },
{ q:'У потребителя ставят:', opts:['Повышающий тр.','Понижающий тр.','Конденсатор','Электролит'], correct:1, explain:'750 кВ → 220 В.' }
];
const I5_TYPE_ITEMS = [
{ q:'Использует кинетическую энергию воздушных масс:', opts:['ТЭС','ВЭС','ГеоТЭС','АЭС'], correct:1, explain:'ВЭС — ветер.' },
{ q:'Преобразует свет в ток через фотоэлементы:', opts:['СЭС','ТЭС','ВЭС','ГЭС'], correct:0, explain:'СЭС — солнце.' },
{ q:'Использует подземное тепло:', opts:['ТЭС','ГеоТЭС','АЭС','Приливная'], correct:1, explain:'Геотермальная (вулканы).' },
{ q:'Использует энергию Луны (косвенно):', opts:['ВЭС','Приливная','СЭС','ГеоТЭС'], correct:1, explain:'Приливы вызваны Луной.' },
{ q:'Биогаз получают:', opts:['Из ветра','Из органики (метан)','Из солнца','Из урана'], correct:1, explain:'Брожение органики.' },
{ q:'ВИЭ — это:', opts:['Возобновляемые источники','Высокие источники','Внутренние','Невозобновляемые'], correct:0, explain:'Возобновляемые источники энергии.' }
];
const I5_PRO_ITEMS = [
{ q:'Главное преимущество ВИЭ:', opts:['Не выбрасывают CO₂','Дешевле ТЭС','Работают круглосуточно','Не требуют ремонта'], correct:0, explain:'Нет вредных выбросов.' },
{ q:'Главный недостаток солнечных и ветровых станций:', opts:['Высокие выбросы','Зависимость от погоды/времени суток','Радиация','Шум'], correct:1, explain:'Ветер дует не всегда, солнце ночью отсутствует.' },
{ q:'АЭС опасны из-за:', opts:['CO₂','Радиоактивных отходов','Шума','Запахов'], correct:1, explain:'Долгоживущие радиоактивные отходы.' },
{ q:'ТЭС вредны для атмосферы из-за:', opts:['CO₂, SO₂, NOₓ','Радиации','Магнитного поля','Звука'], correct:0, explain:'Парниковые газы и кислотные дожди.' },
{ q:'Удельная мощность ВИЭ:', opts:['Очень высокая','Низкая (нужны большие площади)','Такая же как ТЭС','Бесконечная'], correct:1, explain:'Низкая плотность энергии.' }
];
const I6_CALC_ITEMS = [
{ q:'$\\lambda = 500$ нм (видимый). $\\nu$ (Гц)?', answer:['6e14','6·10¹⁴','600000000000000','6*10^14'], explain:'$\\nu = c/\\lambda = 3 \\cdot 10^8 / 5 \\cdot 10^{-7} = 6 \\cdot 10^{14}$ Гц.' },
{ q:'Радиостанция на 100 МГц. $\\lambda$ (м)?', answer:'3', explain:'$\\lambda = c/\\nu = 3 \\cdot 10^8 / 10^8 = 3$ м.' },
{ q:'$\\lambda = 3$ см (СВЧ). $\\nu$ (ГГц)?', answer:'10', explain:'$\\nu = c/\\lambda = 3 \\cdot 10^8 / 0{,}03 = 10^{10}$ Гц = 10 ГГц.' },
{ q:'Скорость ЭМ волны в вакууме?', answer:['3e8','3·10⁸','300000000','3*10^8'], explain:'$c = 3 \\cdot 10^8$ м/с.' },
{ q:'$\\nu = 1$ кГц (звуковая частота, но радио). $\\lambda$ (км)?', answer:'300', explain:'$\\lambda = 3 \\cdot 10^8 / 10^3 = 3 \\cdot 10^5$ м = 300 км.' }
];
const I6_RNG_ITEMS = [
{ q:'$\\lambda = 600$ нм. Какой диапазон?', opts:['Радио','ИК','Видимый','УФ'], correct:2, explain:'600 нм — оранжевая часть видимого.' },
{ q:'$\\lambda = 10$ см. Диапазон?', opts:['Радио','СВЧ','ИК','Видимый'], correct:1, explain:'10 см ≈ 3 ГГц — СВЧ (сотовая связь).' },
{ q:'$\\lambda = 0{,}001$ нм. Диапазон?', opts:['УФ','Рентген','γ-излучение','Видимый'], correct:2, explain:'< 0,01 нм — γ.' },
{ q:'Тепловое излучение нагретых тел:', opts:['Радио','СВЧ','ИК','УФ'], correct:2, explain:'ИК — теплота.' },
{ q:'Какие волны самые длинные?', opts:['Радио','γ','Видим.','Рентген'], correct:0, explain:'Радио — λ до км.' }
];
const I7_ION_ITEMS = [
{ q:'Радиоволны:', opts:['Ионизирующие','Неионизирующие'], correct:1, explain:'Малая энергия квантов.' },
{ q:'γ-излучение:', opts:['Ионизирующие','Неионизирующие'], correct:0, explain:'Очень высокая энергия.' },
{ q:'Видимый свет:', opts:['Ионизирующие','Неионизирующие'], correct:1, explain:'~2-3 эВ < 10 эВ.' },
{ q:'Рентген:', opts:['Ионизирующие','Неионизирующие'], correct:0, explain:'Сотни эВ – кэВ.' },
{ q:'СВЧ (микроволны):', opts:['Ионизирующие','Неионизирующие'], correct:1, explain:'Малая энергия, но греет (вода).' }
];
const I7_USE_ITEMS = [
{ q:'Стерилизация воды бактерицидными лампами — это:', opts:['ИК','УФ','Рентген','γ'], correct:1, explain:'УФ-С убивает бактерии.' },
{ q:'Флюорография — какое излучение?', opts:['ИК','УФ','Рентген','Радио'], correct:2, explain:'Рентген.' },
{ q:'Свинцовый экран используют для защиты от:', opts:['Радио','Видимого','γ-излучения','ИК'], correct:2, explain:'Свинец задерживает γ и рентген.' },
{ q:'Тепловые лампы в обогревателях — какой диапазон?', opts:['ИК','УФ','Рентген','γ'], correct:0, explain:'Инфракрасное тепло.' },
{ q:'Что НЕ является опасным эффектом ЭМ:', opts:['Ожоги от УФ','Лучевая болезнь','Опасные звуки','Рак кожи'], correct:2, explain:'Звуки — не ЭМ.' }
];
/* ===== 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:'Концентрирует магнитный поток.' }
]},
b4: { title:'Босс §10 — Передача э/э', tag:'§10', xp:70, stages:[
{ q:'$I = 50$ А, $R = 4$ Ом. $P_{пот}$ (кВт)?', type:'input', a:'10', explain:'$P = 50^2 \\cdot 4 = 10000$ Вт.' },
{ q:'$U$ повысили в 10 раз. Потери уменьшатся в:', type:'input', a:'100', explain:'$I$ упадёт в 10, $P_{пот} \\propto I^2 = 100$.' },
{ q:'Самая «грязная» станция:', type:'mc', opts:['ГЭС','ТЭС','ВЭС','СЭС'], correct:1, explain:'CO₂, SO₂.' },
{ q:'$P = 200$ кВт, $U = 20$ кВ. $I$ (А)?', type:'input', a:'10', explain:'$I = 2\\cdot 10^5/2\\cdot 10^4 = 10$ А.' },
{ q:'Магистральная ЛЭП в РБ — напряжение порядка:', type:'mc', opts:['220 В','10 кВ','220 кВ','750 кВ'], correct:3, explain:'Магистральные — до 750 кВ.' }
]},
b5: { title:'Босс §11 — Экология', tag:'§11', xp:70, stages:[
{ q:'Ветровая станция использует:', type:'mc', opts:['Свет','Кинетику ветра','Тепло земли','Ядра урана'], correct:1, explain:'ВЭС.' },
{ q:'СЭС преобразует:', type:'mc', opts:['Свет в ток','Тепло в ток','Уран','Ветер'], correct:0, explain:'Фотоэлемент.' },
{ q:'Главный плюс ВИЭ:', type:'mc', opts:['Дешевле','Без CO₂','Круглосуточно','Не требуют обслуживания'], correct:1, explain:'Нет вредных выбросов.' },
{ q:'Главный минус СЭС:', type:'mc', opts:['Радиация','Зависят от солнца','CO₂','Дорогое топливо'], correct:1, explain:'Ночью и в пасмурно — снижение.' },
{ q:'АЭС опасны из-за:', type:'mc', opts:['CO₂','Радиоактивных отходов','Шума','Запахов'], correct:1, explain:'Отходы хранятся тысячи лет.' }
]},
b6: { title:'Босс §12 — Шкала ЭМ волн', tag:'§12', xp:70, stages:[
{ q:'$c$ в вакууме (м/с)?', type:'input', a:['3e8','3·10⁸','300000000','3*10^8'], explain:'$3 \\cdot 10^8$ м/с.' },
{ q:'$\\lambda = 6$ м (радио). $\\nu$ (МГц)?', type:'input', a:'50', explain:'$\\nu = 3\\cdot 10^8/6 = 5 \\cdot 10^7$ Гц = 50 МГц.' },
{ q:'Видимый свет занимает $\\lambda$:', type:'mc', opts:['1 мкм 1 мм','380 760 нм','1 нм 100 нм','> 1 мм'], correct:1, explain:'380-760 нм.' },
{ q:'Кто открыл ЭМ волны экспериментально?', type:'mc', opts:['Максвелл','Герц','Эйнштейн','Фарадей'], correct:1, explain:'Г. Герц (1888).' },
{ q:'ЭМ волны — это:', type:'mc', opts:['Продольные','Поперечные','Стоячие','Звуковые'], correct:1, explain:'$\\vec{E}, \\vec{B}$ ⊥ распр.' }
]},
b7: { title:'Босс §13 — ЭМ и живые', tag:'§13', xp:65, stages:[
{ q:'Энергия фотона:', type:'mc', opts:['$h\\nu$','$mv^2/2$','$kT$','$hc$'], correct:0, explain:'$E = h\\nu$.' },
{ q:'Ионизирующее излучение:', type:'mc', opts:['Радио','γ','ИК','СВЧ'], correct:1, explain:'γ — самая большая энергия.' },
{ q:'УФ-С применяется для:', type:'mc', opts:['Тепла','Стерилизации','Радиосвязи','Передачи тока'], correct:1, explain:'Убивает бактерии.' },
{ q:'Что задерживает γ-излучение:', type:'mc', opts:['Бумага','Свинец','Воздух','Стекло'], correct:1, explain:'Свинец, бетон.' },
{ q:'Для лучевой терапии используют:', type:'mc', opts:['Радио','Видимый','γ','СВЧ'], correct:2, explain:'γ для уничтожения опухолей.' }
]}
};
const FINAL_BOSS_DEFS = {
f1: { title:'Финал · LC + ток', tag:'Финал гл.2', xp:30, stages:[
{ q:'$T = 2\\pi\\sqrt{?}$', type:'mc', opts:['$L+C$','$LC$','$L/C$','$LC^2$'], correct:1, explain:'$LC$.' },
{ q:'$L=10$ мкГн, $C=100$ нФ. $\\omega$ (рад/с)?', type:'input', a:['1e6','10⁶','1000000','10^6'], explain:'$1/\\sqrt{LC} = 10^6$ рад/с.' },
{ q:'$U_0 = 311$ В. $U$ действ. (В)?', type:'input', a:'220', explain:'$311/\\sqrt{2} \\approx 220$ В.' },
{ q:'Сеть 50 Гц — это:', type:'mc', opts:['ω','ν','T','U₀'], correct:1, explain:'Частота.' }
]},
f2: { title:'Финал · Трансф + ЛЭП', tag:'Финал гл.2', xp:30, stages:[
{ q:'$N_1 = 5000$, $N_2 = 500$, $U_1 = 10$ кВ. $U_2$ (В)?', type:'input', a:'1000', explain:'$U_2 = 10000/10 = 1000$ В.' },
{ q:'$I = 200$ А, $R = 0{,}5$ Ом. $P_{пот}$ (кВт)?', type:'input', a:'20', explain:'$200^2 \\cdot 0{,}5 = 20000$ Вт.' },
{ q:'Зачем в ЛЭП высокое $U$?', type:'mc', opts:['Меньше потерь','Безопаснее','Больше мощность','Эстетика'], correct:0, explain:'$P_{пот} = I^2 R$.' },
{ q:'$k = 100$. Тип:', type:'mc', opts:['Повышающий','Понижающий'], correct:1, explain:'$U_2 < U_1$.' }
]},
f3: { title:'Финал · ЭМ волны', tag:'Финал гл.2', xp:30, stages:[
{ q:'$c = \\lambda \\cdot$ ?', type:'mc', opts:['$T$','$\\nu$','$\\omega$','$k$'], correct:1, explain:'$c = \\lambda\\nu$.' },
{ q:'$\\nu = 500$ МГц. $\\lambda$ (м)?', type:'input', a:['0.6','0.60'], explain:'$3 \\cdot 10^8 / 5 \\cdot 10^8 = 0{,}6$ м.' },
{ q:'Видимый свет ≈ нм:', type:'mc', opts:['1-10','380-760','1000-10000','0,1-1'], correct:1, explain:'380-760 нм.' },
{ q:'Самые опасные ЭМ волны:', type:'mc', opts:['Радио','γ','ИК','Видимый'], correct:1, explain:'γ — ионизирующие.' }
]},
f4: { title:'Финал · Сборная', tag:'Финал гл.2', xp:50, stages:[
{ q:'$L=1$ Гн, $C=1$ Ф. $T$ (с)?', type:'input', a:['2π','2pi','6.28','6.283'], explain:'$2\\pi\\sqrt{1} = 2\\pi$ с.' },
{ q:'$U_0 = 100$ В. Действующее $U$ (В)?', type:'input', a:['70.7','71','70'], explain:'$100/\\sqrt{2} \\approx 70{,}7$ В.' },
{ q:'$N_1 = 1000$, $N_2 = 50$, $I_1 = 0{,}1$ А. $I_2$ (А)?', type:'input', a:'2', explain:'$I_2 = I_1 \\cdot N_1/N_2 = 2$ А.' },
{ q:'$\\lambda = 1$ км. Это:', type:'mc', opts:['Радио','СВЧ','ИК','УФ'], correct:0, explain:'Длинные радиоволны.' },
{ q:'Свинец защищает от:', type:'mc', opts:['Звука','γ-излучения','Ветра','Воды'], correct:1, 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>