diff --git a/frontend/textbooks/physics_10_ch3.html b/frontend/textbooks/physics_10_ch3.html index ea24aa4..1f85ab8 100644 --- a/frontend/textbooks/physics_10_ch3.html +++ b/frontend/textbooks/physics_10_ch3.html @@ -1365,34 +1365,716 @@ function build_p17(){ function build_p18(){ const box = document.getElementById('p18-body'); let html = ''; + + /* THEORY 1 — Понятие поля */ html += makeCard('theory', "Электростатическое поле", "§18", ` -

Электростатическое поле — этот параграф в разработке (Phase 1+).

-

Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.

-

- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019). -

+

Электростатическое поле — особый вид материи, который существует вокруг электрических зарядов и проявляется в действии на другие заряды.

+

До открытия поля физики верили в «дальнодействие» — мгновенное действие на расстоянии. Однако опыты с движущимися зарядами показали, что взаимодействие распространяется с конечной скоростью (скоростью света). Носителем этого взаимодействия является электромагнитное поле.

+

Электростатическое поле создаётся неподвижными зарядами и не меняется со временем.

+

Подобно тому, как магнит создаёт магнитное поле, а Земля создаёт гравитационное поле, электрический заряд создаёт электростатическое поле.

`); + + /* THEORY 2 — Свойства поля */ + html += makeCard('rule', "Свойства электростатического поля", "§18", ` +

Свойства электростатического поля:

+ +

Поля могут создаваться:

+ +

В этом параграфе мы изучим электростатическое поле — поле неподвижных зарядов. Его характеристики не зависят от времени.

+ `); + + /* THEORY 3 — Пробный заряд и источник */ + html += makeCard('example', "Пробный заряд и источник", "§18", ` +

Пробный заряд $q_{пр}$ — это очень маленький положительный заряд, который вносится в исследуемую точку поля для измерения характеристик поля.

+

Условия для пробного заряда:

+
    +
  1. Должен быть малым, чтобы своим полем не искажать исходное поле.
  2. +
  3. По общему соглашению — положительным, чтобы направление силы совпадало с направлением поля.
  4. +
+

Источник поля — заряд (или система зарядов), создающий поле.

+

Аналогия: чтобы измерить силу ветра, мы выставляем флюгер (пробный объект). Так же, чтобы измерить поле, мы помещаем в точку пробный заряд и смотрим, какая сила на него действует.

+

Поле существует независимо от того, есть в точке пробный заряд или нет. Поле — это объективная физическая реальность.

+ `); + + /* INTERACTIVE 1 — Визуализатор электростатического поля */ + html += `
+
ИНТЕРАКТИВ 1
Визуализатор электростатического поля
+
Меняй знак и величину заряда — увидишь линии поля. Добавь пробный заряд — увидишь силу, действующую на него.
+
+ + +
+
+ +
+
+
`; + + /* INTERACTIVE 2 — Понятие поля */ + html += `
+
ИНТЕРАКТИВ 2
Понятие поля
+
5 вопросов о природе и свойствах электростатического поля.
+
Вопрос 1 / 5Очки: 0 / 5
+
+
+
+
+
`; + + /* INTERACTIVE 3 — Существует ли поле? */ + html += `
+
ИНТЕРАКТИВ 3
Существует ли поле?
+
6 ситуаций — есть ли в указанной точке электростатическое поле?
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
`; + + /* INTERACTIVE 4 — Кратко: что такое поле */ + html += `
+
ИНТЕРАКТИВ 4
Кратко: что такое поле
+
4 быстрых вопроса. Выбери номер правильного варианта.
+
Вопрос 1 / 4Очки: 0 / 4
+
+
+
+
+
`; + html += secNav('p17', 'p19'); html += readButton('p18'); + box.innerHTML = html; renderMath(box); + + /* IV1 — Визуализатор электростатического поля */ + (function(){ + const svg = document.getElementById('p18-iv1-svg'); + const qS = document.getElementById('p18-iv1-q'); + const nS = document.getElementById('p18-iv1-n'); + const qL = document.getElementById('p18-iv1-qL'); + const nL = document.getElementById('p18-iv1-nL'); + const out = document.getElementById('p18-iv1-out'); + const seen = new Set(); + let _done = false; + const k = PHYS.CONST.k; + + function fmtQ(q){ return (q>=0?'+':'') + q; } + function render(){ + const q = +qS.value, n = +nS.value; + qL.textContent = fmtQ(q); nL.textContent = n; + const W = 380, H = 260, cx = W/2, cy = H/2; + let g = ''; + // Заголовок + g += 'Электростатическое поле точечного заряда'; + + // Линии поля (если q != 0) + if(q !== 0){ + g += PHYS.fieldLinesPointCharge(cx, cy, q > 0 ? 1 : -1, 95, 16); + } + // Сам заряд + if(q === 0){ + g += ''; + g += '0'; + } else { + g += PHYS.chargeMark(cx, cy, q > 0 ? 1 : -1, 20, ''); + } + // Подпись + g += 'q = '+fmtQ(q)+' нКл'; + + // Пробные заряды (по окружности r=130) + if(n > 0 && q !== 0){ + const Rp = 115; + const qpr = 1e-9; // 1 нКл пробный + for(let i = 0; i < n; i++){ + const a = 2*Math.PI*i/n + 0.15; + const px = cx + Rp*Math.cos(a); + const py = cy + Rp*Math.sin(a); + // Пробный заряд: маленький красный крестик + g += ''; + g += ''; + g += ''; + // Стрелка силы: от заряда (если q>0) или к заряду (если q<0) + const dirx = Math.cos(a), diry = Math.sin(a); + const L = 22; + const sign = q > 0 ? 1 : -1; + // F = qE. Если q>0 (источник), пробный отталкивается — стрелка от центра + const sx = px + sign * 9 * dirx; + const sy = py + sign * 9 * diry; + const ex = px + sign * (9 + L) * dirx; + const ey = py + sign * (9 + L) * diry; + g += PHYS.drawArrow(sx, sy, ex, ey, '#ea580c', 2, 8); + } + } + + svg.innerHTML = g; + + // Описание + let txt = ''; + if(q === 0){ + txt = 'Заряд = 0: поля нет.'; + } else if(q > 0){ + txt = 'Положительный заряд: линии поля направлены от заряда. На пробный $+$ заряд действует сила отталкивания.'; + } else { + txt = 'Отрицательный заряд: линии поля направлены к заряду. На пробный $+$ заряд действует сила притяжения.'; + } + out.innerHTML = txt; + renderMath(out); + + seen.add(q+':'+n); + if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p18-iv1'); bumpProgress('p18', 15); } + } + qS.addEventListener('input', render); + nS.addEventListener('input', render); + render(); + })(); + + /* IV2 — Понятие поля */ + (function(){ + const Q = [ + { q:'Электростатическое поле существует, только когда в точке есть пробный заряд?', opts:['Да','Нет'], ans:1, why:'Поле существует независимо от пробного заряда — это объективная физическая реальность.' }, + { q:'Источник электростатического поля — это:', opts:['Электрический заряд','Магнит'], ans:0, why:'Электростатическое поле создаётся электрическими зарядами. Магнит создаёт магнитное поле.' }, + { q:'Пробный заряд по соглашению — какого знака?', opts:['Положительный','Отрицательный'], ans:0, why:'Пробный заряд берут положительным, чтобы направление силы совпадало с направлением поля.' }, + { q:'Электростатическое поле создаётся:', opts:['Неподвижными зарядами','Движущимися зарядами'], ans:0, why:'Именно неподвижные заряды создают электростатическое поле. Движущиеся создают магнитное.' }, + { q:'Через что передаётся действие заряда на другой заряд?', opts:['Через пустоту','Через поле'], ans:1, why:'Носителем взаимодействия является поле. «Дальнодействие через пустоту» — устаревшее представление.' }, + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p18-iv2-q'); + const oEl = document.getElementById('p18-iv2-opts'); + const fb = document.getElementById('p18-iv2-fb'); + const iEl = document.getElementById('p18-iv2-i'); + const sEl = document.getElementById('p18-iv2-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p18-iv2'); bumpProgress('p18', 25); } + else if(score >= 3){ addXp(8, 'p18-iv2'); bumpProgress('p18', 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('p18-iv2-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV3 — Существует ли поле? */ + (function(){ + const OPTS = ['Существует', 'Не существует (E = 0)']; + const Q = [ + { q:'В точке возле положительно заряженного шара.', ans:0, why:'Заряженное тело создаёт поле вокруг себя.' }, + { q:'Вокруг нейтрального тела (суммарный заряд = 0).', ans:1, why:'Нет заряда — нет поля. (В реальности есть микрополе, но в школьной модели — нет.)' }, + { q:'Внутри однородно заряженной сферической оболочки.', ans:1, why:'По теореме Гаусса: внутри полой однородно заряженной сферы поле равно нулю.' }, + { q:'В точке возле отдельного электрона.', ans:0, why:'Электрон — заряженная частица, вокруг него всегда есть поле.' }, + { q:'В точке посередине между двумя равными одноимёнными зарядами.', ans:1, why:'Поля от двух зарядов равны по модулю и противоположны по направлению — взаимно компенсируются.' }, + { q:'В вакууме вдали от любых зарядов.', ans:1, why:'Без источников электростатического поля нет.' }, + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p18-iv3-q'); + const oEl = document.getElementById('p18-iv3-opts'); + const fb = document.getElementById('p18-iv3-fb'); + const iEl = document.getElementById('p18-iv3-i'); + const sEl = document.getElementById('p18-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p18-iv3'); bumpProgress('p18', 25); } + else if(score >= 4){ addXp(8, 'p18-iv3'); bumpProgress('p18', 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('p18-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV4 — Кратко: что такое поле */ + (function(){ + const Q = [ + { q:'Электростатическое поле создаётся:', opts:['1. Электрическим зарядом', '2. Массой тела', '3. Течением времени'], ans:0, why:'Источник поля — электрический заряд.' }, + { q:'Электростатическое поле создают:', opts:['1. Неподвижные заряды', '2. Движущиеся заряды', '3. Любые заряды'], ans:0, why:'Именно неподвижные заряды создают электростатическое поле.' }, + { q:'Пробный заряд — это:', opts:['1. Положительный и большой', '2. Положительный и малый', '3. Любого знака и любой величины'], ans:1, why:'Малый — чтобы не искажать поле; положительный — для соответствия направления силы и поля.' }, + { q:'Действие электростатического поля передаётся:', opts:['1. Мгновенно', '2. Со скоростью света', '3. Со скоростью звука'], ans:1, why:'В вакууме электромагнитное взаимодействие распространяется со скоростью света $c \\approx 3 \\cdot 10^8$ м/с.' }, + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p18-iv4-q'); + const oEl = document.getElementById('p18-iv4-opts'); + const fb = document.getElementById('p18-iv4-fb'); + const iEl = document.getElementById('p18-iv4-i'); + const sEl = document.getElementById('p18-iv4-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p18-iv4'); bumpProgress('p18', 25); } + else if(score >= 2){ addXp(8, 'p18-iv4'); bumpProgress('p18', 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('p18-iv4-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + wireReadBtn('p18'); } function build_p19(){ const box = document.getElementById('p19-body'); let html = ''; - html += makeCard('theory', "Напряжённость поля. Принцип суперпозиции", "§19", ` -

Напряжённость поля. Принцип суперпозиции — этот параграф в разработке (Phase 1+).

-

Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.

-

- Phase 0: создан скелет учебника. Phase 3+: наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019). -

+ + /* THEORY 1 — Определение напряжённости */ + html += makeCard('theory', "Напряжённость электростатического поля", "§19", ` +

Напряжённость электростатического поля $\\vec{E}$ — векторная физическая величина, равная отношению силы, действующей на пробный заряд, к величине этого заряда:

+

$$\\vec{E} = \\dfrac{\\vec{F}}{q_{пр}}$$

+

где:

+
    +
  • $\\vec{E}$ — напряжённость поля в данной точке (Н/Кл);
  • +
  • $\\vec{F}$ — сила, действующая на пробный заряд (Н);
  • +
  • $q_{пр}$ — пробный заряд (Кл).
  • +
+

Единица измерения: $1$ Н/Кл $= 1$ В/м (вольт на метр).

+

Сила на заряд в поле напряжённостью $\\vec{E}$:

+

$$\\vec{F} = q \\vec{E}$$

+

Направление:

+
    +
  • Для $q > 0$: $\\vec{F}$ совпадает с $\\vec{E}$ по направлению.
  • +
  • Для $q < 0$: $\\vec{F}$ противоположна $\\vec{E}$.
  • +
`); + + /* THEORY 2 — Поле точечного заряда */ + html += makeCard('rule', "Напряжённость поля точечного заряда", "§19", ` +

Модуль напряжённости поля точечного заряда $q$ на расстоянии $r$ от него:

+

$$E = k\\,\\dfrac{|q|}{r^2}$$

+

где $k = 9 \\cdot 10^9$ Н$\\cdot$м$^2$/Кл$^2$ — постоянная Кулона.

+

Направление:

+
    +
  • Поле положительного заряда направлено от заряда (наружу).
  • +
  • Поле отрицательного заряда направлено к заряду (внутрь).
  • +
+

В среде с диэлектрической проницаемостью $\\varepsilon$:

+

$$E = k\\,\\dfrac{|q|}{\\varepsilon\\, r^2}$$

+

Пример. Точечный заряд $q = 1$ нКл. Напряжённость на расстоянии $r = 0{,}1$ м: + $E = 9 \\cdot 10^9 \\cdot \\dfrac{10^{-9}}{(0{,}1)^2} = \\dfrac{9}{0{,}01} = 900$ В/м.

+ `); + + /* THEORY 3 — Принцип суперпозиции */ + html += makeCard('example', "Принцип суперпозиции полей", "§19", ` +

Принцип суперпозиции: если поле создано несколькими зарядами, то напряжённость суммарного поля равна векторной сумме напряжённостей полей от каждого заряда отдельно:

+

$$\\vec{E} = \\vec{E_1} + \\vec{E_2} + \\vec{E_3} + \\ldots$$

+

Это векторная сумма — учитываем направления каждого $\\vec{E_i}$.

+

Пример 1. Два заряда по $+q$ на расстоянии $2d$. Найти $E$ в точке посередине.

+

$E_1$ от первого и $E_2$ от второго равны по модулю, но направлены в разные стороны $\\Rightarrow$ $E = 0$. Это точка равновесия.

+

Пример 2. Два заряда $+q$ и $-q$ на расстоянии $2d$ (диполь). В точке посередине $E_1$ и $E_2$ направлены в одну сторону (от $+q$ к $-q$):

+

$$E = 2 \\cdot k\\dfrac{|q|}{d^2}$$

+

Однородное поле — поле, в котором $\\vec{E}$ одинакова во всех точках (по модулю и направлению). Создаётся, например, между параллельными пластинами заряженного конденсатора. Сила $\\vec{F} = q\\vec{E}$ на заряд везде одинакова.

+ `); + + /* INTERACTIVE 1 — Напряжённость поля точечного заряда */ + html += `
+
ИНТЕРАКТИВ 1
Напряжённость поля точечного заряда
+
Меняй $q$ и $r$ — стрелки $\\vec{E}$ в 8 точках вокруг заряда покажут направление и величину поля.
+
+ + +
+
+ +
+
+
`; + + /* INTERACTIVE 2 — Принцип суперпозиции: 2 заряда */ + html += `
+
ИНТЕРАКТИВ 2
Принцип суперпозиции: 2 заряда
+
Заряды $q_1$ слева, $q_2$ справа на расстоянии $0{,}3$ м. Пробная точка между ними. $\\vec{E}$ от каждого — коллинеарны.
+
+ + + +
+
+ +
+
+
`; + + /* INTERACTIVE 3 — Какое направление E? */ + html += `
+
ИНТЕРАКТИВ 3
Какое направление $\\vec{E}$?
+
6 ситуаций — куда направлен вектор напряжённости?
+
Задача 1 / 6Очки: 0 / 6
+
+
+ +
+
`; + + /* INTERACTIVE 4 — Тренажёр напряжённости */ + html += `
+
ИНТЕРАКТИВ 4
Тренажёр напряжённости
+
5 задач. $k = 9 \\cdot 10^9$ Н$\\cdot$м$^2$/Кл$^2$. Допуск $\\pm 5\\%$.
+
Задача 1 / 5Очки: 0 / 5
+
+
+ ответ = + + + +
+ +
`; + html += secNav('p18', 'p20'); html += readButton('p19'); + box.innerHTML = html; renderMath(box); + + /* IV1 — Напряжённость точечного заряда (8 стрелок) */ + (function(){ + const svg = document.getElementById('p19-iv1-svg'); + const qS = document.getElementById('p19-iv1-q'); + const rS = document.getElementById('p19-iv1-r'); + const qL = document.getElementById('p19-iv1-qL'); + const rL = document.getElementById('p19-iv1-rL'); + const out = document.getElementById('p19-iv1-out'); + const seen = new Set(); + let _done = false; + const k = PHYS.CONST.k; + + function fmtQ(q){ return (q>=0?'+':'') + q; } + function render(){ + const q = +qS.value, r = +rS.value; + qL.textContent = fmtQ(q); rL.textContent = r.toFixed(2); + const W = 480, H = 320, cx = W/2, cy = H/2; + let g = ''; + g += 'E = k|q|/r² — поле точечного заряда'; + + // Расчёт E + const qC = q * 1e-9; + const E = (q === 0) ? 0 : k * Math.abs(qC) / (r * r); + + // 8 точек вокруг заряда на пиксельном радиусе Rpx + const Rpx = 110; + // Длина стрелки пропорциональна E (нормируем). Erefer = k*10e-9/0.05² + const Eref = k * 10e-9 / (0.05*0.05); + let arrowLen = (q === 0) ? 0 : Math.min(55, Math.max(12, Math.sqrt(E / Eref) * 55)); + + if(q !== 0){ + const sign = q > 0 ? 1 : -1; + for(let i = 0; i < 8; i++){ + const a = 2*Math.PI*i/8; + const dx = Math.cos(a), dy = Math.sin(a); + const px = cx + Rpx * dx, py = cy + Rpx * dy; + // Если q > 0: от заряда (наружу). Если q < 0: к заряду (внутрь). + let sx, sy, ex, ey; + if(sign > 0){ + sx = px; sy = py; + ex = px + arrowLen * dx; ey = py + arrowLen * dy; + } else { + sx = px + arrowLen * dx; sy = py + arrowLen * dy; + ex = px; ey = py; + } + g += PHYS.drawArrow(sx, sy, ex, ey, '#ea580c', 2.4, 9); + } + } + + // Сам заряд + if(q === 0){ + g += ''; + g += '0'; + } else { + g += PHYS.chargeMark(cx, cy, q > 0 ? 1 : -1, 22, ''); + } + g += 'q = '+fmtQ(q)+' нКл'; + + // Окружность радиуса r (визуально Rpx) + g += ''; + g += 'r = '+r.toFixed(2)+' м'; + + svg.innerHTML = g; + + // Описание + let txt; + if(q === 0){ + txt = '$E = 0$ — заряда нет.'; + } else { + const Estr = E.toFixed(0); + const dir = q > 0 ? 'от заряда' : 'к заряду'; + txt = '$E = k\\dfrac{|q|}{r^2} = 9\\cdot10^9 \\cdot \\dfrac{'+Math.abs(q)+'\\cdot 10^{-9}}{('+r.toFixed(2)+')^2} \\approx '+Estr+'$ В/м
' + + 'Направление: '+dir+'.'; + } + out.innerHTML = txt; + renderMath(out); + + seen.add(q+':'+r.toFixed(2)); + if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p19-iv1'); bumpProgress('p19', 15); } + } + qS.addEventListener('input', render); + rS.addEventListener('input', render); + render(); + })(); + + /* IV2 — Принцип суперпозиции: 2 заряда */ + (function(){ + const svg = document.getElementById('p19-iv2-svg'); + const q1S = document.getElementById('p19-iv2-q1'); + const q2S = document.getElementById('p19-iv2-q2'); + const xS = document.getElementById('p19-iv2-x'); + const q1L = document.getElementById('p19-iv2-q1L'); + const q2L = document.getElementById('p19-iv2-q2L'); + const xL = document.getElementById('p19-iv2-xL'); + const out = document.getElementById('p19-iv2-out'); + const seen = new Set(); + let _done = false; + const k = PHYS.CONST.k; + const D = 0.3; // м, фикс расстояние + + function fmtQ(q){ return (q>=0?'+':'') + q; } + function render(){ + const q1 = +q1S.value, q2 = +q2S.value, x = +xS.value; + q1L.textContent = fmtQ(q1); q2L.textContent = fmtQ(q2); xL.textContent = x.toFixed(2); + + const W = 480, H = 320, cy = H/2; + // Заряды по горизонтали: q1 в xpx1, q2 в xpx2 + const xpx1 = 70, xpx2 = 410; + const dpx = xpx2 - xpx1; + // Пробная точка + const ppx = xpx1 + (x / D) * dpx; + + let g = ''; + g += 'Суперпозиция: E = E₁ + E₂ (векторно)'; + + // Линия + g += ''; + + // Заряды + if(q1 === 0){ + g += ''; + g += '0'; + } else g += PHYS.chargeMark(xpx1, cy, q1 > 0 ? 1 : -1, 20, ''); + if(q2 === 0){ + g += ''; + g += '0'; + } else g += PHYS.chargeMark(xpx2, cy, q2 > 0 ? 1 : -1, 20, ''); + + // Подписи зарядов + g += 'q₁ = '+fmtQ(q1)+' нКл'; + g += 'q₂ = '+fmtQ(q2)+' нКл'; + + // Пробная точка + g += ''; + g += 'P'; + + // Расчёт E1, E2 в точке P. Направление по оси x. + // r1 = x, r2 = D - x + const r1 = x, r2 = D - x; + const qC1 = q1 * 1e-9, qC2 = q2 * 1e-9; + // E1: знак — куда направлено поле от q1 в точке P. + // Точка P справа от q1. Если q1>0, E1 направлено вправо (+). Если q1<0, влево (-). + const E1 = (r1 > 1e-6) ? k * qC1 / (r1*r1) : 0; // знак сохраняем + // E2: точка P слева от q2. Если q2>0, поле от q2 направлено влево (-). Если q2<0, вправо (+). + const E2 = (r2 > 1e-6) ? -k * qC2 / (r2*r2) : 0; + const Esum = E1 + E2; + + // Стрелки E1, E2, Esum в точке P. Длина — по модулю (с насыщением). + function arr(E, color, yOffset, label){ + if(Math.abs(E) < 1e-3) return ''; + const Emax = 5000; + const L = Math.min(70, Math.max(12, Math.abs(E)/Emax * 70)); + const dir = E > 0 ? 1 : -1; + const sx = ppx, sy = cy + yOffset; + const ex = ppx + dir * L, ey = cy + yOffset; + let s = PHYS.drawArrow(sx, sy, ex, ey, color, 2.4, 9); + s += ''+label+''; + return s; + } + g += arr(E1, '#2563eb', -60, 'E₁'); + g += arr(E2, '#10b981', -90, 'E₂'); + g += arr(Esum, '#dc2626', -30, 'E'); + + // Расстояния + g += 'r₁ = '+r1.toFixed(2)+' м'; + g += 'r₂ = '+r2.toFixed(2)+' м'; + + svg.innerHTML = g; + + function s(E){ return (E>=0?'+':'') + E.toFixed(0); } + out.innerHTML = '
$E_1 = '+s(E1)+'$ В/м    ' + + '$E_2 = '+s(E2)+'$ В/м    ' + + '$E = '+s(Esum)+'$ В/м
' + + '
Знак $+$ — поле направлено вправо, $-$ — влево.
'; + renderMath(out); + + seen.add(q1+':'+q2+':'+x.toFixed(2)); + if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p19-iv2'); bumpProgress('p19', 15); } + } + q1S.addEventListener('input', render); + q2S.addEventListener('input', render); + xS.addEventListener('input', render); + render(); + })(); + + /* IV3 — Какое направление E? */ + (function(){ + const OPTS = ['От заряда (от +)', 'К заряду (к −)', '$E = 0$']; + const Q = [ + { q:'Поле положительного точечного заряда. Куда направлено $\\vec{E}$?', ans:0, why:'$\\vec{E}$ положительного заряда направлено наружу (от заряда).' }, + { q:'Поле отрицательного точечного заряда. Куда направлено $\\vec{E}$?', ans:1, why:'$\\vec{E}$ отрицательного заряда направлено к заряду (внутрь).' }, + { q:'Середина между двумя одинаковыми $+q$ зарядами.', ans:2, why:'Поля равны по модулю, противоположны по направлению — сумма ноль.' }, + { q:'Середина между двумя одинаковыми $-q$ зарядами.', ans:2, why:'Аналогично: оба поля направлены к своим зарядам, в середине компенсируются.' }, + { q:'Точка возле положительного протона ($+$).', ans:0, why:'От любого положительного заряда поле направлено наружу.' }, + { q:'Точка возле отрицательного электрона ($-$).', ans:1, why:'К любому отрицательному заряду поле направлено внутрь.' }, + ]; + let i = 0, score = 0; + const qEl = document.getElementById('p19-iv3-q'); + const oEl = document.getElementById('p19-iv3-opts'); + const fb = document.getElementById('p19-iv3-fb'); + const iEl = document.getElementById('p19-iv3-i'); + const sEl = document.getElementById('p19-iv3-s'); + + function show(){ + if(i >= Q.length){ + qEl.innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + oEl.innerHTML = ''; + if(score === Q.length){ addXp(15, 'p19-iv3'); bumpProgress('p19', 25); } + else if(score >= 4){ addXp(8, 'p19-iv3'); bumpProgress('p19', 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('p19-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + + /* IV4 — Тренажёр напряжённости */ + (function(){ + const Q = [ + { q:'Точечный заряд $+1$ нКл. Напряжённость $E$ (В/м) на $r = 0{,}1$ м?', ans:900, tol:30, hint:'$E = 9\\cdot10^9 \\cdot 10^{-9}/(0{,}1)^2 = 900$ В/м.' }, + { q:'Поле $E = 1000$ В/м действует на заряд $q = 2$ мкКл. Найди силу в мН.', ans:2, tol:0.1, hint:'$F = qE = 2\\cdot10^{-6} \\cdot 1000 = 2\\cdot10^{-3}$ Н $= 2$ мН.' }, + { q:'Точечный заряд $-2$ нКл. $E$ (В/м) на $r = 0{,}05$ м?', ans:7200, tol:100, hint:'$E = 9\\cdot10^9 \\cdot 2\\cdot10^{-9}/(0{,}05)^2 = 18/0{,}0025 = 7200$ В/м.' }, + { q:'Два заряда $+2$ нКл и $+2$ нКл на расстоянии $0{,}2$ м. $E$ (В/м) в середине отрезка?', ans:0, tol:0.1, hint:'Поля от одинаковых зарядов в середине направлены навстречу — суммарное $E = 0$.' }, + { q:'Два заряда $+2$ нКл и $-2$ нКл на расстоянии $0{,}2$ м. $E$ (В/м) в середине? (Поля складываются.)', ans:3600, tol:50, hint:'$E_1 = E_2 = 9\\cdot10^9 \\cdot 2\\cdot10^{-9}/(0{,}1)^2 = 1800$ В/м. Направлены в одну сторону (от $+$ к $-$) $\\Rightarrow E = 3600$ В/м.' }, + ]; + let i = 0, score = 0; + function show(){ + if(i >= Q.length){ + document.getElementById('p19-iv4-q').innerHTML = 'Готово! Результат: ' + score + ' / ' + Q.length; + if(score === Q.length){ addXp(15, 'p19-iv4'); bumpProgress('p19', 25); } + else if(score >= 3){ addXp(8, 'p19-iv4'); bumpProgress('p19', 15); } + return; + } + document.getElementById('p19-iv4-i').textContent = (i+1); + document.getElementById('p19-iv4-s').textContent = score; + document.getElementById('p19-iv4-q').innerHTML = Q[i].q; + document.getElementById('p19-iv4-ans').value = ''; + renderMath(document.getElementById('p19-iv4-q')); + document.getElementById('p19-iv4-fb').style.display = 'none'; + } + function go(){ + if(i >= Q.length) return; + const fb = document.getElementById('p19-iv4-fb'); + const raw = document.getElementById('p19-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('p19-iv4-s').textContent = score; + i++; + setTimeout(show, 1800); + } + document.getElementById('p19-iv4-go').addEventListener('click', go); + document.getElementById('p19-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); }); + document.getElementById('p19-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); }); + show(); + })(); + wireReadBtn('p19'); }