diff --git a/frontend/textbooks/physics_10_ch5.html b/frontend/textbooks/physics_10_ch5.html
index cff47aa..c3f9e05 100644
--- a/frontend/textbooks/physics_10_ch5.html
+++ b/frontend/textbooks/physics_10_ch5.html
@@ -652,34 +652,755 @@ function wireReadBtn(paraId){
function build_p27(){
const box = document.getElementById('p27-body');
let html = '';
- html += makeCard('theory', "Магнитное поле тока", "§27", `
-
Магнитное поле тока — этот параграф в разработке (Phase 1+).
-
Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 5+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
+ /* THEORY 1 — Магнитное поле и опыт Эрстеда */
+ html += makeCard('theory', "Магнитное поле и опыт Эрстеда", "§27", `
+
Магнитное поле — особый вид материи, возникающий вокруг движущихся электрических зарядов и магнитов. Действует на другие движущиеся заряды и магниты.
+
Открытие связи электричества и магнетизма. В 1820 году датский физик обнаружил, что магнитная стрелка возле проводника с током отклоняется. Это доказало, что электрический ток создаёт магнитное поле.
+
До этого опыта электричество и магнетизм считались разными явлениями. После — стало ясно, что это разные проявления одного электромагнитного взаимодействия.
+
Главная мысль. Магнитное поле создаётся движущимися зарядами (током, движущимися частицами, постоянными магнитами) и действует на движущиеся заряды и магниты.
`);
+
+ /* THEORY 2 — Источники и свойства поля */
+ html += makeCard('rule', "Источники и свойства поля", "§27", `
+
Объяснение. Первый проводник создаёт магнитное поле в области второго; это поле действует с силой на ток во втором проводнике. Эта сила называется силой Ампера (§29).
+
Определение Ампера через силу (СИ): $1$ А — сила тока, при которой два параллельных проводника длиной $1$ м, расположенные на расстоянии $1$ м, взаимодействуют с силой $F = 2 \\cdot 10^{-7}$ Н.
+ `);
+
+ /* INTERACTIVE 1 — Опыт Эрстеда */
+ html += `
+
ИНТЕРАКТИВ 1
Опыт Эрстеда: ток отклоняет стрелку
+
Переключай ток в проводнике и смотри, как ведёт себя магнитная стрелка под ним. Без тока — стрелка показывает на север.
Переключай направление тока в каждом проводнике. Параллельные токи притягиваются, антипараллельные — отталкиваются.
+
+
$I_1$ (слева)
+
+
+
+
$I_2$ (справа)
+
+
+
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 3 — Откуда берётся поле? */
+ html += `
+
ИНТЕРАКТИВ 3
Откуда берётся магнитное поле?
+
Определи источник магнитного поля в каждой ситуации.
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
`;
+
+ /* INTERACTIVE 4 — Тренажёр */
+ html += `
+
ИНТЕРАКТИВ 4
Тренажёр: магнитное поле тока
+
5 вопросов на ключевые понятия §27.
+
Задача 1 / 5Очки: 0 / 5
+
+
+
+
+
`;
+
html += secNav(null, 'p28');
html += readButton('p27');
+
box.innerHTML = html;
renderMath(box);
+
+ /* IV1 — Опыт Эрстеда */
+ (function(){
+ const svg = document.getElementById('p27-iv1-svg');
+ const out = document.getElementById('p27-iv1-out');
+ const bOff = document.getElementById('p27-iv1-off');
+ const bR = document.getElementById('p27-iv1-right');
+ const bL = document.getElementById('p27-iv1-left');
+ const seen = new Set();
+ let _done = false;
+ let state = 'right'; // 'off' | 'right' | 'left'
+
+ function setState(s){
+ state = s;
+ [bOff,bR,bL].forEach(b => b.classList.remove('primary'));
+ ({off:bOff, right:bR, left:bL}[s]).classList.add('primary');
+ render();
+ seen.add(s);
+ if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p27-iv1'); bumpProgress('p27', 15); }
+ }
+
+ function render(){
+ const W = 480, H = 280;
+ let g = '';
+ g += '';
+ g += 'Опыт Эрстеда';
+
+ // Провод горизонтальный
+ const wireY = 110;
+ g += '';
+ g += 'Проводник';
+
+ // Стрелка направления тока на проводе
+ if(state === 'right'){
+ g += PHYS.drawArrow(180, wireY, 300, wireY, '#dc2626', 3, 14);
+ g += 'I →';
+ } else if(state === 'left'){
+ g += PHYS.drawArrow(300, wireY, 180, wireY, '#dc2626', 3, 14);
+ g += '← I';
+ } else {
+ g += 'I = 0';
+ }
+
+ // Магнитная стрелка под проводом — крутится
+ const compassX = 240, compassY = 210;
+ const compassR = 42;
+ // По умолчанию (off) — север (вверх). При токе вправо — отклоняется влево (на нас, по правилу буравчика снизу). При токе влево — вправо.
+ let angle = 0; // 0 = север (вверх), измеряется по часовой стрелке
+ if(state === 'right') angle = -75; // отклонение влево
+ else if(state === 'left') angle = 75; // отклонение вправо
+
+ // Корпус компаса
+ g += '';
+ g += 'С';
+ g += 'Ю';
+ g += 'З';
+ g += 'В';
+
+ // Стрелка компаса (вращается)
+ const rad = angle * Math.PI / 180;
+ const nx = compassX + Math.sin(rad) * (compassR - 6);
+ const ny = compassY - Math.cos(rad) * (compassR - 6);
+ const sx = compassX - Math.sin(rad) * (compassR - 6);
+ const sy = compassY + Math.cos(rad) * (compassR - 6);
+ g += '';
+ // Северный конец — красный
+ g += '';
+ // центр
+ g += '';
+
+ svg.innerHTML = g;
+
+ let txt = '';
+ if(state === 'off'){
+ txt = 'Ток выключен. Стрелка показывает на север (магнитное поле Земли).';
+ } else if(state === 'right'){
+ txt = 'Ток вправо → стрелка отклонилась влево. Проводник создал магнитное поле, повернувшее стрелку.';
+ } else {
+ txt = 'Ток влево → стрелка отклонилась вправо. Смена направления тока — смена направления поля.';
+ }
+ out.innerHTML = txt;
+ }
+
+ bOff.addEventListener('click', () => setState('off'));
+ bR.addEventListener('click', () => setState('right'));
+ bL.addEventListener('click', () => setState('left'));
+ setState('right');
+ })();
+
+ /* IV2 — Взаимодействие проводников */
+ (function(){
+ const svg = document.getElementById('p27-iv2-svg');
+ const out = document.getElementById('p27-iv2-out');
+ const b1u = document.getElementById('p27-iv2-1up');
+ const b1d = document.getElementById('p27-iv2-1dn');
+ const b2u = document.getElementById('p27-iv2-2up');
+ const b2d = document.getElementById('p27-iv2-2dn');
+ const seen = new Set();
+ let _done = false;
+ let I1 = 'up', I2 = 'up';
+
+ function setI1(v){ I1 = v; b1u.classList.toggle('primary', v==='up'); b1d.classList.toggle('primary', v==='dn'); render(); }
+ function setI2(v){ I2 = v; b2u.classList.toggle('primary', v==='up'); b2d.classList.toggle('primary', v==='dn'); render(); }
+
+ function render(){
+ const W = 480, H = 280;
+ let g = '';
+ g += '';
+ g += 'Два параллельных проводника';
+
+ // Два вертикальных провода
+ const x1 = 170, x2 = 310;
+ const yTop = 50, yBot = 230;
+ g += '';
+ g += '';
+
+ // Стрелки токов
+ if(I1 === 'up'){
+ g += PHYS.drawArrow(x1, yBot-20, x1, yTop+20, '#dc2626', 3, 12);
+ g += 'I₁ ↑';
+ } else {
+ g += PHYS.drawArrow(x1, yTop+20, x1, yBot-20, '#dc2626', 3, 12);
+ g += 'I₁ ↓';
+ }
+ if(I2 === 'up'){
+ g += PHYS.drawArrow(x2, yBot-20, x2, yTop+20, '#dc2626', 3, 12);
+ g += 'I₂ ↑';
+ } else {
+ g += PHYS.drawArrow(x2, yTop+20, x2, yBot-20, '#dc2626', 3, 12);
+ g += 'I₂ ↓';
+ }
+
+ // Силы взаимодействия
+ const sameDir = (I1 === I2);
+ const fY = 140;
+ if(sameDir){
+ // Притяжение: стрелки направлены друг к другу
+ g += PHYS.drawArrow(x1+8, fY, x1+58, fY, '#7c3aed', 3, 12);
+ g += PHYS.drawArrow(x2-8, fY, x2-58, fY, '#7c3aed', 3, 12);
+ g += 'Притяжение';
+ g += 'F';
+ g += 'F';
+ } else {
+ // Отталкивание: стрелки направлены в стороны
+ g += PHYS.drawArrow(x1+8, fY, x1-42, fY, '#0ea5e9', 3, 12);
+ g += PHYS.drawArrow(x2-8, fY, x2+42, fY, '#0ea5e9', 3, 12);
+ g += 'Отталкивание';
+ g += 'F';
+ g += 'F';
+ }
+
+ svg.innerHTML = g;
+
+ let txt = '';
+ if(sameDir){
+ txt = 'Токи параллельны (в одну сторону) → проводники притягиваются.';
+ } else {
+ txt = 'Токи антипараллельны (в разные стороны) → проводники отталкиваются.';
+ }
+ out.innerHTML = txt;
+
+ seen.add(I1+I2);
+ if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p27-iv2'); bumpProgress('p27', 15); }
+ }
+
+ b1u.addEventListener('click', () => setI1('up'));
+ b1d.addEventListener('click', () => setI1('dn'));
+ b2u.addEventListener('click', () => setI2('up'));
+ b2d.addEventListener('click', () => setI2('dn'));
+ render();
+ })();
+
+ /* IV3 — Откуда берётся поле? */
+ (function(){
+ const OPTS = ['От постоянных магнитов','От движущихся зарядов','Не существует'];
+ const Q = [
+ { q:'Возле железного магнита (на холодильнике).', ans:0, why:'Постоянный магнит — источник магнитного поля.' },
+ { q:'Вокруг проводника, по которому течёт ток.', ans:1, why:'Ток — это движущиеся заряды, создающие поле.' },
+ { q:'Возле неподвижного заряженного шарика в вакууме.', ans:2, why:'Неподвижный заряд создаёт только электрическое поле, магнитного нет.' },
+ { q:'Вокруг Земли (геомагнитное поле).', ans:1, why:'Поле создаётся токами в жидком металлическом ядре Земли.' },
+ { q:'Возле сверхпроводящего кольца без тока.', ans:2, why:'Без тока — нет движущихся зарядов, значит, нет и магнитного поля.' },
+ { q:'Возле летящего на большой скорости протона.', ans:1, why:'Движущийся заряд — то же, что ток, и тоже создаёт магнитное поле.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p27-iv3-q');
+ const oEl = document.getElementById('p27-iv3-opts');
+ const fb = document.getElementById('p27-iv3-fb');
+ const iEl = document.getElementById('p27-iv3-i');
+ const sEl = document.getElementById('p27-iv3-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p27-iv3'); bumpProgress('p27', 25); }
+ else if(score >= 4){ addXp(8, 'p27-iv3'); bumpProgress('p27', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ qEl.innerHTML = Q[i].q;
+ oEl.innerHTML = OPTS.map((t, k) => '').join('');
+ fb.style.display = 'none';
+ renderMath(qEl);
+ oEl.querySelectorAll('button').forEach(b => {
+ b.addEventListener('click', () => {
+ const v = +b.dataset.v;
+ if(v === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Верно: ' + OPTS[Q[i].ans] + '. ' + Q[i].why + ' Дальше ▶');
+ sEl.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 1800);
+ });
+ });
+ }
+ document.getElementById('p27-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV4 — Тренажёр */
+ (function(){
+ const Q = [
+ { q:'Магнитное поле создают:', opts:['любые заряды','движущиеся заряды','масса тел'], ans:1, why:'Только движущиеся заряды создают магнитное поле.' },
+ { q:'Кто в 1820 году открыл связь электричества и магнетизма?', opts:['Ньютон','Эрстед','Фарадей'], ans:1, why:'Эрстед заметил отклонение магнитной стрелки возле проводника с током.' },
+ { q:'Два параллельных проводника, токи в одну сторону. Что происходит?', opts:['притягиваются','отталкиваются','ничего'], ans:0, why:'Параллельные токи — притягиваются (опыт Ампера).' },
+ { q:'Два проводника, токи в противоположных направлениях:', opts:['притягиваются','отталкиваются','ничего'], ans:1, why:'Антипараллельные токи — отталкиваются.' },
+ { q:'Вектор магнитной индукции обозначается:', opts:['$\\vec{E}$','$\\vec{B}$','$\\vec{F}$'], ans:1, why:'$\\vec{E}$ — электрическое поле, $\\vec{F}$ — сила, $\\vec{B}$ — магнитная индукция.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p27-iv4-q');
+ const oEl = document.getElementById('p27-iv4-opts');
+ const fb = document.getElementById('p27-iv4-fb');
+ const iEl = document.getElementById('p27-iv4-i');
+ const sEl = document.getElementById('p27-iv4-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p27-iv4'); bumpProgress('p27', 25); }
+ else if(score >= 3){ addXp(8, 'p27-iv4'); bumpProgress('p27', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ qEl.innerHTML = Q[i].q;
+ oEl.innerHTML = Q[i].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 === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Верно: ' + Q[i].opts[Q[i].ans] + '. ' + Q[i].why + ' Дальше ▶');
+ sEl.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 1800);
+ });
+ });
+ }
+ document.getElementById('p27-iv4-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
wireReadBtn('p27');
}
function build_p28(){
const box = document.getElementById('p28-body');
let html = '';
- html += makeCard('theory', "Индукция магнитного поля", "§28", `
-
Индукция магнитного поля — этот параграф в разработке (Phase 1+).
-
Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.
-
- Phase 0: создан скелет учебника. Phase 5+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
-
+
+ /* THEORY 1 — Магнитная индукция */
+ html += makeCard('theory', "Магнитная индукция $\\vec{B}$", "§28", `
+
Магнитная индукция $\\vec{B}$ — векторная характеристика магнитного поля. Определяет силу, действующую на движущуюся заряженную частицу или на проводник с током.
Направление $\\vec{B}$:
+ в постоянном магните снаружи — от северного (N) к южному (S); внутри магнита — от S к N. Линии замкнуты!
`);
+
+ /* THEORY 2 — Правило буравчика */
+ html += makeCard('rule', "Правило буравчика (правой руки)", "§28", `
+
Правило буравчика определяет направление $\\vec{B}$ возле проводника с током.
+
Возьми проводник правой рукой так, чтобы большой палец указывал по направлению тока. Остальные пальцы покажут направление $\\vec{B}$ (закручивается вокруг проводника).
+
Альтернатива: представь штопор (буравчик), который вкручивается в направлении тока — ручка вращается в направлении $\\vec{B}$.
+
Линии магнитной индукции вокруг прямого проводника: концентрические окружности в плоскости, перпендикулярной проводнику.
+
Свойства линий индукции:
+
+
Замкнуты — главное отличие от электрических линий (магнитных монополей не существует).
+
Не пересекаются.
+
Густота линий $\\propto B$ (чем гуще, тем сильнее поле).
+
Направлены от N к S снаружи магнита.
+
+ `);
+
+ /* THEORY 3 — Поле кругового тока и соленоида */
+ html += makeCard('example', "Поле кругового тока и соленоида", "§28", `
+
Поле кругового тока (витка): линии индукции образуют картину, похожую на поле магнитного диполя. Виток ведёт себя как маленький магнит:
+
+
Одна сторона — N (магнитные линии выходят).
+
Другая сторона — S (входят).
+
+
Соленоид — катушка из многих витков. Поле внутри:
+
+
Почти однородное (одинаковое по величине и направлению).
+
Очень похоже на поле в постоянном магните.
+
Направление — правило правой руки для тока в витках.
+
+
Модуль индукции внутри длинного соленоида:
+
$$B = \\dfrac{\\mu_0 N I}{L}$$
+
где $N$ — число витков, $L$ — длина соленоида, $\\mu_0 = 4\\pi \\cdot 10^{-7}$ Тл·м/А — магнитная постоянная.
+
Электромагнит — соленоид + железный сердечник. Сердечник усиливает поле в сотни и тысячи раз. Применение: моторы, реле, динамики, МРТ-сканеры, ускорители частиц, левитирующие поезда.
+ `);
+
+ /* INTERACTIVE 1 — Правило буравчика */
+ html += `
+
ИНТЕРАКТИВ 1
Правило буравчика: $\\vec{B}$ возле проводника
+
Переключай направление тока. Смотри, как меняется направление линий $\\vec{B}$ (вид сверху, ток идёт сквозь экран).
+
+
+
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 2 — Соленоид */
+ html += `
+
ИНТЕРАКТИВ 2
Магнитное поле соленоида
+
Меняй ток $I$ и число витков $N$. Длина соленоида $L = 0{,}1$ м. Формула: $B = \\mu_0 N I / L$.
+
+
+
+
+
+
+
+
+
`;
+
+ /* INTERACTIVE 3 — Куда направлено B? */
+ html += `
+
ИНТЕРАКТИВ 3
Куда направлено $\\vec{B}$?
+
Выбери, как определяется (или существует ли вообще) магнитное поле в каждой ситуации.
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
`;
+
+ /* INTERACTIVE 4 — Тренажёр */
+ html += `
+
ИНТЕРАКТИВ 4
Тренажёр: индукция магнитного поля
+
5 вопросов на ключевые понятия §28.
+
Задача 1 / 5Очки: 0 / 5
+
+
+
+
+
`;
+
html += secNav('p27', 'p29');
html += readButton('p28');
+
box.innerHTML = html;
renderMath(box);
+
+ /* IV1 — Правило буравчика */
+ (function(){
+ const svg = document.getElementById('p28-iv1-svg');
+ const out = document.getElementById('p28-iv1-out-txt');
+ const bOut = document.getElementById('p28-iv1-out');
+ const bIn = document.getElementById('p28-iv1-in');
+ const seen = new Set();
+ let _done = false;
+ let dir = 'out'; // 'out' or 'in'
+
+ function setDir(d){
+ dir = d;
+ bOut.classList.toggle('primary', d==='out');
+ bIn.classList.toggle('primary', d==='in');
+ render();
+ seen.add(d);
+ if(!_done && seen.size >= 2){ _done = true; addXp(10, 'p28-iv1'); bumpProgress('p28', 15); }
+ }
+
+ function render(){
+ const W = 480, H = 280;
+ let g = '';
+ g += '';
+ g += 'Поле прямого тока (вид вдоль проводника)';
+
+ // Центральный проводник
+ const cx = 240, cy = 150;
+ const wireColor = '#0f172a';
+
+ // Концентрические окружности — линии B
+ const rings = [40, 70, 100, 130];
+ const Bcolor = '#7c3aed';
+ rings.forEach(r => {
+ g += '';
+ });
+
+ // Стрелки касательные к окружностям — направление B по правилу буравчика
+ // При токе ИЗ экрана (•) — B по часовой стрелке снизу? Нет: правая рука, большой палец на нас (out), пальцы — против часовой стрелки.
+ // Считаю: ток OUT (на наблюдателя) → B против часовой стрелки.
+ // ток IN (от наблюдателя) → B по часовой стрелке.
+ const ccw = (dir === 'out');
+ const arrowAngles = [0, Math.PI/2, Math.PI, 3*Math.PI/2]; // 4 стрелки на каждой окружности
+ rings.forEach((r, idx) => {
+ if(idx % 2 !== 0) return; // только на двух окружностях
+ arrowAngles.forEach((a, k) => {
+ const ax = cx + r * Math.cos(a);
+ const ay = cy + r * Math.sin(a);
+ // Касательный вектор
+ const tx = -Math.sin(a) * (ccw ? -1 : 1);
+ const ty = Math.cos(a) * (ccw ? -1 : 1);
+ const len = 16;
+ const x2 = ax + tx * len;
+ const y2 = ay + ty * len;
+ g += PHYS.drawArrow(ax, ay, x2, y2, Bcolor, 2, 8);
+ });
+ });
+
+ // Проводник в центре — крест или точка
+ g += '';
+ if(dir === 'in'){
+ // Крест ×
+ g += '';
+ g += '';
+ } else {
+ // Точка •
+ g += '';
+ }
+
+ // Подпись
+ const lbl = dir === 'out' ? 'Ток I из экрана (•)' : 'Ток I в экран (×)';
+ g += ''+lbl+'';
+ // Подпись B
+ g += 'B';
+
+ svg.innerHTML = g;
+
+ let txt = '';
+ if(dir === 'out'){
+ txt = 'Ток направлен ИЗ экрана (на тебя). Правило буравчика: большой палец на тебя → линии $\\vec{B}$ против часовой стрелки.';
+ } else {
+ txt = 'Ток направлен В экран (от тебя). Правило буравчика: большой палец от тебя → линии $\\vec{B}$ по часовой стрелке.';
+ }
+ out.innerHTML = txt;
+ renderMath(out);
+ }
+
+ bOut.addEventListener('click', () => setDir('out'));
+ bIn.addEventListener('click', () => setDir('in'));
+ setDir('out');
+ })();
+
+ /* IV2 — Соленоид */
+ (function(){
+ const svg = document.getElementById('p28-iv2-svg');
+ const out = document.getElementById('p28-iv2-out');
+ const IS = document.getElementById('p28-iv2-I');
+ const NS = document.getElementById('p28-iv2-N');
+ const IL = document.getElementById('p28-iv2-IL');
+ const NL = document.getElementById('p28-iv2-NL');
+ const seen = new Set();
+ let _done = false;
+
+ function render(){
+ const I = +IS.value, N = +NS.value;
+ IL.textContent = I.toFixed(1);
+ NL.textContent = N.toFixed(0);
+ const L = 0.1; // м
+ const mu0 = 4 * Math.PI * 1e-7;
+ const B = mu0 * N * I / L;
+
+ const W = 480, H = 280;
+ let g = '';
+ g += '';
+ g += 'Соленоид: однородное поле внутри';
+
+ // Соленоид — нарисуем как ряд овалов (витков) горизонтально
+ const cy = 145;
+ const xL = 90, xR = 390;
+ const numVisible = Math.min(20, Math.max(5, Math.round(N/5)));
+ const stepX = (xR - xL) / (numVisible - 1);
+ const Bcolor = '#7c3aed';
+
+ // Корпус соленоида
+ g += '';
+
+ // Витки как петли
+ for(let i = 0; i < numVisible; i++){
+ const x = xL + i * stepX;
+ g += '';
+ // Точка на верхушке (ток на нас) или крест внизу (от нас) — упрощённо
+ g += '';
+ // Крест внизу
+ g += '';
+ g += '';
+ }
+
+ // Внутреннее поле — стрелки слева направо (зависит от направления намотки, считаем что N справа)
+ if(I > 0.01){
+ const nArrows = 5;
+ for(let k = 0; k < nArrows; k++){
+ const ax = xL + 30 + k * ((xR-xL-60)/(nArrows-1));
+ const arrowLen = Math.min(50, 20 + (B * 1e3) * 8);
+ g += PHYS.drawArrow(ax - arrowLen/2, cy, ax + arrowLen/2, cy, Bcolor, 2.5, 10);
+ }
+ // Подписи полюсов
+ g += 'S';
+ g += 'N';
+
+ // Линии поля снаружи (упрощённо — две дуги)
+ g += '';
+ g += '';
+ } else {
+ g += 'I = 0 → поля нет';
+ }
+
+ // Метка B
+ if(I > 0.01) g += 'B';
+
+ svg.innerHTML = g;
+
+ out.innerHTML = '$B = \\dfrac{\\mu_0 N I}{L} = \\dfrac{4\\pi\\cdot 10^{-7}\\cdot '+N.toFixed(0)+'\\cdot '+I.toFixed(2)+'}{0{,}1} = '+B.toExponential(2).replace('e','\\cdot 10^{').replace('+','')+'}$ Тл';
+ renderMath(out);
+
+ seen.add(I.toFixed(1)+':'+N.toFixed(0));
+ if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p28-iv2'); bumpProgress('p28', 15); }
+ }
+
+ IS.addEventListener('input', render);
+ NS.addEventListener('input', render);
+ render();
+ })();
+
+ /* IV3 — Куда направлено B? */
+ (function(){
+ const OPTS = ['От N к S','По правилу буравчика','От заряда','$\\vec{B} = 0$'];
+ const Q = [
+ { q:'Снаружи постоянного магнита (вне корпуса).', ans:0, why:'Снаружи магнита линии $\\vec{B}$ идут от северного полюса к южному.' },
+ { q:'Возле прямого проводника с током.', ans:1, why:'Используем правило правой руки (буравчика).' },
+ { q:'Внутри сверхпроводящего кольца без тока.', ans:3, why:'Нет тока — нет источника поля, $\\vec{B} = 0$.' },
+ { q:'В вакууме вдали от любых источников.', ans:3, why:'Без источников $\\vec{B} = 0$.' },
+ { q:'Внутри соленоида с током.', ans:1, why:'Направление определяется правилом правой руки для тока в витках.' },
+ { q:'В точке посередине между двумя одинаковыми параллельными токами одного направления.', ans:3, why:'Поля от двух проводников в этой точке направлены противоположно и взаимно компенсируются.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p28-iv3-q');
+ const oEl = document.getElementById('p28-iv3-opts');
+ const fb = document.getElementById('p28-iv3-fb');
+ const iEl = document.getElementById('p28-iv3-i');
+ const sEl = document.getElementById('p28-iv3-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p28-iv3'); bumpProgress('p28', 25); }
+ else if(score >= 4){ addXp(8, 'p28-iv3'); bumpProgress('p28', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ qEl.innerHTML = Q[i].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 === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Верно: ' + OPTS[Q[i].ans] + '. ' + Q[i].why + ' Дальше ▶');
+ sEl.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 1800);
+ });
+ });
+ }
+ document.getElementById('p28-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
+ /* IV4 — Тренажёр */
+ (function(){
+ const Q = [
+ { q:'Единица измерения магнитной индукции в СИ:', opts:['Тесла (Тл)','Вольт (В)','Ампер (А)'], ans:0, why:'$1$ Тл $= 1$ Н/(А·м).' },
+ { q:'Магнитное поле Земли по порядку величины (в Тл):', opts:['$5\\cdot 10^{-5}$','$5\\cdot 10^{-2}$','$5\\cdot 10^{1}$'], ans:0, why:'Геомагнитное поле слабое: $\\sim 5\\cdot 10^{-5}$ Тл.' },
+ { q:'Направление $\\vec{B}$ возле прямого проводника находят:', opts:['по закону Ома','по правилу буравчика','по второму закону Ньютона'], ans:1, why:'Правило правой руки (буравчика): большой палец — по току, пальцы — по $\\vec{B}$.' },
+ { q:'Коэффициент $\\mu_0$ в формуле $B = \\mu_0 N I / L$ равен:', opts:['$4\\pi\\cdot 10^{-7}$ Тл·м/А','$8{,}85\\cdot 10^{-12}$ Ф/м','$9\\cdot 10^{9}$ Н·м²/Кл²'], ans:0, why:'$\\mu_0 = 4\\pi\\cdot 10^{-7}$ Тл·м/А — магнитная постоянная.' },
+ { q:'Линии магнитной индукции замкнуты, потому что:', opts:['поле слабое','магнитных монополей не существует','так удобно рисовать'], ans:1, why:'В природе нет отдельных «северных» или «южных» зарядов, поэтому линии $\\vec{B}$ всегда замкнуты.' }
+ ];
+ let i = 0, score = 0;
+ const qEl = document.getElementById('p28-iv4-q');
+ const oEl = document.getElementById('p28-iv4-opts');
+ const fb = document.getElementById('p28-iv4-fb');
+ const iEl = document.getElementById('p28-iv4-i');
+ const sEl = document.getElementById('p28-iv4-s');
+
+ function show(){
+ if(i >= Q.length){
+ qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length;
+ oEl.innerHTML = '';
+ if(score === Q.length){ addXp(15, 'p28-iv4'); bumpProgress('p28', 25); }
+ else if(score >= 3){ addXp(8, 'p28-iv4'); bumpProgress('p28', 15); }
+ return;
+ }
+ iEl.textContent = (i+1);
+ sEl.textContent = score;
+ qEl.innerHTML = Q[i].q;
+ oEl.innerHTML = Q[i].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 === Q[i].ans){ score++; feedback(fb, true, '✓ Верно! ' + Q[i].why + ' Дальше ▶'); }
+ else feedback(fb, false, '✗ Верно: ' + Q[i].opts[Q[i].ans] + '. ' + Q[i].why + ' Дальше ▶');
+ sEl.textContent = score;
+ oEl.querySelectorAll('button').forEach(x => x.disabled = true);
+ i++;
+ setTimeout(show, 1800);
+ });
+ });
+ }
+ document.getElementById('p28-iv4-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
+ show();
+ })();
+
wireReadBtn('p28');
}