feat(phys10 ch3 wave2): §18 «Поле» + §19 «Напряжённость и суперпозиция»

This commit is contained in:
Maxim Dolgolyov
2026-05-29 17:27:35 +03:00
parent 1611e4b461
commit de1dbea8aa
+693 -11
View File
@@ -1365,34 +1365,716 @@ function build_p17(){
function build_p18(){
const box = document.getElementById('p18-body');
let html = '';
/* THEORY 1 — Понятие поля */
html += makeCard('theory', "Электростатическое поле", "§18", `
<p><b>Электростатическое поле</b> — этот параграф в разработке (Phase 1+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет учебника. <b>Phase 3+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
</p>
<p><b>Электростатическое поле</b> — особый вид материи, который существует вокруг электрических зарядов и проявляется в действии на другие заряды.</p>
<p>До открытия поля физики верили в <b>«дальнодействие»</b> — мгновенное действие на расстоянии. Однако опыты с движущимися зарядами показали, что взаимодействие распространяется с <b>конечной скоростью</b> (скоростью света). Носителем этого взаимодействия является <b>электромагнитное поле</b>.</p>
<p><b>Электростатическое</b> поле создаётся <b>неподвижными</b> зарядами и не меняется со временем.</p>
<p>Подобно тому, как магнит создаёт магнитное поле, а Земля создаёт гравитационное поле, электрический заряд создаёт <b>электростатическое поле</b>.</p>
`);
/* THEORY 2 — Свойства поля */
html += makeCard('rule', "Свойства электростатического поля", "§18", `
<p><b>Свойства электростатического поля</b>:</p>
<ul style="margin:6px 0 8px 22px;line-height:1.75">
<li><b>Создаётся</b> электрическим зарядом (источником).</li>
<li><b>Действует</b> только на электрические заряды (помещённые в поле).</li>
<li><b>Невидимо</b>, обнаруживается по силам, действующим на заряды.</li>
<li><b>Передаётся</b> с конечной скоростью (в пустоте — со скоростью света $c = 3 \\cdot 10^8$ м/с).</li>
<li><b>Подчиняется принципу суперпозиции</b>: поля складываются векторно.</li>
</ul>
<p>Поля могут создаваться:</p>
<ul style="margin:6px 0 8px 22px;line-height:1.75">
<li>Одним точечным зарядом.</li>
<li>Системой точечных зарядов.</li>
<li>Заряженными телами (заряд распределён по поверхности или объёму).</li>
</ul>
<p style="padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0">В этом параграфе мы изучим <b>электростатическое</b> поле — поле <b>неподвижных</b> зарядов. Его характеристики не зависят от времени.</p>
`);
/* THEORY 3 — Пробный заряд и источник */
html += makeCard('example', "Пробный заряд и источник", "§18", `
<p><b>Пробный заряд</b> $q_{пр}$ — это очень маленький положительный заряд, который вносится в исследуемую точку поля для измерения характеристик поля.</p>
<p><b>Условия для пробного заряда</b>:</p>
<ol style="margin:6px 0 8px 22px;line-height:1.75">
<li>Должен быть <b>малым</b>, чтобы своим полем не искажать исходное поле.</li>
<li>По общему соглашению — <b>положительным</b>, чтобы направление силы совпадало с направлением поля.</li>
</ol>
<p><b>Источник поля</b> — заряд (или система зарядов), создающий поле.</p>
<p style="padding:10px 14px;background:var(--warn-bg,#fef3c7);border-left:4px solid var(--warn,#f59e0b);border-radius:9px;margin:10px 0"><b>Аналогия</b>: чтобы измерить силу ветра, мы выставляем флюгер (пробный объект). Так же, чтобы измерить поле, мы помещаем в точку пробный заряд и смотрим, какая сила на него действует.</p>
<p>Поле существует <b>независимо</b> от того, есть в точке пробный заряд или нет. Поле — это <b>объективная физическая реальность</b>.</p>
`);
/* INTERACTIVE 1 — Визуализатор электростатического поля */
html += `<div class="wg" id="p18-iv1">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Визуализатор электростатического поля</div></div>
<div class="wg-help">Меняй знак и величину заряда — увидишь линии поля. Добавь пробный заряд — увидишь силу, действующую на него.</div>
<div class="sliders">
<label>$q$: <b id="p18-iv1-qL">+5</b> нКл <input type="range" id="p18-iv1-q" min="-10" max="10" value="5" step="1"></label>
<label>пробных зарядов: <b id="p18-iv1-nL">2</b> <input type="range" id="p18-iv1-n" min="0" max="8" value="2" step="1"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
<svg id="p18-iv1-svg" viewBox="0 0 380 260" width="100%" style="height:auto"></svg>
</div>
<div id="p18-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.94rem;line-height:1.75;text-align:center"></div>
</div>`;
/* INTERACTIVE 2 — Понятие поля */
html += `<div class="wg" id="p18-iv2">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Понятие поля</div></div>
<div class="wg-help">5 вопросов о природе и свойствах электростатического поля.</div>
<div class="score-display"><span>Вопрос <b id="p18-iv2-i">1</b> / 5</span><span>Очки: <b id="p18-iv2-s">0</b> / 5</span></div>
<div id="p18-iv2-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p18-iv2-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
<div class="feedback" id="p18-iv2-fb"></div>
<div class="actions"><button class="btn" id="p18-iv2-restart">Начать заново</button></div>
</div>`;
/* INTERACTIVE 3 — Существует ли поле? */
html += `<div class="wg" id="p18-iv3">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Существует ли поле?</div></div>
<div class="wg-help">6 ситуаций — есть ли в указанной точке электростатическое поле?</div>
<div class="score-display"><span>Задача <b id="p18-iv3-i">1</b> / 6</span><span>Очки: <b id="p18-iv3-s">0</b> / 6</span></div>
<div id="p18-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p18-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
<div class="feedback" id="p18-iv3-fb"></div>
<div class="actions"><button class="btn" id="p18-iv3-restart">Начать заново</button></div>
</div>`;
/* INTERACTIVE 4 — Кратко: что такое поле */
html += `<div class="wg" id="p18-iv4">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Кратко: что такое поле</div></div>
<div class="wg-help">4 быстрых вопроса. Выбери номер правильного варианта.</div>
<div class="score-display"><span>Вопрос <b id="p18-iv4-i">1</b> / 4</span><span>Очки: <b id="p18-iv4-s">0</b> / 4</span></div>
<div id="p18-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p18-iv4-opts" style="display:grid;grid-template-columns:1fr;gap:6px"></div>
<div class="feedback" id="p18-iv4-fb"></div>
<div class="actions"><button class="btn" id="p18-iv4-restart">Начать заново</button></div>
</div>`;
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 += '<text x="190" y="20" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">Электростатическое поле точечного заряда</text>';
// Линии поля (если q != 0)
if(q !== 0){
g += PHYS.fieldLinesPointCharge(cx, cy, q > 0 ? 1 : -1, 95, 16);
}
// Сам заряд
if(q === 0){
g += '<circle cx="'+cx+'" cy="'+cy+'" r="20" fill="#e5e7eb" stroke="#94a3b8" stroke-width="2"/>';
g += '<text x="'+cx+'" y="'+(cy+5)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#64748b">0</text>';
} else {
g += PHYS.chargeMark(cx, cy, q > 0 ? 1 : -1, 20, '');
}
// Подпись
g += '<text x="'+cx+'" y="'+(cy+44)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="13" font-weight="700" fill="#0f172a">q = '+fmtQ(q)+' нКл</text>';
// Пробные заряды (по окружности 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 += '<circle cx="'+px.toFixed(1)+'" cy="'+py.toFixed(1)+'" r="5" fill="#fecaca" stroke="#dc2626" stroke-width="1.5"/>';
g += '<line x1="'+(px-3).toFixed(1)+'" y1="'+py.toFixed(1)+'" x2="'+(px+3).toFixed(1)+'" y2="'+py.toFixed(1)+'" stroke="#dc2626" stroke-width="1.5"/>';
g += '<line x1="'+px.toFixed(1)+'" y1="'+(py-3).toFixed(1)+'" x2="'+px.toFixed(1)+'" y2="'+(py+3).toFixed(1)+'" stroke="#dc2626" stroke-width="1.5"/>';
// Стрелка силы: от заряда (если 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 = '<b>Заряд = 0</b>: поля нет.';
} else if(q > 0){
txt = '<b>Положительный заряд</b>: линии поля направлены <b>от заряда</b>. На пробный $+$ заряд действует сила <b>отталкивания</b>.';
} else {
txt = '<b>Отрицательный заряд</b>: линии поля направлены <b>к заряду</b>. На пробный $+$ заряд действует сила <b>притяжения</b>.';
}
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:'Именно неподвижные заряды создают <b>электростатическое</b> поле. Движущиеся создают магнитное.' },
{ 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 = '<b>Готово!</b> Результат: ' + 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) => '<button class="btn primary" data-v="' + k + '">' + t + '</button>').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, '&#10003; Верно! ' + item.why + ' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. ' + 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 = '<b>Готово!</b> Результат: ' + 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) => '<button class="btn primary" data-v="' + k + '">' + t + '</button>').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, '&#10003; Верно! ' + item.why + ' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. ' + 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:'Именно <b>неподвижные</b> заряды создают электростатическое поле.' },
{ 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 = '<b>Готово!</b> Результат: ' + 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) => '<button class="btn primary" data-v="' + k + '">' + t + '</button>').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, '&#10003; Верно! ' + item.why + ' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. ' + 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", `
<p><b>Напряжённость поля. Принцип суперпозиции</b> — этот параграф в разработке (Phase 1+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет учебника. <b>Phase 3+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
</p>
/* THEORY 1 — Определение напряжённости */
html += makeCard('theory', "Напряжённость электростатического поля", "§19", `
<p><b>Напряжённость электростатического поля</b> $\\vec{E}$ — векторная физическая величина, равная отношению силы, действующей на пробный заряд, к величине этого заряда:</p>
<p style="text-align:center;margin:10px 0">$$\\vec{E} = \\dfrac{\\vec{F}}{q_{пр}}$$</p>
<p>где:</p>
<ul style="margin:6px 0 8px 22px;line-height:1.75">
<li>$\\vec{E}$ — напряжённость поля в данной точке (Н/Кл);</li>
<li>$\\vec{F}$ — сила, действующая на пробный заряд (Н);</li>
<li>$q_{пр}$ — пробный заряд (Кл).</li>
</ul>
<p><b>Единица измерения</b>: $1$ Н/Кл $= 1$ В/м (вольт на метр).</p>
<p style="margin-top:10px"><b>Сила на заряд</b> в поле напряжённостью $\\vec{E}$:</p>
<p style="text-align:center;margin:10px 0">$$\\vec{F} = q \\vec{E}$$</p>
<p><b>Направление</b>:</p>
<ul style="margin:6px 0 8px 22px;line-height:1.75">
<li>Для $q > 0$: $\\vec{F}$ совпадает с $\\vec{E}$ по направлению.</li>
<li>Для $q < 0$: $\\vec{F}$ противоположна $\\vec{E}$.</li>
</ul>
`);
/* THEORY 2 — Поле точечного заряда */
html += makeCard('rule', "Напряжённость поля точечного заряда", "§19", `
<p>Модуль напряжённости поля <b>точечного заряда</b> $q$ на расстоянии $r$ от него:</p>
<p style="text-align:center;margin:10px 0">$$E = k\\,\\dfrac{|q|}{r^2}$$</p>
<p>где $k = 9 \\cdot 10^9$ Н$\\cdot$м$^2$/Кл$^2$ — постоянная Кулона.</p>
<p><b>Направление</b>:</p>
<ul style="margin:6px 0 8px 22px;line-height:1.75">
<li>Поле положительного заряда направлено <b>от</b> заряда (наружу).</li>
<li>Поле отрицательного заряда направлено <b>к</b> заряду (внутрь).</li>
</ul>
<p>В среде с диэлектрической проницаемостью $\\varepsilon$:</p>
<p style="text-align:center;margin:10px 0">$$E = k\\,\\dfrac{|q|}{\\varepsilon\\, r^2}$$</p>
<p style="padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;margin:10px 0"><b>Пример</b>. Точечный заряд $q = 1$ нКл. Напряжённость на расстоянии $r = 0{,}1$ м:
$E = 9 \\cdot 10^9 \\cdot \\dfrac{10^{-9}}{(0{,}1)^2} = \\dfrac{9}{0{,}01} = 900$ В/м.</p>
`);
/* THEORY 3 — Принцип суперпозиции */
html += makeCard('example', "Принцип суперпозиции полей", "§19", `
<p><b>Принцип суперпозиции</b>: если поле создано несколькими зарядами, то напряжённость суммарного поля равна <b>векторной сумме</b> напряжённостей полей от каждого заряда отдельно:</p>
<p style="text-align:center;margin:10px 0">$$\\vec{E} = \\vec{E_1} + \\vec{E_2} + \\vec{E_3} + \\ldots$$</p>
<p>Это <b>векторная</b> сумма — учитываем направления каждого $\\vec{E_i}$.</p>
<p style="margin-top:12px"><b>Пример 1.</b> Два заряда по $+q$ на расстоянии $2d$. Найти $E$ в точке посередине.</p>
<p>$E_1$ от первого и $E_2$ от второго равны по модулю, но направлены <b>в разные стороны</b> $\\Rightarrow$ $E = 0$. Это <b>точка равновесия</b>.</p>
<p style="margin-top:10px"><b>Пример 2.</b> Два заряда $+q$ и $-q$ на расстоянии $2d$ (диполь). В точке посередине $E_1$ и $E_2$ направлены <b>в одну сторону</b> (от $+q$ к $-q$):</p>
<p style="text-align:center;margin:10px 0">$$E = 2 \\cdot k\\dfrac{|q|}{d^2}$$</p>
<p style="padding:10px 14px;background:var(--warn-bg,#fef3c7);border-left:4px solid var(--warn,#f59e0b);border-radius:9px;margin:10px 0"><b>Однородное поле</b> — поле, в котором $\\vec{E}$ одинакова во всех точках (по модулю и направлению). Создаётся, например, между параллельными пластинами заряженного конденсатора. Сила $\\vec{F} = q\\vec{E}$ на заряд везде одинакова.</p>
`);
/* INTERACTIVE 1 — Напряжённость поля точечного заряда */
html += `<div class="wg" id="p19-iv1">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Напряжённость поля точечного заряда</div></div>
<div class="wg-help">Меняй $q$ и $r$ — стрелки $\\vec{E}$ в 8 точках вокруг заряда покажут направление и величину поля.</div>
<div class="sliders">
<label>$q$: <b id="p19-iv1-qL">+5</b> нКл <input type="range" id="p19-iv1-q" min="-10" max="10" value="5" step="1"></label>
<label>$r$: <b id="p19-iv1-rL">0.20</b> м <input type="range" id="p19-iv1-r" min="0.05" max="0.5" value="0.2" step="0.01"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
<svg id="p19-iv1-svg" viewBox="0 0 480 320" width="100%" style="height:auto"></svg>
</div>
<div id="p19-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.94rem;line-height:1.75;text-align:center"></div>
</div>`;
/* INTERACTIVE 2 — Принцип суперпозиции: 2 заряда */
html += `<div class="wg" id="p19-iv2">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Принцип суперпозиции: 2 заряда</div></div>
<div class="wg-help">Заряды $q_1$ слева, $q_2$ справа на расстоянии $0{,}3$ м. Пробная точка между ними. $\\vec{E}$ от каждого — коллинеарны.</div>
<div class="sliders">
<label>$q_1$: <b id="p19-iv2-q1L">+5</b> нКл <input type="range" id="p19-iv2-q1" min="-10" max="10" value="5" step="1"></label>
<label>$q_2$: <b id="p19-iv2-q2L">+5</b> нКл <input type="range" id="p19-iv2-q2" min="-10" max="10" value="5" step="1"></label>
<label>$x$ от $q_1$: <b id="p19-iv2-xL">0.15</b> м <input type="range" id="p19-iv2-x" min="0.05" max="0.25" value="0.15" step="0.01"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
<svg id="p19-iv2-svg" viewBox="0 0 480 320" width="100%" style="height:auto"></svg>
</div>
<div id="p19-iv2-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.94rem;line-height:1.75;text-align:center"></div>
</div>`;
/* INTERACTIVE 3 — Какое направление E? */
html += `<div class="wg" id="p19-iv3">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Какое направление $\\vec{E}$?</div></div>
<div class="wg-help">6 ситуаций — куда направлен вектор напряжённости?</div>
<div class="score-display"><span>Задача <b id="p19-iv3-i">1</b> / 6</span><span>Очки: <b id="p19-iv3-s">0</b> / 6</span></div>
<div id="p19-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p19-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"></div>
<div class="feedback" id="p19-iv3-fb"></div>
<div class="actions"><button class="btn" id="p19-iv3-restart">Начать заново</button></div>
</div>`;
/* INTERACTIVE 4 — Тренажёр напряжённости */
html += `<div class="wg" id="p19-iv4">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр напряжённости</div></div>
<div class="wg-help">5 задач. $k = 9 \\cdot 10^9$ Н$\\cdot$м$^2$/Кл$^2$. Допуск $\\pm 5\\%$.</div>
<div class="score-display"><span>Задача <b id="p19-iv4-i">1</b> / 5</span><span>Очки: <b id="p19-iv4-s">0</b> / 5</span></div>
<div id="p19-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:center">
<span style="font-family:'JetBrains Mono',monospace">ответ =</span>
<input type="number" id="p19-iv4-ans" class="tinp" style="width:140px;text-align:center" step="any">
<button class="btn primary" id="p19-iv4-go">Проверить</button>
<button class="btn" id="p19-iv4-start">Заново</button>
</div>
<div class="feedback" id="p19-iv4-fb"></div>
</div>`;
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 += '<text x="240" y="22" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">E = k|q|/r² — поле точечного заряда</text>';
// Расчёт 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 += '<circle cx="'+cx+'" cy="'+cy+'" r="22" fill="#e5e7eb" stroke="#94a3b8" stroke-width="2"/>';
g += '<text x="'+cx+'" y="'+(cy+5)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#64748b">0</text>';
} else {
g += PHYS.chargeMark(cx, cy, q > 0 ? 1 : -1, 22, '');
}
g += '<text x="'+cx+'" y="'+(cy+44)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="13" font-weight="700" fill="#0f172a">q = '+fmtQ(q)+' нКл</text>';
// Окружность радиуса r (визуально Rpx)
g += '<circle cx="'+cx+'" cy="'+cy+'" r="'+Rpx+'" fill="none" stroke="#94a3b8" stroke-width="1" stroke-dasharray="4 4"/>';
g += '<text x="'+(cx + Rpx + 8)+'" y="'+(cy - 6)+'" font-family="JetBrains Mono,monospace" font-size="12" fill="#64748b">r = '+r.toFixed(2)+' м</text>';
svg.innerHTML = g;
// Описание
let txt;
if(q === 0){
txt = '$E = 0$ — заряда нет.';
} else {
const Estr = E.toFixed(0);
const dir = q > 0 ? '<b>от заряда</b>' : '<b>к заряду</b>';
txt = '<b>$E = k\\dfrac{|q|}{r^2} = 9\\cdot10^9 \\cdot \\dfrac{'+Math.abs(q)+'\\cdot 10^{-9}}{('+r.toFixed(2)+')^2} \\approx '+Estr+'$ В/м</b><br>'
+ 'Направление: '+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 += '<text x="240" y="22" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">Суперпозиция: E = E₁ + E₂ (векторно)</text>';
// Линия
g += '<line x1="'+xpx1+'" y1="'+cy+'" x2="'+xpx2+'" y2="'+cy+'" stroke="#cbd5e1" stroke-width="1" stroke-dasharray="3 3"/>';
// Заряды
if(q1 === 0){
g += '<circle cx="'+xpx1+'" cy="'+cy+'" r="20" fill="#e5e7eb" stroke="#94a3b8" stroke-width="2"/>';
g += '<text x="'+xpx1+'" y="'+(cy+5)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#64748b">0</text>';
} else g += PHYS.chargeMark(xpx1, cy, q1 > 0 ? 1 : -1, 20, '');
if(q2 === 0){
g += '<circle cx="'+xpx2+'" cy="'+cy+'" r="20" fill="#e5e7eb" stroke="#94a3b8" stroke-width="2"/>';
g += '<text x="'+xpx2+'" y="'+(cy+5)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#64748b">0</text>';
} else g += PHYS.chargeMark(xpx2, cy, q2 > 0 ? 1 : -1, 20, '');
// Подписи зарядов
g += '<text x="'+xpx1+'" y="'+(cy+44)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#0f172a">q₁ = '+fmtQ(q1)+' нКл</text>';
g += '<text x="'+xpx2+'" y="'+(cy+44)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#0f172a">q₂ = '+fmtQ(q2)+' нКл</text>';
// Пробная точка
g += '<circle cx="'+ppx.toFixed(1)+'" cy="'+cy+'" r="4.5" fill="#fde047" stroke="#a16207" stroke-width="1.5"/>';
g += '<text x="'+ppx.toFixed(1)+'" y="'+(cy-20)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" font-weight="700" fill="#a16207">P</text>';
// Расчёт 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 += '<text x="'+(ex + dir*8)+'" y="'+(ey + 4)+'" text-anchor="'+(dir>0?'start':'end')+'" font-family="Inter,sans-serif" font-size="12" font-weight="700" fill="'+color+'">'+label+'</text>';
return s;
}
g += arr(E1, '#2563eb', -60, 'E₁');
g += arr(E2, '#10b981', -90, 'E₂');
g += arr(Esum, '#dc2626', -30, 'E');
// Расстояния
g += '<text x="'+((xpx1+ppx)/2).toFixed(1)+'" y="'+(cy+62)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" fill="#64748b">r₁ = '+r1.toFixed(2)+' м</text>';
g += '<text x="'+((ppx+xpx2)/2).toFixed(1)+'" y="'+(cy+62)+'" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="11" fill="#64748b">r₂ = '+r2.toFixed(2)+' м</text>';
svg.innerHTML = g;
function s(E){ return (E>=0?'+':'') + E.toFixed(0); }
out.innerHTML = '<div><span style="color:#2563eb"><b>$E_1 = '+s(E1)+'$ В/м</b></span> &nbsp;&nbsp; '
+ '<span style="color:#10b981"><b>$E_2 = '+s(E2)+'$ В/м</b></span> &nbsp;&nbsp; '
+ '<span style="color:#dc2626"><b>$E = '+s(Esum)+'$ В/м</b></span></div>'
+ '<div style="margin-top:6px;font-size:.88rem;color:#64748b">Знак $+$ — поле направлено вправо, $-$ — влево.</div>';
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 = '<b>Готово!</b> Результат: ' + 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) => '<button class="btn primary" data-v="' + k + '">' + t + '</button>').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, '&#10003; Верно! ' + item.why + ' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. ' + 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 = '<b>Готово!</b> Результат: ' + 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, '&#10007; Введи число.'); return; }
if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '&#10003; Верно! '+Q[i].hint+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Неверно. Ответ: $'+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');
}