feat(phys10 ch3 wave2): §18 «Поле» + §19 «Напряжённость и суперпозиция»
This commit is contained in:
@@ -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, '✓ Верно! ' + 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 = '<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, '✓ Верно! ' + 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:'Именно <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, '✓ Верно! ' + 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", `
|
||||
<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> '
|
||||
+ '<span style="color:#10b981"><b>$E_2 = '+s(E2)+'$ В/м</b></span> '
|
||||
+ '<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, '✓ Верно! ' + 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 = '<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, '✗ Введи число.'); 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');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user