diff --git a/frontend/textbooks/physics_10_ch3.html b/frontend/textbooks/physics_10_ch3.html
index 1f85ab8..76c3f94 100644
--- a/frontend/textbooks/physics_10_ch3.html
+++ b/frontend/textbooks/physics_10_ch3.html
@@ -2081,34 +2081,717 @@ function build_p19(){
function build_p20(){
const box = document.getElementById('p20-body');
let html = '';
+
+ /* THEORY 1 — Линии напряжённости */
html += makeCard('theory', "Линии напряжённости", "§20", `
-
Линии напряжённости — этот параграф в разработке (Phase 1+).
-
Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
Силовая линия (линия напряжённости) — это линия, касательная к которой в каждой точке совпадает с направлением вектора $\\vec{E}$.
+
Свойства силовых линий:
+
+
Линии начинаются на положительных зарядах (или на бесконечности) и заканчиваются на отрицательных (или уходят на бесконечность).
+
Силовые линии не пересекаются между собой — в каждой точке поле имеет только одно направление.
+
Густота линий пропорциональна величине напряжённости $E$: где линии гуще — поле сильнее.
+
Линии перпендикулярны заряженной поверхности проводника.
+
+
Картина силовых линий — это способ визуализации невидимого поля. Чтобы «увидеть» $\\vec{E}$, мы рисуем «карту» из линий.
`);
+
+ /* THEORY 2 — Поле точечного заряда и системы зарядов */
+ html += makeCard('rule', "Поле точечного заряда и системы зарядов", "§20", `
+
Поле точечного заряда: линии напряжённости — радиальные.
+
+
От $+q$ — расходятся наружу.
+
К $-q$ — сходятся внутрь.
+
В точке самого заряда линии расходятся бесконечно, плотность бесконечна.
+
+
Поле двух одноимённых зарядов $+q$ и $+q$: линии расходятся от обоих зарядов и отталкиваются друг от друга. В середине между зарядами — точка равновесия ($E = 0$, поля компенсируются).
+
Поле двух разноимённых зарядов $+q$ и $-q$ (диполь): линии идут от $+q$ к $-q$, образуя характерную картину (похожую на поле магнита!). В центре между зарядами поле направлено от $+q$ к $-q$.
+ `);
+
+ /* THEORY 3 — Однородное и неоднородное поле */
+ html += makeCard('example', "Однородное и неоднородное поле", "§20", `
+
Однородное поле — поле, в котором $\\vec{E}$ одинакова во всех точках:
+
+
по модулю,
+
по направлению.
+
+
Силовые линии однородного поля — параллельные и одинаково расположенные.
+
Где встречается:
+
+
Между пластинами параллельного плоского конденсатора (вдали от краёв).
+
В небольшой области вблизи поверхности большого равномерно заряженного тела.
+
+
В однородном поле сила $\\vec{F} = q\\vec{E}$ везде одинакова, а поле описывается одним вектором $\\vec{E}$.
+
Неоднородное поле — поле, где $\\vec{E}$ меняется от точки к точке. Примеры: поле точечного заряда, поле системы зарядов, поле заряженной сферы снаружи.
+ `);
+
+ /* INTERACTIVE 1 — Картины полей */
+ html += `
+
ИНТЕРАКТИВ 1
Картины полей — 5 конфигураций
+
Переключай тип конфигурации и наблюдай характерную картину силовых линий. Это главный визуализатор электростатики!
+
+
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 2 — Свойства силовых линий (квикфайр) */
+ html += `
+
ИНТЕРАКТИВ 2
Свойства силовых линий
+
6 вопросов на понимание свойств линий поля.
+
Вопрос 1 / 6Очки: 0 / 6
+
+
+
+
+
`;
+
+ /* INTERACTIVE 3 — Какая картина соответствует конфигурации? */
+ html += `
+
ИНТЕРАКТИВ 3
Какая картина соответствует конфигурации?
+
Выбери тип картины силовых линий для каждой конфигурации зарядов.
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
`;
+
+ /* INTERACTIVE 4 — Тренажёр поля */
+ html += `
+
ИНТЕРАКТИВ 4
Тренажёр поля
+
5 задач на свойства поля и силовых линий.
+
Задача 1 / 5Очки: 0 / 5
+
+
+ ответ =
+
+
+
+
+
+
`;
+
html += secNav('p19', 'p21');
html += readButton('p20');
+
box.innerHTML = html;
renderMath(box);
+
+ /* IV1 — Картины полей (5 конфигураций) */
+ (function(){
+ const svg = document.getElementById('p20-iv1-svg');
+ const tS = document.getElementById('p20-iv1-t');
+ const tL = document.getElementById('p20-iv1-tL');
+ const out = document.getElementById('p20-iv1-out');
+ const seen = new Set();
+ let _done = false;
+
+ const NAMES = {
+ 1: 'Точечный заряд $+q$',
+ 2: 'Точечный заряд $-q$',
+ 3: 'Два одноимённых $+q$, $+q$',
+ 4: 'Диполь $+q$, $-q$',
+ 5: 'Однородное поле'
+ };
+ const DESC = {
+ 1: 'Радиальные линии расходятся от заряда наружу. $E$ максимально у заряда, убывает как $1/r^2$.',
+ 2: 'Радиальные линии сходятся к заряду. Картина симметрична относительно центра.',
+ 3: 'Линии расходятся от каждого заряда и отталкиваются друг от друга. В середине — точка равновесия $E = 0$.',
+ 4: 'Линии идут от $+q$ к $-q$. В центре между зарядами поле максимально и направлено от $+$ к $-$.',
+ 5: 'Линии параллельны и одинаково расположены. $\\vec{E}$ одинакова во всех точках. Создаётся между пластинами конденсатора.'
+ };
+
+ function render(){
+ const t = +tS.value;
+ tL.textContent = t;
+ const W = 480, H = 360, cx = W/2, cy = H/2;
+ let g = '';
+ g += '';
+ g += 'Конфигурация '+t+': '+(t===1?'точечный +q':t===2?'точечный −q':t===3?'два одноимённых ++':t===4?'диполь +−':'однородное поле')+'';
+
+ if(t === 1){
+ // Точечный +q — радиальные линии наружу
+ g += PHYS.fieldLinesPointCharge(cx, cy, +1, 140, 16);
+ g += PHYS.chargeMark(cx, cy, +1, 22, '');
+ } else if(t === 2){
+ // Точечный -q — радиальные линии внутрь
+ g += PHYS.fieldLinesPointCharge(cx, cy, -1, 140, 16);
+ g += PHYS.chargeMark(cx, cy, -1, 22, '');
+ } else if(t === 3){
+ // Два одноимённых +q +q
+ const x1 = cx - 90, x2 = cx + 90;
+ // Радиальные линии от каждого, но с пропуском внутреннего сектора (где линии бы отталкивались)
+ function radial(xC, yC, sign, skipAngleRange){
+ let s = '';
+ const N = 14;
+ const color = sign > 0 ? '#dc2626' : '#2563eb';
+ for(let i=0;i skipAngleRange[0] && aDeg < skipAngleRange[1]) continue;
+ }
+ const r1 = 18, r2 = 95;
+ const x1 = xC + r1*Math.cos(a), y1 = yC + r1*Math.sin(a);
+ const x2 = xC + r2*Math.cos(a), y2 = yC + r2*Math.sin(a);
+ if(sign > 0) s += PHYS.drawArrow(x1, y1, x2, y2, color, 1.3, 6);
+ else s += PHYS.drawArrow(x2, y2, x1, y1, color, 1.3, 6);
+ }
+ return s;
+ }
+ // Левый заряд: пропускаем углы вправо (направление к другому заряду)
+ g += radial(x1, cy, +1, [340, 360]);
+ g += radial(x1, cy, +1, [0, 20]);
+ g += radial(x2, cy, +1, [160, 200]);
+ // Точка равновесия
+ g += '';
+ g += 'E=0';
+ g += PHYS.chargeMark(x1, cy, +1, 22, '');
+ g += PHYS.chargeMark(x2, cy, +1, 22, '');
+ } else if(t === 4){
+ // Диполь +q, -q
+ const x1 = cx - 90, x2 = cx + 90;
+ // Прямая линия между зарядами
+ g += PHYS.drawArrow(x1+22, cy, x2-22, cy, '#7c3aed', 2.2, 9);
+ // Дуги: от +q к -q сверху и снизу
+ function dipoleArc(yOffset, color){
+ // Кривая Безье из (x1, cy) в (x2, cy) через (cx, cy+yOffset)
+ // Превратим в полилинию из стрелок
+ const N = 8;
+ let prevX = x1+22, prevY = cy;
+ let s = '';
+ for(let i=1;i<=N;i++){
+ const t = i/N;
+ // Quadratic Bezier
+ const bx = (1-t)*(1-t)*(x1+22) + 2*(1-t)*t*cx + t*t*(x2-22);
+ const by = (1-t)*(1-t)*cy + 2*(1-t)*t*(cy+yOffset) + t*t*cy;
+ if(i === N || i % 2 === 0){
+ s += PHYS.drawArrow(prevX, prevY, bx, by, color, 1.4, (i===N?7:0));
+ } else {
+ s += '';
+ }
+ prevX = bx; prevY = by;
+ }
+ return s;
+ }
+ g += dipoleArc(-60, '#7c3aed');
+ g += dipoleArc(+60, '#7c3aed');
+ g += dipoleArc(-110, '#7c3aed');
+ g += dipoleArc(+110, '#7c3aed');
+ // Линии, уходящие за пределы (от +q налево, от -q направо — наоборот, к -q справа)
+ // Линия влево от +q
+ g += PHYS.drawArrow(x1-22, cy, x1-90, cy, '#7c3aed', 1.4, 7);
+ // Линия вправо к -q (приходит)
+ g += PHYS.drawArrow(x2+90, cy, x2+22, cy, '#7c3aed', 1.4, 7);
+ g += PHYS.chargeMark(x1, cy, +1, 22, '');
+ g += PHYS.chargeMark(x2, cy, -1, 22, '');
+ } else {
+ // Однородное поле: параллельные стрелки
+ // Условные пластины слева и справа
+ g += '';
+ g += '';
+ g += '+';
+ g += '−';
+ // 8 параллельных стрелок
+ const rows = 7;
+ for(let i = 0; i < rows; i++){
+ const y = 90 + i * 32;
+ g += PHYS.drawArrow(70, y, 410, y, '#7c3aed', 2.0, 9);
+ }
+ g += '$\\vec{E}$ = const во всех точках';
+ }
+
+ svg.innerHTML = g;
+ out.innerHTML = ''+NAMES[t]+'. '+DESC[t];
+ renderMath(out);
+
+ seen.add(t);
+ if(!_done && seen.size >= 5){ _done = true; addXp(10, 'p20-iv1'); bumpProgress('p20', 15); }
+ }
+ tS.addEventListener('input', render);
+ render();
+ })();
+
+ /* IV2 — Свойства силовых линий (квикфайр да/нет с вариантами) */
+ (function(){
+ const Q = [
+ { q:'Могут ли две силовые линии пересекаться?', opts:['Да', 'Нет'], ans:1, why:'Нет: в точке пересечения было бы два направления поля одновременно — противоречие.' },
+ { q:'Где линии плотнее (гуще)?', opts:['Возле заряда', 'Вдали от заряда'], ans:0, why:'Возле заряда: там $E$ больше, плотность линий пропорциональна $E$.' },
+ { q:'Куда направлены линии от положительного заряда $+q$?', opts:['От заряда (наружу)', 'К заряду (внутрь)'], ans:0, why:'От $+q$ линии расходятся наружу.' },
+ { q:'Куда направлены линии к отрицательному заряду $-q$?', opts:['От заряда', 'К заряду (внутрь)'], ans:1, why:'К $-q$ линии сходятся внутрь.' },
+ { q:'Что показывает густота силовых линий?', opts:['Величину $E$', 'Знак заряда'], ans:0, why:'Густота пропорциональна $E$: где гуще — поле сильнее.' },
+ { q:'Как направлены линии в однородном поле?', opts:['Радиально', 'Параллельно друг другу'], ans:1, why:'Параллельно: $\\vec{E}$ одинакова во всех точках по модулю и направлению.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p20-iv2-q');
+ const oEl = document.getElementById('p20-iv2-opts');
+ const fb = document.getElementById('p20-iv2-fb');
+ const iEl = document.getElementById('p20-iv2-i');
+ const sEl = document.getElementById('p20-iv2-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p20-iv2'); bumpProgress('p20', 25); }
+ else if(score >= 4){ addXp(8, 'p20-iv2'); bumpProgress('p20', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ const item = Q[i];
+ qEl.innerHTML = item.q;
+ oEl.innerHTML = item.opts.map((t, k) => '').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, 1700);
+ });
+ });
+ }
+ document.getElementById('p20-iv2-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV3 — Какая картина соответствует конфигурации? */
+ (function(){
+ const OPTS = ['Радиальные от центра', 'Радиальные к центру', 'Диполь (от + к −)', 'Параллельные'];
+ const Q = [
+ { q:'Точечный заряд $+q$ в центре.', ans:0, why:'Линии расходятся радиально от $+q$ наружу.' },
+ { q:'Точечный заряд $-q$ в центре.', ans:1, why:'Линии сходятся радиально к $-q$ внутрь.' },
+ { q:'Два заряда: $+q$ и $-q$.', ans:2, why:'Это классическая картина диполя: линии идут от $+q$ к $-q$.' },
+ { q:'Между пластинами заряженного конденсатора.', ans:3, why:'В однородном поле линии параллельны и одинаково расположены.' },
+ { q:'Заряженная положительно сфера, точка снаружи.', ans:0, why:'Снаружи сфера действует как точечный заряд: линии радиально от центра.' },
+ { q:'Два одноимённых заряда $+q$ и $+q$.', ans:0, why:'От каждого заряда линии расходятся радиально (ближе всего к этой картине). В центре между ними — точка $E = 0$.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p20-iv3-q');
+ const oEl = document.getElementById('p20-iv3-opts');
+ const fb = document.getElementById('p20-iv3-fb');
+ const iEl = document.getElementById('p20-iv3-i');
+ const sEl = document.getElementById('p20-iv3-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p20-iv3'); bumpProgress('p20', 25); }
+ else if(score >= 4){ addXp(8, 'p20-iv3'); bumpProgress('p20', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ const item = Q[i];
+ qEl.innerHTML = item.q;
+ oEl.innerHTML = OPTS.map((t, k) => '').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, 1700);
+ });
+ });
+ }
+ document.getElementById('p20-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV4 — Тренажёр поля */
+ (function(){
+ const Q = [
+ { q:'В однородном поле линии параллельны? Введи $1$ (да) или $2$ (нет).', ans:1, tol:0.1, hint:'Да: однородное поле — параллельные линии.' },
+ { q:'В точке между двумя одинаковыми $+q$ зарядами $E = ?$ В/м (для симметрии).', ans:0, tol:0.1, hint:'Поля от одинаковых зарядов компенсируются в середине — $E = 0$.' },
+ { q:'$E \\propto 1/r^2$. На каком $r$ (м) напряжённость уменьшится в $9$ раз по сравнению с $r_0 = 1$ м?', ans:3, tol:0.1, hint:'$E \\propto 1/r^2$: в $9$ раз меньше $\\Rightarrow r^2 = 9 \\Rightarrow r = 3$ м.' },
+ { q:'Густота линий в точке означает: $1$ = величину $E$, $2$ = направление $E$, $3$ = знак заряда.', ans:1, tol:0.1, hint:'Густота линий пропорциональна модулю $E$.' },
+ { q:'Силовая линия в точке указывает направление: $1$ = на источник, $2$ = вектора $\\vec{E}$, $3$ = случайно.', ans:2, tol:0.1, hint:'По определению, касательная к силовой линии в каждой точке совпадает с $\\vec{E}$.' }
+ ];
+ let i = 0, score = 0;
+ function show(){
+ if(i >= Q.length){
+ document.getElementById('p20-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ if(score === Q.length){ addXp(15, 'p20-iv4'); bumpProgress('p20', 25); }
+ else if(score >= 3){ addXp(8, 'p20-iv4'); bumpProgress('p20', 15); }
+ return;
+ }
+ document.getElementById('p20-iv4-i').textContent = (i+1);
+ document.getElementById('p20-iv4-s').textContent = score;
+ document.getElementById('p20-iv4-q').innerHTML = Q[i].q;
+ document.getElementById('p20-iv4-ans').value = '';
+ renderMath(document.getElementById('p20-iv4-q'));
+ document.getElementById('p20-iv4-fb').style.display = 'none';
+ }
+ function go(){
+ if(i >= Q.length) return;
+ const fb = document.getElementById('p20-iv4-fb');
+ const raw = document.getElementById('p20-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('p20-iv4-s').textContent = score;
+ i++;
+ setTimeout(show, 1800);
+ }
+ document.getElementById('p20-iv4-go').addEventListener('click', go);
+ document.getElementById('p20-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
+ document.getElementById('p20-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
wireReadBtn('p20');
}
function build_p21(){
const box = document.getElementById('p21-body');
let html = '';
- html += makeCard('theory', "Работа поля. Потенциал", "§21", `
-
Работа поля. Потенциал — этот параграф в разработке (Phase 1+).
-
Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
+ /* THEORY 1 — Работа однородного электростатического поля */
+ html += makeCard('theory', "Работа однородного электростатического поля", "§21", `
+
В однородном поле напряжённостью $\\vec{E}$ на заряд $q$ действует сила $\\vec{F} = q\\vec{E}$. При перемещении заряда на расстояние $d$ под углом $\\alpha$ к силе:
+
$$A = Fd\\cos\\alpha = qEd\\cos\\alpha$$
+
Очень важно: работа электростатического поля не зависит от формы траектории — только от начального и конечного положений заряда.
+
Поле, обладающее этим свойством, называется потенциальным (= консервативным).
+
Следствие: работа по замкнутой траектории равна нулю — $A_{замкн} = 0$.
`);
+
+ /* THEORY 2 — Потенциал */
+ html += makeCard('rule', "Потенциал электростатического поля", "§21", `
+
Потенциал $\\varphi$ — скалярная энергетическая характеристика электростатического поля в данной точке. Определяется как отношение потенциальной энергии пробного заряда $W_p$ к величине этого заряда:
+
$$\\varphi = \\dfrac{W_p}{q_{пр}}$$
+
Единица измерения:Вольт (В) $= 1$ Дж / Кл.
+
Потенциал точечного заряда $q$ на расстоянии $r$:
+
$$\\varphi = k\\,\\dfrac{q}{r}$$
+
Знак потенциала совпадает со знаком заряда (для точечного заряда). На бесконечности $\\varphi = 0$.
+
Принцип суперпозиции для потенциала: $\\varphi = \\varphi_1 + \\varphi_2 + \\ldots$ — потенциалы складываются алгебраически (со знаками!), не векторно.
+ `);
+
+ /* THEORY 3 — Работа через потенциал */
+ html += makeCard('example', "Связь работы с потенциалом", "§21", `
+
Работа поля при перемещении заряда $q$ из точки 1 в точку 2: