diff --git a/frontend/textbooks/physics_10_ch3.html b/frontend/textbooks/physics_10_ch3.html
index 76c3f94..c845b30 100644
--- a/frontend/textbooks/physics_10_ch3.html
+++ b/frontend/textbooks/physics_10_ch3.html
@@ -2798,34 +2798,696 @@ function build_p21(){
function build_p22(){
const box = document.getElementById('p22-body');
let html = '';
- html += makeCard('theory', "Разность потенциалов. Напряжение", "§22", `
-
Разность потенциалов. Напряжение — этот параграф в разработке (Phase 1+).
- Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
+ /* THEORY 1 — Разность потенциалов и напряжение */
+ html += makeCard('theory', "Разность потенциалов и напряжение", "§22", `
+ Напряжение $U$ между двумя точками 1 и 2 электростатического поля — это разность потенциалов этих точек:
+ $$U_{12} = \\varphi_1 - \\varphi_2$$
+ Единица измерения: Вольт (В) $= 1$ Дж / 1 Кл.
+ $1$ В — это напряжение, при котором поле совершает работу $1$ Дж при переносе заряда $1$ Кл из одной точки в другую.
+ Работа поля при перемещении заряда $q$ из точки 1 в точку 2:
+ $$A_{12} = q U_{12} = q(\\varphi_1 - \\varphi_2)$$
+ Если $A > 0$ — поле помогает перемещению. Если $A < 0$ — поле сопротивляется (нужно работать против поля).
+ Напряжение измеряется вольтметром (подключается между двумя точками).
`);
+
+ /* THEORY 2 — Связь U и E в однородном поле */
+ html += makeCard('rule', "Связь напряжения с напряжённостью", "§22", `
+ В однородном поле (например, между обкладок плоского конденсатора) напряжение и напряжённость связаны формулой:
+ $$U = E \\cdot d$$
+ где:
+
+ $U$ — напряжение в В
+ $E$ — напряжённость в В/м
+ $d$ — расстояние между точками вдоль направления $\\vec{E}$ , в м
+
+ Если перемещение перпендикулярно $\\vec{E}$ — напряжение между точками равно нулю.
+ Эта формула — главный инструмент для расчётов в однородных полях: конденсаторы, поле над поверхностью, поле между параллельными пластинами.
+ Отсюда удобная форма для напряжённости: $E = U/d$ — поэтому единица $\\vec{E}$ — В/м .
+ `);
+
+ /* THEORY 3 — Эквипотенциальные поверхности */
+ html += makeCard('example', "Эквипотенциальные поверхности", "§22", `
+ Эквипотенциальная поверхность — поверхность, на которой потенциал во всех точках одинаков ($\\varphi = $ const).
+ Свойства:
+
+ Силовые линии $\\vec{E}$ перпендикулярны эквипотенциальным поверхностям.
+ Работа поля при перемещении вдоль эквипотенциальной поверхности равна нулю : $\\Delta\\varphi = 0 \\Rightarrow A = q\\Delta\\varphi = 0$.
+ В однородном поле эквипотенциальные поверхности — параллельные плоскости.
+ Вокруг точечного заряда — концентрические сферы.
+ Поверхность проводника — эквипотенциальная (в электростатике).
+
+ Пример. Между параллельными пластинами заряженного конденсатора эквипотенциальные поверхности — плоскости, параллельные пластинам. Чем ближе к положительной пластине — тем выше $\\varphi$.
+ `);
+
+ /* INTERACTIVE 1 — Связь U и E в однородном поле */
+ html += `
+
+
Меняй напряжение $U$ и расстояние $d$ между пластинами. Наблюдай $E = U/d$ — ширина стрелок $\\vec{E}$ пропорциональна напряжённости.
+
+ $U$: 100 В
+ $d$: 0.05 м
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 2 — Калькулятор работы поля */
+ html += ``;
+
+ /* INTERACTIVE 3 — Знак напряжения */
+ html += `
+
+
Определи знак напряжения $U_{12} = \\varphi_1 - \\varphi_2$.
+
Задача 1 / 6 Очки: 0 / 6
+
+
+
+
Начать заново
+
`;
+
+ /* INTERACTIVE 4 — Тренажёр напряжения */
+ html += `
+
+
5 задач. Допуск $\\pm 5\\%$.
+
Задача 1 / 5 Очки: 0 / 5
+
+
+ ответ =
+
+ Проверить
+ Заново
+
+
+
`;
+
html += secNav('p21', 'p23');
html += readButton('p22');
+
box.innerHTML = html;
renderMath(box);
+
+ /* IV1 — Связь U и E в однородном поле */
+ (function(){
+ const svg = document.getElementById('p22-iv1-svg');
+ const US = document.getElementById('p22-iv1-U');
+ const dS = document.getElementById('p22-iv1-d');
+ const UL = document.getElementById('p22-iv1-UL');
+ const dL = document.getElementById('p22-iv1-dL');
+ const out = document.getElementById('p22-iv1-out');
+ const seen = new Set();
+ let _done = false;
+
+ function render(){
+ const U = +US.value, d = +dS.value;
+ UL.textContent = U; dL.textContent = d.toFixed(2);
+ const E = U / d;
+
+ const W = 480, H = 280;
+ // Две пластины: верхняя "+", нижняя "−". Расстояние px зависит от d.
+ const yMid = 140;
+ const platePx = Math.max(30, Math.min(180, d * 900)); // визуальное расстояние
+ const yTop = yMid - platePx/2;
+ const yBot = yMid + platePx/2;
+ const xL = 80, xR = 400;
+
+ let g = '';
+ g += ' ';
+ g += 'Однородное поле: $U = E\\cdot d$ ';
+
+ // Верхняя пластина (+)
+ g += ' ';
+ g += '+ ';
+ // Нижняя пластина (−)
+ g += ' ';
+ g += '− ';
+
+ // Линии E между пластинами — толщина ~ E (от 0.6 до 4)
+ const Emin = 10/0.20, Emax = 500/0.01;
+ const wE = 0.6 + 3.4 * (Math.min(E, Emax) - Emin) / (Emax - Emin);
+ const sw = Math.max(0.8, Math.min(4, wE));
+ const arrowCount = 6;
+ for(let i = 0; i < arrowCount; i++){
+ const x = xL + 40 + (xR - xL - 80) * i / (arrowCount-1);
+ g += PHYS.drawArrow(x, yTop+6, x, yBot-6, '#a78bfa', sw, 7);
+ }
+ g += '$\\vec{E}$ ';
+
+ // Метка d (вертикальная)
+ g += ' ';
+ g += ' ';
+ g += ' ';
+ g += 'd ';
+
+ // Эквипотенциали — несколько горизонтальных пунктирных
+ const equipCount = 3;
+ for(let i = 1; i <= equipCount; i++){
+ const yE = yTop + (yBot-yTop) * i / (equipCount+1);
+ g += ' ';
+ }
+ g += 'эквипотенциали ⊥ $\\vec{E}$ ';
+
+ svg.innerHTML = g;
+
+ out.innerHTML = '$E = U/d = '+U+'/'+d.toFixed(2)+' = '+E.toFixed(0)+'$ В/м '
+ + '(чем больше $U$ или меньше $d$ — тем сильнее поле) ';
+ renderMath(out);
+
+ seen.add(U+':'+d.toFixed(2));
+ if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p22-iv1'); bumpProgress('p22', 15); }
+ }
+ US.addEventListener('input', render);
+ dS.addEventListener('input', render);
+ render();
+ })();
+
+ /* IV2 — Калькулятор работы поля */
+ (function(){
+ let mode = 'A';
+ const inA = document.getElementById('p22-iv2-inA');
+ const inB = document.getElementById('p22-iv2-inB');
+ const mA = document.getElementById('p22-iv2-mA');
+ const mB = document.getElementById('p22-iv2-mB');
+ const out = document.getElementById('p22-iv2-out');
+ const seen = new Set();
+ let _done = false;
+
+ function setMode(m){
+ mode = m;
+ if(m === 'A'){
+ inA.style.display = 'grid'; inB.style.display = 'none';
+ mA.classList.add('primary'); mB.classList.remove('primary');
+ } else {
+ inA.style.display = 'none'; inB.style.display = 'grid';
+ mB.classList.add('primary'); mA.classList.remove('primary');
+ }
+ calc();
+ }
+ function calc(){
+ let html = '';
+ if(mode === 'A'){
+ const q = parseFloat(document.getElementById('p22-iv2-q').value) || 0;
+ const f1 = parseFloat(document.getElementById('p22-iv2-f1').value) || 0;
+ const f2 = parseFloat(document.getElementById('p22-iv2-f2').value) || 0;
+ const U = f1 - f2;
+ const A = (q * 1e-9) * U;
+ const Annano = A * 1e9;
+ html += '$U = \\varphi_1 - \\varphi_2 = '+f1+' - '+f2+' = '+U.toFixed(1)+'$ В
';
+ html += '$A = qU = '+q+'\\cdot 10^{-9} \\cdot '+U.toFixed(1)+' = '+Annano.toFixed(2)+'$ нДж
';
+ if(A > 0) html += '$A > 0$: поле совершает положительную работу.
';
+ else if(A < 0) html += '$A < 0$: поле сопротивляется — нужно работать против поля.
';
+ else html += '$A = 0$: точки на одной эквипотенциали.
';
+ seen.add('A:'+q+':'+f1+':'+f2);
+ } else {
+ const q = parseFloat(document.getElementById('p22-iv2-qB').value) || 0;
+ const E = parseFloat(document.getElementById('p22-iv2-E').value) || 0;
+ const d = parseFloat(document.getElementById('p22-iv2-d').value) || 0;
+ const U = E * d;
+ const A = (q * 1e-9) * U;
+ const Annano = A * 1e9;
+ html += '$U = Ed = '+E+'\\cdot '+d+' = '+U.toFixed(2)+'$ В
';
+ html += '$A = qEd = '+q+'\\cdot 10^{-9} \\cdot '+E+' \\cdot '+d+' = '+Annano.toFixed(2)+'$ нДж
';
+ seen.add('B:'+q+':'+E+':'+d);
+ }
+ out.innerHTML = html;
+ renderMath(out);
+ if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p22-iv2'); bumpProgress('p22', 15); }
+ }
+ mA.addEventListener('click', () => setMode('A'));
+ mB.addEventListener('click', () => setMode('B'));
+ document.getElementById('p22-iv2-go').addEventListener('click', calc);
+ ['p22-iv2-q','p22-iv2-f1','p22-iv2-f2','p22-iv2-qB','p22-iv2-E','p22-iv2-d'].forEach(id => {
+ const el = document.getElementById(id);
+ if(el) el.addEventListener('keydown', e => { if(e.key === 'Enter') calc(); });
+ });
+ setMode('A');
+ })();
+
+ /* IV3 — Знак напряжения */
+ (function(){
+ const OPTS = ['$U > 0$', '$U < 0$', '$U = 0$'];
+ const Q = [
+ { q:'$\\varphi_1 = 100$ В, $\\varphi_2 = 50$ В. Чему равно $U_{12}$?', ans:0, why:'$U = 100 - 50 = 50 > 0$.' },
+ { q:'$\\varphi_1 = 30$ В, $\\varphi_2 = 80$ В.', ans:1, why:'$U = 30 - 80 = -50 < 0$.' },
+ { q:'$\\varphi_1 = 50$ В, $\\varphi_2 = 50$ В.', ans:2, why:'$U = 50 - 50 = 0$ — на одной эквипотенциали.' },
+ { q:'Точки 1 и 2 лежат на одной эквипотенциальной поверхности.', ans:2, why:'$\\varphi_1 = \\varphi_2 \\Rightarrow U = 0$.' },
+ { q:'В направлении $\\vec{E}$ на расстоянии $d = 0{,}1$ м при $E = 1000$ В/м.', ans:0, why:'$U = Ed = 100$ В $> 0$ (потенциал падает вдоль $\\vec{E}$).' },
+ { q:'Перемещение между двумя точками — строго перпендикулярно $\\vec{E}$.', ans:2, why:'Это вдоль эквипотенциали $\\Rightarrow U = 0$.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p22-iv3-q');
+ const oEl = document.getElementById('p22-iv3-opts');
+ const fb = document.getElementById('p22-iv3-fb');
+ const iEl = document.getElementById('p22-iv3-i');
+ const sEl = document.getElementById('p22-iv3-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p22-iv3'); bumpProgress('p22', 25); }
+ else if(score >= 4){ addXp(8, 'p22-iv3'); bumpProgress('p22', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ const item = Q[i];
+ qEl.innerHTML = item.q;
+ oEl.innerHTML = OPTS.map((t, k) => '' + t + ' ').join('');
+ fb.style.display = 'none';
+ renderMath(qEl); renderMath(oEl);
+ oEl.querySelectorAll('button').forEach(b => {
+ b.addEventListener('click', () => {
+ const v = +b.dataset.v;
+ if(v === item.ans){ score++; feedback(fb, true, '✓ Верно! ' + item.why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Неверно. ' + item.why + ' Дальше ▶');
+ sEl.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 1800);
+ });
+ });
+ }
+ document.getElementById('p22-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV4 — Тренажёр напряжения */
+ (function(){
+ const Q = [
+ { q:'$\\varphi_1 = 100$ В, $\\varphi_2 = 40$ В. Напряжение $U_{12}$ в В?', ans:60, tol:3, hint:'$U = \\varphi_1 - \\varphi_2 = 100 - 40 = 60$ В.' },
+ { q:'Однородное поле $E = 500$ В/м между пластинами $d = 0{,}02$ м. Напряжение $U$ в В?', ans:10, tol:0.5, hint:'$U = Ed = 500\\cdot 0{,}02 = 10$ В.' },
+ { q:'Заряд $+2$ мкКл перенесли при $U = 50$ В. Работа поля в мкДж?', ans:100, tol:5, hint:'$A = qU = 2\\cdot 10^{-6}\\cdot 50 = 10^{-4}$ Дж $= 100$ мкДж.' },
+ { q:'$U = 1000$ В между пластинами на $d = 0{,}05$ м. Напряжённость $E$ в В/м?', ans:20000, tol:500, hint:'$E = U/d = 1000/0{,}05 = 20\\,000$ В/м.' },
+ { q:'Какова работа поля при перемещении заряда вдоль эквипотенциальной поверхности? (Дж)', ans:0, tol:0.0001, hint:'$\\Delta\\varphi = 0 \\Rightarrow A = q\\Delta\\varphi = 0$.' }
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p22-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15, 'p22-iv4'); bumpProgress('p22', 25); }
+ else if(score >= 3){ addXp(8, 'p22-iv4'); bumpProgress('p22', 15); }
+ return;
+ }
+ document.getElementById('p22-iv4-i').textContent = (i+1);
+ document.getElementById('p22-iv4-s').textContent = score;
+ document.getElementById('p22-iv4-q').innerHTML = Q[i].q;
+ document.getElementById('p22-iv4-ans').value = '';
+ renderMath(document.getElementById('p22-iv4-q'));
+ document.getElementById('p22-iv4-fb').style.display = 'none';
+ }
+ function go(){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p22-iv4-fb');
+ const raw = document.getElementById('p22-iv4-ans').value.replace(',', '.');
+ const ans = parseFloat(raw);
+ if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; }
+ if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); }
+ else feedback(fb, false, '✗ Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶');
+ document.getElementById('p22-iv4-s').textContent = score;
+ i++;
+ setTimeout(show, 1800);
+ }
+ document.getElementById('p22-iv4-go').addEventListener('click', go);
+ document.getElementById('p22-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
+ document.getElementById('p22-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
wireReadBtn('p22');
}
function build_p23(){
const box = document.getElementById('p23-body');
let html = '';
- html += makeCard('theory', "Конденсаторы", "§23", `
- Конденсаторы — этот параграф в разработке (Phase 1+).
- Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
+ /* THEORY 1 — Конденсатор и электроёмкость */
+ html += makeCard('theory', "Конденсатор и электроёмкость", "§23", `
+ Конденсатор — устройство из двух проводников (обкладок), разделённых диэлектриком, предназначенное для накопления электрического заряда и энергии.
+ Заряд конденсатора $q$ — это модуль заряда на одной обкладке (на другой обкладке заряд $-q$). Между обкладками возникает напряжение $U$.
+ Электроёмкость $C$ — отношение заряда обкладки к напряжению между обкладками:
+ $$C = \\dfrac{q}{U}$$
+ $C$ — характеристика самого конденсатора (не зависит от $q$ и $U$, только от геометрии и диэлектрика).
+ Единица: Фарад (Ф) $= 1$ Кл / 1 В. Это очень большая ёмкость! На практике:
+
+ мкФ ($\\mu$Ф) $= 10^{-6}$ Ф
+ нФ $= 10^{-9}$ Ф
+ пФ $= 10^{-12}$ Ф
+
`);
+
+ /* THEORY 2 — Плоский конденсатор */
+ html += makeCard('rule', "Плоский конденсатор", "§23", `
+ Плоский конденсатор состоит из двух параллельных пластин площадью $S$, разделённых диэлектриком толщины $d$.
+ $$C = \\dfrac{\\varepsilon \\varepsilon_0 S}{d}$$
+ где:
+
+ $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м — электрическая постоянная
+ $\\varepsilon$ — относительная диэлектрическая проницаемость диэлектрика (для воздуха $\\approx 1$, для слюды $\\approx 6$, керамики до 1000)
+ $S$ — площадь пластины в м²
+ $d$ — расстояние между пластинами в м
+
+ Способы увеличить $C$:
+
+ Увеличить площадь $S$.
+ Уменьшить расстояние $d$.
+ Использовать диэлектрик с большим $\\varepsilon$.
+
+ `);
+
+ /* THEORY 3 — Соединения конденсаторов */
+ html += makeCard('example', "Соединения конденсаторов", "§23", `
+ Параллельное соединение:
+
+ Напряжение одинаково: $U = U_1 = U_2 = \\ldots$
+ Заряды складываются: $q = q_1 + q_2 + \\ldots$
+ Ёмкости складываются: $C_{общ} = C_1 + C_2 + \\ldots$
+
+ Последовательное соединение:
+
+ Заряд одинаков: $q = q_1 = q_2 = \\ldots$
+ Напряжения складываются: $U = U_1 + U_2 + \\ldots$
+ Складываются обратные ёмкости:
+
+ $$\\dfrac{1}{C_{общ}} = \\dfrac{1}{C_1} + \\dfrac{1}{C_2} + \\ldots$$
+ Для двух последовательно соединённых конденсаторов: $C_{общ} = \\dfrac{C_1 C_2}{C_1 + C_2}$.
+ Применение: в радио и электронике для фильтрации и сглаживания сигналов, в импульсных устройствах (фотовспышка), в фильтрах источников питания, в компьютерной памяти.
+ `);
+
+ /* INTERACTIVE 1 — Конструктор плоского конденсатора */
+ html += `
+
+
Меняй площадь пластин $S$, расстояние $d$ и диэлектрик. Наблюдай $C = \\varepsilon\\varepsilon_0 S/d$.
+
+ $S$: 0.010 м²
+ $d$: 0.005 м
+
+
+ Воздух $\\varepsilon = 1$
+ Слюда $\\varepsilon = 6$
+ Керамика $\\varepsilon = 100$
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 2 — Калькулятор соединений */
+ html += `
+
+
Параллельно: $C = C_1 + C_2$. Последовательно: $1/C = 1/C_1 + 1/C_2$.
+
+ Параллельно
+ Последовательно
+
+
+ $C_1$ (мкФ):
+ $C_2$ (мкФ):
+
+
+ Вычислить $C_{общ}$
+
+
+
`;
+
+ /* INTERACTIVE 3 — Что увеличит ёмкость? */
+ html += `
+
+
Опираясь на $C = \\varepsilon\\varepsilon_0 S/d$, выбери: действие увеличит или уменьшит $C$.
+
Задача 1 / 6 Очки: 0 / 6
+
+
+
+
Начать заново
+
`;
+
+ /* INTERACTIVE 4 — Тренажёр конденсаторов */
+ html += `
+
+
5 задач. $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м. Допуск $\\pm 5\\%$.
+
Задача 1 / 5 Очки: 0 / 5
+
+
+ ответ =
+
+ Проверить
+ Заново
+
+
+
`;
+
html += secNav('p22', 'p24');
html += readButton('p23');
+
box.innerHTML = html;
renderMath(box);
+
+ /* IV1 — Конструктор плоского конденсатора */
+ (function(){
+ const eps0 = PHYS.CONST.eps0;
+ const svg = document.getElementById('p23-iv1-svg');
+ const SS = document.getElementById('p23-iv1-S');
+ const dS = document.getElementById('p23-iv1-d');
+ const SL = document.getElementById('p23-iv1-SL');
+ const dL = document.getElementById('p23-iv1-dL');
+ const out = document.getElementById('p23-iv1-out');
+ const bA = document.getElementById('p23-iv1-eA');
+ const bM = document.getElementById('p23-iv1-eM');
+ const bC = document.getElementById('p23-iv1-eC');
+ const seen = new Set();
+ let _done = false;
+ let eps = 1, epsName = 'воздух', epsColor = '#f8fafc';
+
+ function setEps(e, name, color, btn){
+ eps = e; epsName = name; epsColor = color;
+ [bA, bM, bC].forEach(x => x.classList.remove('primary'));
+ btn.classList.add('primary');
+ render();
+ }
+ function render(){
+ const S = +SS.value, d = +dS.value;
+ SL.textContent = S.toFixed(3);
+ dL.textContent = d.toFixed(3);
+ const C = eps * eps0 * S / d; // Ф
+ const Cnf = C * 1e9; // нФ
+ const Cmkf = C * 1e6; // мкФ
+
+ const W = 480, H = 280, cx = W/2, cy = H/2;
+ // Длина пластин пропорциональна sqrt(S), макс ширина ~280
+ const plateLen = 80 + 200 * Math.sqrt(S / 0.1);
+ // Расстояние между пластинами пропорционально d
+ const platesGap = 20 + 120 * (d / 0.01);
+ const xL = cx - plateLen/2, xR = cx + plateLen/2;
+ const yTop = cy - platesGap/2;
+ const yBot = cy + platesGap/2;
+
+ let g = '';
+ g += ' ';
+ g += 'Плоский конденсатор ';
+
+ // Диэлектрик между пластинами
+ g += ' ';
+ // Верхняя пластина (+)
+ g += ' ';
+ // Нижняя пластина (−)
+ g += ' ';
+ // Метки + и −
+ g += '+ ';
+ g += '− ';
+
+ // Подпись диэлектрика по центру
+ g += ''+epsName+' (ε = '+eps+') ';
+
+ // Размер d справа
+ g += ' ';
+ g += ' ';
+ g += ' ';
+ g += 'd ';
+
+ // Размер плакеты сверху (S = площадь, длина — проекция)
+ g += 'площадь S ';
+
+ svg.innerHTML = g;
+
+ // Вывод значения
+ let CStr;
+ if(Cmkf >= 1) CStr = Cmkf.toFixed(2) + ' мкФ';
+ else if(Cnf >= 1) CStr = Cnf.toFixed(2) + ' нФ';
+ else CStr = (C*1e12).toFixed(2) + ' пФ';
+
+ out.innerHTML = '$C = \\dfrac{\\varepsilon\\varepsilon_0 S}{d} = \\dfrac{'+eps+'\\cdot 8{,}85\\cdot 10^{-12}\\cdot '+S.toFixed(3)+'}{'+d.toFixed(3)+'} = '+C.toExponential(2)+'$ Ф $\\approx$ '+CStr+' ';
+ renderMath(out);
+
+ seen.add(S.toFixed(3)+':'+d.toFixed(3)+':'+eps);
+ if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p23-iv1'); bumpProgress('p23', 15); }
+ }
+ bA.addEventListener('click', () => setEps(1, 'воздух', '#f8fafc', bA));
+ bM.addEventListener('click', () => setEps(6, 'слюда', '#e2e8f0', bM));
+ bC.addEventListener('click', () => setEps(100, 'керамика', '#fed7aa', bC));
+ SS.addEventListener('input', render);
+ dS.addEventListener('input', render);
+ render();
+ })();
+
+ /* IV2 — Калькулятор соединений */
+ (function(){
+ let mode = 'P';
+ const mP = document.getElementById('p23-iv2-mP');
+ const mS = document.getElementById('p23-iv2-mS');
+ const out = document.getElementById('p23-iv2-out');
+ const seen = new Set();
+ let _done = false;
+
+ function setMode(m){
+ mode = m;
+ if(m === 'P'){ mP.classList.add('primary'); mS.classList.remove('primary'); }
+ else { mS.classList.add('primary'); mP.classList.remove('primary'); }
+ calc();
+ }
+ function calc(){
+ const C1 = parseFloat(document.getElementById('p23-iv2-C1').value) || 0;
+ const C2 = parseFloat(document.getElementById('p23-iv2-C2').value) || 0;
+ let html = '';
+ if(mode === 'P'){
+ const Cob = C1 + C2;
+ html += 'Параллельное соединение:
';
+ html += '$C_{общ} = C_1 + C_2 = '+C1+' + '+C2+' = '+Cob.toFixed(2)+'$ мкФ
';
+ } else {
+ const inv = 1/C1 + 1/C2;
+ const Cob = (C1*C2)/(C1+C2);
+ html += 'Последовательное соединение:
';
+ html += '$\\dfrac{1}{C_{общ}} = \\dfrac{1}{C_1} + \\dfrac{1}{C_2} = \\dfrac{1}{'+C1+'} + \\dfrac{1}{'+C2+'} = '+inv.toFixed(3)+'$ 1/мкФ
';
+ html += '$C_{общ} = \\dfrac{C_1 C_2}{C_1 + C_2} = \\dfrac{'+C1+'\\cdot '+C2+'}{'+(C1+C2)+'} = '+Cob.toFixed(3)+'$ мкФ
';
+ }
+ out.innerHTML = html;
+ renderMath(out);
+ seen.add(mode+':'+C1+':'+C2);
+ if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p23-iv2'); bumpProgress('p23', 15); }
+ }
+ mP.addEventListener('click', () => setMode('P'));
+ mS.addEventListener('click', () => setMode('S'));
+ document.getElementById('p23-iv2-go').addEventListener('click', calc);
+ ['p23-iv2-C1','p23-iv2-C2'].forEach(id => {
+ document.getElementById(id).addEventListener('keydown', e => { if(e.key === 'Enter') calc(); });
+ });
+ setMode('P');
+ })();
+
+ /* IV3 — Что увеличит ёмкость? */
+ (function(){
+ const OPTS = ['Увеличит', 'Уменьшит'];
+ const Q = [
+ { q:'Увеличить площадь пластин $S$ (при прочих равных).', ans:0, why:'$C \\propto S$ — рост $S$ увеличивает $C$.' },
+ { q:'Увеличить расстояние $d$ между пластинами.', ans:1, why:'$C \\propto 1/d$ — рост $d$ уменьшает $C$.' },
+ { q:'Заменить воздух на слюду ($\\varepsilon = 6$) между пластинами.', ans:0, why:'$C \\propto \\varepsilon$ — больший $\\varepsilon$ увеличивает $C$.' },
+ { q:'Уменьшить площадь пластин $S$ вдвое.', ans:1, why:'$C \\propto S$ — уменьшение $S$ уменьшает $C$.' },
+ { q:'Уменьшить расстояние $d$ между пластинами.', ans:0, why:'$C \\propto 1/d$ — уменьшение $d$ увеличивает $C$.' },
+ { q:'Заменить слюду ($\\varepsilon = 6$) на вакуум ($\\varepsilon = 1$).', ans:1, why:'$\\varepsilon$ уменьшится в 6 раз $\\Rightarrow C$ уменьшится.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p23-iv3-q');
+ const oEl = document.getElementById('p23-iv3-opts');
+ const fb = document.getElementById('p23-iv3-fb');
+ const iEl = document.getElementById('p23-iv3-i');
+ const sEl = document.getElementById('p23-iv3-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p23-iv3'); bumpProgress('p23', 25); }
+ else if(score >= 4){ addXp(8, 'p23-iv3'); bumpProgress('p23', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ const item = Q[i];
+ qEl.innerHTML = item.q;
+ oEl.innerHTML = OPTS.map((t, k) => '' + t + ' ').join('');
+ fb.style.display = 'none';
+ renderMath(qEl); renderMath(oEl);
+ oEl.querySelectorAll('button').forEach(b => {
+ b.addEventListener('click', () => {
+ const v = +b.dataset.v;
+ if(v === item.ans){ score++; feedback(fb, true, '✓ Верно! ' + item.why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Неверно. ' + item.why + ' Дальше ▶');
+ sEl.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 1800);
+ });
+ });
+ }
+ document.getElementById('p23-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV4 — Тренажёр конденсаторов */
+ (function(){
+ const Q = [
+ { q:'$S = 0{,}01$ м², $d = 0{,}001$ м, воздух ($\\varepsilon = 1$). Ёмкость $C$ в пФ?', ans:88.5, tol:2, hint:'$C = \\varepsilon\\varepsilon_0 S/d = 8{,}85\\cdot 10^{-12}\\cdot 0{,}01/0{,}001 \\approx 88{,}5$ пФ.' },
+ { q:'$C = 100$ мкФ, $U = 50$ В. Заряд $q$ в мКл?', ans:5, tol:0.3, hint:'$q = CU = 100\\cdot 10^{-6}\\cdot 50 = 5\\cdot 10^{-3}$ Кл $= 5$ мКл.' },
+ { q:'$C_1 = 2$ мкФ, $C_2 = 6$ мкФ, соединены параллельно. $C_{общ}$ в мкФ?', ans:8, tol:0.5, hint:'$C_{общ} = C_1 + C_2 = 2 + 6 = 8$ мкФ.' },
+ { q:'$C_1 = 2$ мкФ, $C_2 = 6$ мкФ, соединены последовательно. $C_{общ}$ в мкФ?', ans:1.5, tol:0.1, hint:'$C_{общ} = C_1 C_2 /(C_1+C_2) = 12/8 = 1{,}5$ мкФ.' },
+ { q:'$C = 200$ нФ, $U = 100$ В. Заряд конденсатора $q$ в мкКл?', ans:20, tol:1, hint:'$q = CU = 200\\cdot 10^{-9}\\cdot 100 = 2\\cdot 10^{-5}$ Кл $= 20$ мкКл.' }
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p23-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15, 'p23-iv4'); bumpProgress('p23', 25); }
+ else if(score >= 3){ addXp(8, 'p23-iv4'); bumpProgress('p23', 15); }
+ return;
+ }
+ document.getElementById('p23-iv4-i').textContent = (i+1);
+ document.getElementById('p23-iv4-s').textContent = score;
+ document.getElementById('p23-iv4-q').innerHTML = Q[i].q;
+ document.getElementById('p23-iv4-ans').value = '';
+ renderMath(document.getElementById('p23-iv4-q'));
+ document.getElementById('p23-iv4-fb').style.display = 'none';
+ }
+ function go(){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p23-iv4-fb');
+ const raw = document.getElementById('p23-iv4-ans').value.replace(',', '.');
+ const ans = parseFloat(raw);
+ if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; }
+ if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); }
+ else feedback(fb, false, '✗ Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶');
+ document.getElementById('p23-iv4-s').textContent = score;
+ i++;
+ setTimeout(show, 1800);
+ }
+ document.getElementById('p23-iv4-go').addEventListener('click', go);
+ document.getElementById('p23-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
+ document.getElementById('p23-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
wireReadBtn('p23');
}