From 799f6517779c1a0c4fcd756e774969df3fa97d0f Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 11:24:21 +0300 Subject: [PATCH] =?UTF-8?q?feat(phys7=20ch3):=20Phase=204=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D0=B8=D0=BB=D1=8B=20=C2=A7=C2=A721-27=20+=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=20=C2=AB=D0=9C=D0=B0=D1=81=D1=82=D0=B5=D1=80?= =?UTF-8?q?=20=D0=B4=D0=B2=D0=B8=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Глава 3 «Движение и силы» закрыта целиком. Файл вырос с 1082 до 2124 строк (+1042). Экспортирует 15 функций: p14..p27 + final3. §21 Сила: - 3 карточки (что такое сила / стрелка-вектор / 4 силы из жизни) - IV-1 СИМ: интерактивная стрелка силы с slider модуля и угла (0..360°) - DnD 8→4 (Ft/Fупр/Fтр/N) / квиз 4 / тренажёр 4 §22 Сила тяжести: - 3 карточки + IV-1 КАЛЬК: 4 кнопки планет (Земля/Луна/Марс/Юпитер) + slider m → Ft = mg с правильным g, выводом и подписью планеты - DnD 6→3 (1Н/10Н/100Н) / квиз 4 / тренажёр 5 §23 Сила упругости: - 3 карточки (когда возникает / Гук качественно / примеры) - IV-1 СИМ: SVG-пружина с подвешенным грузом, slider Δl=0..20 см → растягивается, стрелки Fупр↑ (зелёная) и Fт↓ (фиолетовая) - DnD 6→2 (есть/нет деформации) / квиз 3 / тренажёр 4 §24 Вес тела: - 3 карточки (P vs Ft / невесомость / взвешивание) - IV-1 СИМ: 4 ситуации (покой / падение / ускорение вверх=перегрузка / вниз), для каждой — стрелки Ft (фиолет, на тело) и P (индиго, на опору) - DnD 6→3 (Ft/P/P=0) / квиз 4 / тренажёр 4 §25 Динамометр: - 3 карточки + IV-1 СИМ: использует window.PHYS.dynamometer из phys.js, slider F и Fmax → SVG с пружиной, шкалой, указателем; warning при превышении - IV-2 КАЛЬК m = F/g с выбором планеты - DnD 6→3 (школьный/мед./пром.) / тренажёр 4 §26 СЛОЖЕНИЕ СИЛ — ГЛАВНЫЙ ВИЗУАЛ ГЛАВЫ 3: - 3 карточки (равнодействующая / сонапр/противопол / перетягивание каната) - IV-1 «Конструктор сил на теле»: 4 slider'а Ft↓ + N↑ + Fтяги→ + Fтр←, SVG-сцена с цветными стрелками от центра кубика и большой красной стрелкой R; вердикт «уравновешены / ускоряется вправо/влево/падает/подпрыгнет/под углом» - IV-2 КАЛЬК сложения 2 сил с переключателем сонапр./противопол. - IV-3 DnD 6→3 (R вправо/влево/0) / тренажёр 5 §27 Сила трения: - 3 карточки (откуда / виды / польза vs вред) - IV-1 СИМ-симулятор: slider m, F, выбор μ из 4 поверхностей (лёд / сталь / дерево / резина-асфальт). SVG с бруском, стрелками F→ и Fтр←, вердикт «ЕДЕТ / ПОКОИТСЯ» по сравнению F с μN - DnD 6→2 (полезно/мешает) / квиз 4 / тренажёр 5 ФИНАЛ ГЛАВЫ 3 (10 боссов + ачивка «Мастер движения» +50 XP): 1. v = s/t (20 м/с) 2. Средняя скорость с равным временем (7 м/с) 3. Плотность бруска → железо (7.8 г/см³) 4. Ft на Земле (39.2 Н) 5. Ft того же тела на Луне (6.4 Н) 6. Динамометр → масса (750 г) 7. R двух сил противоположных (12 Н) 8. R трёх сил на одной прямой (10 Н) 9. Сила трения скольжения (6 Н) 10. Магистр: брусок едет, Fтр_max < F, R = ? (2 Н) Все интерактивы wireDnd/wireQuiz/слайдеры/SVG привязаны. Parse OK, smoke OK. --- frontend/js/phys7_ch3_widgets.js | 1058 +++++++++++++++++++++++++++++- 1 file changed, 1050 insertions(+), 8 deletions(-) diff --git a/frontend/js/phys7_ch3_widgets.js b/frontend/js/phys7_ch3_widgets.js index bceb9a8..be5ebaf 100644 --- a/frontend/js/phys7_ch3_widgets.js +++ b/frontend/js/phys7_ch3_widgets.js @@ -1068,15 +1068,1057 @@ function add_p20(){ renderMath(body); } +/* ========================================================== */ +/* §21 — Сила */ +/* ========================================================== */ +function add_p21(){ + const body = document.getElementById('p21-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Что такое сила', '§ 21.1', + 'Сила $\\vec F$ — физическая величина, которая характеризует взаимодействие двух тел. ' + + 'Сила всегда возникает в паре: одно тело действует на другое.

' + + '$[F] = $ Н (ньютон) — в честь Исаака Ньютона.'); + + h += makeCard('rule', 'Что значит «изобразить силу»', '§ 21.2', + 'У силы три характеристики (поэтому её рисуют стрелкой — вектором):' + + ''); + + h += makeCard('example', 'Четыре силы из жизни', '§ 21.3', + '' + + '' + + [ + ['$\\vec F_т$ — сила тяжести', 'Земля притягивает тело'], + ['$\\vec F_{упр}$ — упругости', 'Тело деформировано (сжато, растянуто)'], + ['$\\vec F_{тр}$ — трения', 'Тело движется (или пытается) по другому'], + ['$\\vec N$ — нормальная реакция', 'Тело давит на опору; опора отвечает'] + ].map(r => '').join('') + + '
СилаКогда возникает
' + r[0] + '' + r[1] + '
'); + + /* IV-1 СИМ: визуал силы со стрелкой */ + h += wgWrap('p21-iv1', 'СИМ', 'Сила-стрелка', 'Меняй модуль и направление — посмотри, как меняется стрелка.', + '
' + + '' + + '' + + '
' + + ''); + + /* IV-2 КВИЗ */ + h += wgWrap('p21-iv2', 'КВИЗ', 'Что такое сила', '', + '
' + + quizQuestion('p21-q', 0, 'В каких единицах измеряют силу?', ['Килограммы','Метры','Ньютоны','Джоули'], 2) + + quizQuestion('p21-q', 1, 'Сила — это…', ['Скалярная величина','Векторная величина','Время','Длина'], 1) + + quizQuestion('p21-q', 2, 'Что НЕ относится к характеристикам силы?', ['Модуль','Направление','Точка приложения','Цвет'], 3) + + quizQuestion('p21-q', 3, 'Что произойдёт с покоящимся телом, если на него действует одна сила?', ['Ничего','Тело изменит скорость','Тело пропадёт','Не меняется'], 1, 'Если силы не уравновешены — тело меняет скорость.') + + '
'); + + /* IV-3 DnD */ + h += wgWrap('p21-iv3', 'DnD', 'Какая сила?', '', + dndPool('p21-dnd', [ + { id:'a1', cat:'grav', html:'Яблоко падает с дерева' }, + { id:'a2', cat:'grav', html:'Снежинки летят на землю' }, + { id:'a3', cat:'el', html:'Сжатая пружина возвращается' }, + { id:'a4', cat:'el', html:'Растянутая резинка' }, + { id:'a5', cat:'fr', html:'Машина тормозит' }, + { id:'a6', cat:'fr', html:'Книга по столу не скользит' }, + { id:'a7', cat:'norm', html:'Стол держит лежащую книгу' }, + { id:'a8', cat:'norm', html:'Пол не пускает человека провалиться' } + ], [ + { cat:'grav', label:'$\\vec F_т$ (тяжести)' }, + { cat:'el', label:'$\\vec F_{упр}$ (упругости)' }, + { cat:'fr', label:'$\\vec F_{тр}$ (трения)' }, + { cat:'norm', label:'$\\vec N$ (нормальная реакция)' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p21-iv4', 'ТРН', 'Тренажёр §21', '', + '
' + + quizQuestion('p21-tr', 0, 'Силу обозначают…', ['$s$','$v$','$F$','$t$'], 2) + + quizQuestion('p21-tr', 1, 'Сила — мера…', ['Длины','Времени','Взаимодействия тел','Объёма'], 2) + + quizQuestion('p21-tr', 2, 'В каких единицах СИ выражают силу?', ['Кг','Н (ньютоны)','Дж','м/с²'], 1) + + quizQuestion('p21-tr', 3, 'Что нужно для того, чтобы изобразить силу?', ['Только число','Только направление','Стрелка с заданной длиной, направлением и точкой приложения','Только подпись'], 2) + + '
'); + + h += readButton('p21'); + body.innerHTML = h; + + function draw21(){ + const F = +document.getElementById('p21-F-r').value; + const ang = +document.getElementById('p21-ang-r').value; + document.getElementById('p21-F').textContent = F; + document.getElementById('p21-ang').textContent = ang; + const cx = 150, cy = 110; + const len = F * 2.5; + const a = -ang * Math.PI / 180; + const x2 = cx + len * Math.cos(a); + const y2 = cy + len * Math.sin(a); + let s = ''; + // Тело — кружок + s += ''; + // Стрелка силы + s += ''; + // Наконечник + const ah = 10; + const ax1 = x2 - ah * Math.cos(a - 0.4); + const ay1 = y2 - ah * Math.sin(a - 0.4); + const ax2 = x2 - ah * Math.cos(a + 0.4); + const ay2 = y2 - ah * Math.sin(a + 0.4); + s += ''; + // Подпись + s += 'F = ' + F + ' Н'; + document.getElementById('p21-svg').innerHTML = s; + } + ['p21-F-r','p21-ang-r'].forEach(id => document.getElementById(id).addEventListener('input', draw21)); + draw21(); + + wireDnd('p21-dnd', [ + { id:'a1', cat:'grav' },{ id:'a2', cat:'grav' },{ id:'a3', cat:'el' },{ id:'a4', cat:'el' }, + { id:'a5', cat:'fr' },{ id:'a6', cat:'fr' },{ id:'a7', cat:'norm' },{ id:'a8', cat:'norm' } + ]); + wireQuiz('p21-q-host', () => { if(window.addXp) window.addXp(10, 'q-p21'); }); + wireQuiz('p21-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p21'); }); + wireReadBtn('p21'); + renderMath(body); +} + +/* ========================================================== */ +/* §22 — Сила тяжести */ +/* ========================================================== */ +function add_p22(){ + const body = document.getElementById('p22-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Притяжение к Земле', '§ 22.1', + 'Земля притягивает все тела возле своей поверхности. Сила, с которой Земля действует на тело, ' + + 'называется силой тяжести $\\vec F_т$. Она направлена вертикально вниз ' + + '(точнее — к центру Земли).'); + + h += makeCard('rule', 'Формула силы тяжести', '§ 22.2', + '$$F_т = m g$$
' + + 'где $m$ — масса тела (кг), $g$ — ускорение свободного падения.

' + + 'На Земле: $g = 9{,}8$ Н/кг (часто округляют до $g \\approx 10$ Н/кг).
' + + 'На Луне: $g_Л \\approx 1{,}6$ Н/кг (в 6 раз меньше).
' + + 'На Марсе: $g_М \\approx 3{,}7$ Н/кг.
' + + 'На Юпитере: $g_Ю \\approx 24{,}8$ Н/кг.'); + + h += makeCard('example', 'Сколько весит яблоко?', '§ 22.3', + 'Масса среднего яблока $m = 100$ г $= 0{,}1$ кг. На Земле:
' + + '$F_т = mg = 0{,}1 \\cdot 9{,}8 \\approx 1$ Н.

' + + 'Поэтому 1 ньютон — это «сила, с которой Земля притягивает 100 г».'); + + /* IV-1 КАЛЬК: F_т = mg, выбор планеты */ + h += wgWrap('p22-iv1', 'КАЛЬК', 'Сила тяжести на разных планетах', 'Выбери планету и тело — узнай, как меняется $F_т$.', + '
' + + [['earth','Земля',9.8],['moon','Луна',1.6],['mars','Марс',3.7],['jupiter','Юпитер',24.8]].map((p, i) => + '').join('') + + '
' + + '' + + '
' + + '$F_т = m g = $ 0.98 Н (на Земле, $g = $ 9.8 Н/кг)' + + '
'); + + /* IV-2 КВИЗ */ + h += wgWrap('p22-iv2', 'КВИЗ', 'Сила тяжести', '', + '
' + + quizQuestion('p22-q', 0, 'Куда направлена сила тяжести на поверхности Земли?', ['Вверх','Вертикально вниз (к центру Земли)','В сторону Солнца','В произвольном направлении'], 1) + + quizQuestion('p22-q', 1, '$g$ на Земле примерно равно…', ['1 Н/кг','9,8 Н/кг','100 Н/кг','1000 Н/кг'], 1) + + quizQuestion('p22-q', 2, 'На Луне $g_Л$ примерно в 6 раз меньше земного. Что произойдёт с $F_т$ камня?', ['Не изменится','Увеличится в 6 раз','Уменьшится в 6 раз','Станет нулевой'], 2) + + quizQuestion('p22-q', 3, 'Масса остаётся постоянной на Земле и Луне, а сила тяжести?', ['Тоже постоянна','Уменьшается на Луне','Увеличивается на Луне','Зависит от формы тела'], 1, 'Масса = «количество вещества», она не меняется. А $F_т = mg$ меняется через $g$.') + + '
'); + + /* IV-3 DnD */ + h += wgWrap('p22-iv3', 'DnD', 'Сопоставь массу и силу тяжести (на Земле)', '', + dndPool('p22-dnd', [ + { id:'a1', cat:'1n', html:'$m = 100$ г' }, + { id:'a2', cat:'10n', html:'$m = 1$ кг' }, + { id:'a3', cat:'100n', html:'$m = 10$ кг' }, + { id:'a4', cat:'1n', html:'$m = 0{,}1$ кг' }, + { id:'a5', cat:'10n', html:'$m = 1000$ г' }, + { id:'a6', cat:'100n', html:'$m = 10\\,000$ г' } + ], [ + { cat:'1n', label:'$F_т \\approx 1$ Н' }, + { cat:'10n', label:'$F_т \\approx 10$ Н' }, + { cat:'100n', label:'$F_т \\approx 100$ Н' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p22-iv4', 'ТРН', 'Тренажёр §22', '', + '
' + + quizQuestion('p22-tr', 0, '$m = 5$ кг. $F_т$ на Земле ($g = 10$ Н/кг)?', ['5 Н','15 Н','50 Н','500 Н'], 2, '$F_т = mg = 5 \\cdot 10 = 50$ Н.') + + quizQuestion('p22-tr', 1, '$m = 200$ г. $F_т$ на Земле ($g = 9{,}8$ Н/кг) ≈?', ['0,98 Н','1,96 Н','19,6 Н','2 Н'], 1, '$F_т = 0{,}2 \\cdot 9{,}8 = 1{,}96$ Н.') + + quizQuestion('p22-tr', 2, 'Космонавт $m = 80$ кг. $F_т$ на Луне ($g_Л = 1{,}6$ Н/кг)?', ['80 Н','128 Н','480 Н','800 Н'], 1, '$F_т = 80 \\cdot 1{,}6 = 128$ Н.') + + quizQuestion('p22-tr', 3, 'Где $F_т$ одной и той же массы больше: на Юпитере или Луне?', ['На Луне','На Юпитере','Одинаково','Зависит от вещества'], 1, 'У Юпитера $g$ намного больше.') + + quizQuestion('p22-tr', 4, 'Чтобы $F_т$ на Земле была $30$ Н, нужна масса…', ['1 кг','2 кг','3 кг','30 кг'], 2, 'При $g \\approx 10$ Н/кг: $m = F_т/g = 30/10 = 3$ кг.') + + '
'); + + h += readButton('p22'); + body.innerHTML = h; + + let g22 = 9.8; + let plName = 'Земле'; + function upd22(){ + const m = +document.getElementById('p22-m-r').value / 1000; // ползунок в граммах + document.getElementById('p22-m').textContent = (m).toFixed(2); + const Ft = m * g22; + document.getElementById('p22-Ft').textContent = Ft.toFixed(2); + document.getElementById('p22-pl-nm').textContent = plName; + document.getElementById('p22-g-val').textContent = g22.toString().replace('.', ','); + } + body.querySelectorAll('.p22-pl').forEach(btn => btn.addEventListener('click', () => { + body.querySelectorAll('.p22-pl').forEach(b => { b.style.background = '#fff'; b.style.color = '#dc2626'; }); + btn.style.background = '#dc2626'; btn.style.color = '#fff'; + g22 = +btn.dataset.g; + plName = btn.dataset.nm; + upd22(); + })); + document.getElementById('p22-m-r').addEventListener('input', upd22); + upd22(); + + wireDnd('p22-dnd', [ + { id:'a1', cat:'1n' },{ id:'a2', cat:'10n' },{ id:'a3', cat:'100n' }, + { id:'a4', cat:'1n' },{ id:'a5', cat:'10n' },{ id:'a6', cat:'100n' } + ]); + wireQuiz('p22-q-host', () => { if(window.addXp) window.addXp(10, 'q-p22'); }); + wireQuiz('p22-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p22'); }); + wireReadBtn('p22'); + renderMath(body); +} + +/* ========================================================== */ +/* §23 — Сила упругости */ +/* ========================================================== */ +function add_p23(){ + const body = document.getElementById('p23-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Когда возникает упругая сила', '§ 23.1', + 'Если тело деформировано (сжато, растянуто, изогнуто), внутри него возникает ' + + 'сила упругости $\\vec F_{упр}$, которая стремится вернуть тело в исходную форму.

' + + 'Природа этой силы — взаимодействие молекул, изученное в §10.'); + + h += makeCard('rule', 'Закон Гука (качественно)', '§ 23.2', + '$$F_{упр} \\sim \\Delta l$$
' + + 'Сила упругости пропорциональна удлинению $\\Delta l$. ' + + 'То есть в 2 раза больше растянули → в 2 раза больше сила.

' + + 'Внимание: закон работает только пока деформация мала. Если перерастянуть пружину — ' + + 'она не вернётся в исходное положение (пластическая деформация).'); + + h += makeCard('example', 'Где встречается', '§ 23.3', + '
    ' + + '
  • Пружина матраса, ручки, амортизатора.
  • ' + + '
  • Резинка для волос, рогатка.
  • ' + + '
  • Лук: тетива растянута → возвращает стрелу.
  • ' + + '
  • Опора прогибается под весом и отвечает реакцией $\\vec N$ — это тоже упругая сила.
  • ' + + '
'); + + /* IV-1 СИМ: пружина с slider */ + h += wgWrap('p23-iv1', 'СИМ', 'Пружина: растяжение и сила', 'Меняй удлинение — увидь, как растёт сила упругости.', + '
' + + '' + + '
'); + + /* IV-2 КВИЗ */ + h += wgWrap('p23-iv2', 'КВИЗ', 'Упругость', '', + '
' + + quizQuestion('p23-q', 0, 'Когда возникает сила упругости?', ['Всегда','Только в жидкостях','При деформации тела','При движении'], 2) + + quizQuestion('p23-q', 1, 'Куда направлена $\\vec F_{упр}$?', ['В сторону деформации','Против деформации (возвращает в исходное)','Вертикально вниз','Зависит от тела'], 1) + + quizQuestion('p23-q', 2, 'Если растянуть пружину в 3 раза сильнее, $F_{упр}$ изменится…', ['Не изменится','Увеличится в 3 раза','Уменьшится в 3 раза','Увеличится в 9 раз'], 1, 'Это закон Гука: $F \\sim \\Delta l$.') + + '
'); + + /* IV-3 DnD */ + h += wgWrap('p23-iv3', 'DnD', 'Деформация или нет?', '', + dndPool('p23-dnd', [ + { id:'a1', cat:'def', html:'Сжатая пружина матраса' }, + { id:'a2', cat:'def', html:'Растянутая резинка' }, + { id:'a3', cat:'def', html:'Прогнутая доска под весом' }, + { id:'a4', cat:'def', html:'Натянутая тетива лука' }, + { id:'a5', cat:'no', html:'Лежащий камень (нет видимой деформации)' }, + { id:'a6', cat:'no', html:'Висящая на крючке шапка' } + ], [ + { cat:'def', label:'Есть деформация → есть $F_{упр}$' }, + { cat:'no', label:'Нет видимой деформации' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p23-iv4', 'ТРН', 'Тренажёр §23', '', + '
' + + quizQuestion('p23-tr', 0, 'Природа силы упругости — это…', ['Гравитация','Взаимодействие молекул','Магнетизм','Электричество'], 1) + + quizQuestion('p23-tr', 1, 'Если пружину растянуть слишком сильно, она…', ['Останется упругой','Может остаться растянутой (пластическая деформация)','Станет тяжелее','Не изменится'], 1) + + quizQuestion('p23-tr', 2, 'Что является примером упругой деформации?', ['Растяжение пружины и возврат','Лепка из пластилина','Раскалывание камня','Резка хлеба'], 0) + + quizQuestion('p23-tr', 3, 'Какая из сил из жизни — упругая?', ['Сила тяжести','Сила трения','Реакция опоры $\\vec N$','Лунное притяжение'], 2, 'Опора прогибается и «отвечает» упругой силой.') + + '
'); + + h += readButton('p23'); + body.innerHTML = h; + + function draw23(){ + const dl = +document.getElementById('p23-dl-r').value; + document.getElementById('p23-dl').textContent = dl; + const F = dl * 2; // условный коэф. жёсткости 2 Н/см + const W = 380, H = 160; + const topY = 20, hookX = 80; + const naturalLen = 60; + const totalLen = naturalLen + dl * 3.5; // визуально усилено + let s = ''; + // Потолок + s += ''; + for(let i = 0; i < 6; i++) s += ''; + // Подвес + s += ''; + // Пружина (зигзаг) + const coils = 8; + let path = 'M ' + hookX + ' ' + topY; + for(let i = 0; i < coils; i++){ + const y = topY + (i + 0.5) * (totalLen / coils); + path += ' L ' + (hookX + (i%2 ? 18 : -18)) + ' ' + y; + } + path += ' L ' + hookX + ' ' + (topY + totalLen); + s += ''; + // Груз + s += ''; + s += 'груз'; + // Стрелка F_упр (вверх) и F_т (вниз) если dl>0 + if(dl > 0){ + const arrY = topY + totalLen + 50; + // F_упр вверх + s += ''; + s += ''; + s += 'F_упр = ' + F + ' Н ↑'; + // F_т вниз + s += ''; + s += ''; + s += 'F_т ↓'; + } + document.getElementById('p23-svg').innerHTML = s; + document.getElementById('p23-info').innerHTML = 'Удлинение $\\Delta l = ' + dl + '$ см · $F_{упр} \\approx $ ' + F + ' Н (при коэф. жёсткости $k = 2$ Н/см)'; + renderMath(document.getElementById('p23-info')); + } + document.getElementById('p23-dl-r').addEventListener('input', draw23); + draw23(); + + wireDnd('p23-dnd', [ + { id:'a1', cat:'def' },{ id:'a2', cat:'def' },{ id:'a3', cat:'def' }, + { id:'a4', cat:'def' },{ id:'a5', cat:'no' },{ id:'a6', cat:'no' } + ]); + wireQuiz('p23-q-host', () => { if(window.addXp) window.addXp(10, 'q-p23'); }); + wireQuiz('p23-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p23'); }); + wireReadBtn('p23'); + renderMath(body); +} + +/* ========================================================== */ +/* §24 — Вес тела */ +/* ========================================================== */ +function add_p24(){ + const body = document.getElementById('p24-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Что такое вес', '§ 24.1', + 'Вес $\\vec P$ — это сила, с которой тело давит на опору (или растягивает подвес) ' + + 'вследствие притяжения к Земле.

' + + 'Это не то же самое, что сила тяжести! Хоть на покоящемся теле они равны по модулю, ' + + 'они приложены к разным телам:' + + '
    ' + + '
  • $\\vec F_т$ — действует на само тело от Земли;
  • ' + + '
  • $\\vec P$ — действует на опору или подвес от тела.
  • ' + + '
'); + + h += makeCard('rule', 'Когда $P = F_т$, а когда нет', '§ 24.2', + 'Покоится на горизонтальной опоре или висит на нити: $P = F_т = mg$.

' + + 'Невесомость (свободное падение): $P = 0$ — тело не давит на опору. ' + + 'Космонавт на МКС в невесомости — у него масса есть, $F_т$ от Земли тоже есть, ' + + 'а вот вес $P = 0$, потому что станция падает на Землю вместе с ним.

' + + 'Перегрузка: в ускоряющемся лифте вверх вес больше $mg$. В лифте вниз — меньше.'); + + h += makeCard('example', 'Как взвешивают тело', '§ 24.3', + 'На чашечных весах сравнивают вес тела и вес гирь. ' + + 'Когда чашечки уравновешены — массы равны (поскольку $g$ одинаков, и $P = mg$).

' + + 'На пружинных весах (динамометре) измеряют силу, с которой тело растягивает пружину. ' + + 'Это и есть вес тела в Ньютонах.'); + + /* IV-1 СИМ: тело в 3 ситуациях */ + h += wgWrap('p24-iv1', 'СИМ', 'Три ситуации: покой, падение, ускорение', 'Выбери ситуацию — увидь стрелки сил.', + '
' + + [['rest','На столе (покой)'],['fall','Свободное падение'],['up','Ускоряется вверх'],['down','Ускоряется вниз']].map((s, i) => + '').join('') + + '
' + + '' + + '
'); + + /* IV-2 КВИЗ */ + h += wgWrap('p24-iv2', 'КВИЗ', 'Вес vs сила тяжести', '', + '
' + + quizQuestion('p24-q', 0, 'К чему приложена сила тяжести $\\vec F_т$?', ['К опоре','К самому телу','К центру Земли','К воздуху'], 1) + + quizQuestion('p24-q', 1, 'К чему приложен вес $\\vec P$?', ['К телу','К опоре или подвесу','К атмосфере','К центру Земли'], 1) + + quizQuestion('p24-q', 2, 'Космонавт в МКС находится в…', ['Состоянии покоя','Невесомости (P = 0)','Перегрузке','Постоянной силе'], 1) + + quizQuestion('p24-q', 3, 'Тело $m = 2$ кг лежит на столе. Чему равен вес? ($g = 10$ Н/кг)', ['2 Н','10 Н','20 Н','200 Н'], 2, '$P = mg = 2 \\cdot 10 = 20$ Н.') + + '
'); + + /* IV-3 DnD */ + h += wgWrap('p24-iv3', 'DnD', 'Какая сила куда приложена?', '', + dndPool('p24-dnd', [ + { id:'a1', cat:'ft', html:'Земля тянет яблоко вниз' }, + { id:'a2', cat:'ft', html:'Земля тянет космонавта на орбите' }, + { id:'a3', cat:'p', html:'Книга давит на стол' }, + { id:'a4', cat:'p', html:'Гирька растягивает пружину' }, + { id:'a5', cat:'zero', html:'Космонавт в невесомости (P = 0)' }, + { id:'a6', cat:'zero', html:'Шарик в свободном падении' } + ], [ + { cat:'ft', label:'$\\vec F_т$ (на тело)' }, + { cat:'p', label:'$\\vec P$ (на опору/подвес)' }, + { cat:'zero', label:'$P = 0$ (невесомость)' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p24-iv4', 'ТРН', 'Тренажёр §24', '', + '
' + + quizQuestion('p24-tr', 0, '$m = 0{,}5$ кг лежит на столе. Вес (при $g = 10$ Н/кг)?', ['0,5 Н','5 Н','50 Н','500 Н'], 1) + + quizQuestion('p24-tr', 1, 'Гиря $m = 100$ г висит на нити. Сила, с которой нить растягивается, равна:', ['1 Н','10 Н','100 Н','0,1 Н'], 0, '$P = mg = 0{,}1 \\cdot 10 = 1$ Н.') + + quizQuestion('p24-tr', 2, 'В свободно падающем лифте чувствует ли пассажир свой вес?', ['Да, как всегда','Нет, наступает невесомость','В 2 раза больше','В 2 раза меньше'], 1) + + quizQuestion('p24-tr', 3, 'На Луне ($g_Л = 1{,}6$ Н/кг) тело массой $5$ кг весит:', ['5 Н','8 Н','16 Н','50 Н'], 1, '$P = 5 \\cdot 1{,}6 = 8$ Н.') + + '
'); + + h += readButton('p24'); + body.innerHTML = h; + + function draw24(s){ + const svg = document.getElementById('p24-svg'); + if(!svg) return; + const cx = 180, cy = 100; + let html = ''; + let info = ''; + if(s === 'rest'){ + // Тело на столе + html += ''; + for(let i = 0; i < 14; i++) html += ''; + html += ''; + // F_т вниз (фиолетовая) + html += ''; + html += ''; + html += 'F_т (на тело)'; + // P вниз от низа тела (индиго) + html += ''; + html += ''; + html += 'P (на стол)'; + info = 'Покой на горизонтальной опоре: $P = F_т = mg$, но приложены к разным телам.'; + } else if(s === 'fall'){ + html += ''; + // F_т вниз + html += ''; + html += ''; + html += 'F_т ↓'; + // P = 0 — пиктограмма + html += 'P = 0'; + html += 'невесомость'; + info = 'Свободное падение / орбита: сила тяжести есть ($F_т = mg \\ne 0$), но вес $P = 0$ — тело ни на что не давит.'; + } else if(s === 'up'){ + html += ''; + html += ''; // тяга вверх + html += ''; + // F_т + html += ''; + html += ''; + html += 'F_т = mg'; + // P больше — длинная стрелка + html += ''; + html += ''; + html += 'P > mg (перегрузка)'; + info = 'Лифт ускоряется вверх: вес больше $mg$ — это перегрузка. Космонавты на старте испытывают $P \\approx 3 mg$.'; + } else { + // down + html += ''; + html += ''; + html += ''; + html += ''; + html += 'F_т = mg'; + // P меньше — короткая стрелка + html += ''; + html += ''; + html += 'P < mg'; + info = 'Лифт ускоряется вниз: вес меньше $mg$. Если ускорение $= g$, то $P = 0$ — невесомость.'; + } + svg.innerHTML = html; + document.getElementById('p24-info').innerHTML = info; + renderMath(document.getElementById('p24-info')); + } + body.querySelectorAll('.p24-sit').forEach(btn => btn.addEventListener('click', () => { + body.querySelectorAll('.p24-sit').forEach(b => { b.style.background = '#fff'; b.style.color = '#dc2626'; }); + btn.style.background = '#dc2626'; btn.style.color = '#fff'; + draw24(btn.dataset.s); + })); + draw24('rest'); + + wireDnd('p24-dnd', [ + { id:'a1', cat:'ft' },{ id:'a2', cat:'ft' },{ id:'a3', cat:'p' }, + { id:'a4', cat:'p' },{ id:'a5', cat:'zero' },{ id:'a6', cat:'zero' } + ]); + wireQuiz('p24-q-host', () => { if(window.addXp) window.addXp(10, 'q-p24'); }); + wireQuiz('p24-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p24'); }); + wireReadBtn('p24'); + renderMath(body); +} + +/* ========================================================== */ +/* §25 — Динамометр */ +/* ========================================================== */ +function add_p25(){ + const body = document.getElementById('p25-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Принцип работы', '§ 25.1', + 'Динамометр (от греч. динамис — сила) — прибор для измерения силы.

' + + 'В основе — пружина: чем сильнее её растягивают, тем больше она удлиняется. ' + + 'Шкала проградуирована так, чтобы каждому положению указателя соответствовала сила в ньютонах.'); + + h += makeCard('rule', 'Виды динамометров', '§ 25.2', + '
    ' + + '
  • Школьный лабораторный — обычно $0..4$ Н или $0..10$ Н, цена деления $0{,}1$ Н.
  • ' + + '
  • Медицинский (для силы кисти) — до $600$ Н.
  • ' + + '
  • Промышленный — для измерения тяги машин, до тысяч Н и больше.
  • ' + + '
' + + 'Правила: прибор калибруют в вертикальном положении; не превышай предел шкалы (иначе пружина испортится).'); + + h += makeCard('example', 'Связь с массой', '§ 25.3', + 'Динамометр измеряет силу (например, вес висящего груза). Если знаешь $g$, можно найти массу:
' + + '$$m = \\dfrac{F}{g}$$
' + + 'Например, динамометр показал $P = 5$ Н. Тогда $m = 5 / 10 = 0{,}5$ кг $= 500$ г.'); + + /* IV-1 СИМ: виртуальный динамометр */ + h += wgWrap('p25-iv1', 'СИМ', 'Виртуальный динамометр', 'Меняй силу — наблюдай растяжение пружины и положение указателя.', + '
' + + '' + + '' + + '
' + + '' + + '
'); + + /* IV-2 КАЛЬК: F = mg обратное */ + h += wgWrap('p25-iv2', 'КАЛЬК', 'Динамометр → масса', 'По показанию динамометра найди массу тела.', + '
' + + '' + + '' + + '
' + + '
$m = F/g = $ 0.51 кг $= $ 510 г
'); + + /* IV-3 DnD */ + h += wgWrap('p25-iv3', 'DnD', 'Выбери подходящий динамометр', '', + dndPool('p25-dnd', [ + { id:'a1', cat:'school', html:'Измерить вес гирьки 200 г' }, + { id:'a2', cat:'school', html:'Найти силу упругости школьной пружины' }, + { id:'a3', cat:'med', html:'Измерить силу кисти руки спортсмена' }, + { id:'a4', cat:'med', html:'Тест на здоровье в поликлинике' }, + { id:'a5', cat:'ind', html:'Тяга трактора, тащащего прицеп' }, + { id:'a6', cat:'ind', html:'Сила, с которой буксир тянет баржу' } + ], [ + { cat:'school', label:'Школьный (0..10 Н)' }, + { cat:'med', label:'Медицинский (до 600 Н)' }, + { cat:'ind', label:'Промышленный (тысячи Н)' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p25-iv4', 'ТРН', 'Тренажёр §25', '', + '
' + + quizQuestion('p25-tr', 0, 'Динамометр показал $F = 4$ Н на Земле ($g = 10$). Масса тела?', ['0,4 кг','4 кг','40 кг','0,04 кг'], 0) + + quizQuestion('p25-tr', 1, 'Какова цена деления школьного динамометра 0..4 Н с 40 малыми делениями?', ['0,01 Н','0,1 Н','0,4 Н','1 Н'], 1, '$C = 4/40 = 0{,}1$ Н.') + + quizQuestion('p25-tr', 2, 'Принцип работы динамометра основан на…', ['Силе тяжести','Растяжении пружины (упругая сила)','Магнитном поле','Электричестве'], 1) + + quizQuestion('p25-tr', 3, 'Что произойдёт, если превысить предел шкалы?', ['Ничего','Пружина испортится','Прибор сам сломается','Подаст звуковой сигнал'], 1) + + '
'); + + h += readButton('p25'); + body.innerHTML = h; + + function draw25(){ + const F = +document.getElementById('p25-F-r').value; + const Fmax = +document.getElementById('p25-Fmax-r').value; + document.getElementById('p25-F').textContent = F.toFixed(1); + document.getElementById('p25-Fmax').textContent = Fmax; + if(window.PHYS && window.PHYS.dynamometer){ + let svgInner = window.PHYS.dynamometer(80, 20, 160, Fmax, Math.min(F, Fmax)); + // Цвет фона для подложки + document.getElementById('p25-svg').innerHTML = '' + svgInner; + } + document.getElementById('p25-info').innerHTML = F > Fmax + ? 'Превышение предела! Реальная сила $F = ' + F.toFixed(1) + '$ Н > $F_{max} = ' + Fmax + '$ Н. Пружина может испортиться.' + : 'Показание: $F = ' + F.toFixed(1) + '$ Н из $' + Fmax + '$ Н. Цена деления $\\approx ' + (Fmax/20).toFixed(2) + '$ Н.'; + renderMath(document.getElementById('p25-info')); + } + ['p25-F-r','p25-Fmax-r'].forEach(id => document.getElementById(id).addEventListener('input', draw25)); + draw25(); + + const upd25c = () => { + const F = +document.getElementById('p25c-F-r').value; + const g = +document.getElementById('p25c-g-s').value; + document.getElementById('p25c-F').textContent = F.toFixed(1); + document.getElementById('p25c-g').textContent = g.toString().replace('.', ','); + const m = F / g; + document.getElementById('p25c-m').textContent = m.toFixed(3); + document.getElementById('p25c-mg').textContent = (m * 1000).toFixed(0); + }; + document.getElementById('p25c-F-r').addEventListener('input', upd25c); + document.getElementById('p25c-g-s').addEventListener('change', upd25c); + upd25c(); + + wireDnd('p25-dnd', [ + { id:'a1', cat:'school' },{ id:'a2', cat:'school' },{ id:'a3', cat:'med' }, + { id:'a4', cat:'med' },{ id:'a5', cat:'ind' },{ id:'a6', cat:'ind' } + ]); + wireQuiz('p25-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p25'); }); + wireReadBtn('p25'); + renderMath(body); +} + +/* ========================================================== */ +/* §26 — Сложение сил. Равнодействующая (ГЛАВНЫЙ ВИЗУАЛ ГЛАВЫ 3) */ +/* ========================================================== */ +function add_p26(){ + const body = document.getElementById('p26-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Что такое равнодействующая', '§ 26.1', + 'Если на тело действует несколько сил, их совместное действие можно заменить одной силой — ' + + 'равнодействующей $\\vec R$.

' + + 'Тело ведёт себя так, словно на него действует только $\\vec R$. Например, если $R = 0$ — тело покоится ' + + 'или движется равномерно (силы уравновешены).'); + + h += makeCard('rule', 'Силы на одной прямой', '§ 26.2', + 'Сонаправленные силы (в одну сторону): $$R = F_1 + F_2$$ направление — то же.

' + + 'Противоположные силы: $$R = |F_1 - F_2|$$ направление — в сторону большей силы.

' + + 'Если $F_1 = F_2$ и они противоположны — $R = 0$, тело в равновесии.'); + + h += makeCard('example', 'Перетягивание каната', '§ 26.3', + 'Команда А тянет канат с силой $F_A = 600$ Н вправо. Команда Б — $F_Б = 500$ Н влево.
' + + '$R = 600 - 500 = 100$ Н вправо. Канат смещается в сторону команды А.

' + + 'Если бы $F_A = F_Б = 600$ Н, было бы равновесие — канат стоял бы на месте.'); + + /* IV-1 ГЛАВНЫЙ ВИЗУАЛ: Конструктор сил на теле */ + h += wgWrap('p26-iv1', 'СИМ', 'Конструктор сил на теле — главный визуал', 'Двигай ползунки 4 сил → видишь, как меняется равнодействующая и поведение тела.', + '
' + + '' + + '' + + '' + + '' + + '
' + + '' + + '
'); + + /* IV-2 КАЛЬК */ + h += wgWrap('p26-iv2', 'КАЛЬК', 'Сложение двух сил на одной прямой', '', + '
' + + '' + + '' + + '' + + '
' + + '
'); + + /* IV-3 DnD */ + h += wgWrap('p26-iv3', 'DnD', 'Куда направлена R?', '', + dndPool('p26-dnd', [ + { id:'a1', cat:'right', html:'$F_1 = 10$ Н →, $F_2 = 4$ Н →' }, + { id:'a2', cat:'right', html:'$F_1 = 8$ Н →, $F_2 = 5$ Н ←' }, + { id:'a3', cat:'left', html:'$F_1 = 3$ Н →, $F_2 = 9$ Н ←' }, + { id:'a4', cat:'left', html:'$F_1 = 5$ Н ←, $F_2 = 5$ Н ←' }, + { id:'a5', cat:'zero', html:'$F_1 = 7$ Н →, $F_2 = 7$ Н ←' }, + { id:'a6', cat:'zero', html:'Только $F_т$ и $N$ равны на горизонтальной опоре' } + ], [ + { cat:'right', label:'R направлена →' }, + { cat:'left', label:'R направлена ←' }, + { cat:'zero', label:'R = 0' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p26-iv4', 'ТРН', 'Тренажёр §26', '', + '
' + + quizQuestion('p26-tr', 0, '$F_1 = 6$ Н, $F_2 = 4$ Н, сонаправлены. R?', ['2 Н','4 Н','10 Н','24 Н'], 2) + + quizQuestion('p26-tr', 1, '$F_1 = 10$ Н, $F_2 = 6$ Н, противоположны. Модуль R?', ['4 Н','6 Н','10 Н','16 Н'], 0) + + quizQuestion('p26-tr', 2, 'Книга лежит на столе. Действуют $F_т$ и $N$. Чему равна R?', ['$mg$','$2mg$','$0$','$N - F_т$'], 2, 'Тело в покое → силы уравновешены, $R = 0$.') + + quizQuestion('p26-tr', 3, 'На брусок действуют $F_{тяги} = 12$ Н → и $F_{тр} = 5$ Н ←. Куда движется?', ['Покоится','Влево','Вправо','Невозможно сказать'], 2, '$R = 12-5 = 7$ Н → — вправо.') + + quizQuestion('p26-tr', 4, '$F_1 = F_2 = 8$ Н, противоположны. R?', ['0','8 Н','16 Н','Зависит от массы'], 0) + + '
'); + + h += readButton('p26'); + body.innerHTML = h; + + function draw26(){ + const Ft = +document.getElementById('p26-ft-r').value; + const N = +document.getElementById('p26-N-r').value; + const Ftt = +document.getElementById('p26-Ft2-r').value; + const Ftr = +document.getElementById('p26-Ftr-r').value; + document.getElementById('p26-ft').textContent = Ft; + document.getElementById('p26-N').textContent = N; + document.getElementById('p26-Ft2').textContent = Ftt; + document.getElementById('p26-Ftr').textContent = Ftr; + const Rx = Ftt - Ftr; + const Ry = Ft - N; // положительное Ry — вниз + const R = Math.hypot(Rx, Ry); + + const cx = 200, cy = 130; + const sc = 3.5; // px/Н + let s = ''; + // Земля + s += ''; + for(let i = 0; i < 14; i++) s += ''; + // Тело — куб + s += ''; + // Стрелки сил + function arrow(x1,y1,x2,y2,col,label){ + const len = Math.hypot(x2-x1, y2-y1); + if(len < 4) return ''; + const a = Math.atan2(y2-y1, x2-x1); + const ah = 8; + const ax1 = x2 - ah * Math.cos(a - 0.45); + const ay1 = y2 - ah * Math.sin(a - 0.45); + const ax2 = x2 - ah * Math.cos(a + 0.45); + const ay2 = y2 - ah * Math.sin(a + 0.45); + return '' + + '' + + '' + label + ''; + } + s += arrow(cx, cy, cx, cy + Ft * sc, '#7c3aed', 'F_т=' + Ft); // вниз + s += arrow(cx, cy, cx, cy - N * sc, '#475569', 'N=' + N); // вверх + s += arrow(cx, cy, cx + Ftt * sc, cy, '#10b981', 'F_тяги=' + Ftt); // вправо + s += arrow(cx, cy, cx - Ftr * sc, cy, '#92400e', 'F_тр=' + Ftr); // влево + // Равнодействующая + if(R > 0.1){ + s += arrow(cx, cy, cx + Rx * sc, cy + Ry * sc, '#dc2626', 'R=' + R.toFixed(1)); + } + document.getElementById('p26-svg').innerHTML = s; + + // Info + let verdict; + if(R < 0.1) verdict = 'Силы уравновешены. R = 0 — тело в покое или движется равномерно.'; + else if(Math.abs(Ry) < 0.1 && Rx > 0) verdict = 'R = ' + Rx + ' Н вправо — тело ускоряется вправо.'; + else if(Math.abs(Ry) < 0.1 && Rx < 0) verdict = 'R = ' + (-Rx) + ' Н влево — тело ускоряется влево.'; + else if(Math.abs(Rx) < 0.1 && Ry > 0) verdict = 'R = ' + Ry + ' Н вниз — тело падает / провалится.'; + else if(Math.abs(Rx) < 0.1 && Ry < 0) verdict = 'R = ' + (-Ry) + ' Н вверх — тело подпрыгнет.'; + else verdict = 'R ≈ ' + R.toFixed(1) + ' Н — тело ускоряется под углом.'; + document.getElementById('p26-info').innerHTML = verdict + '
$R_x = F_{тяги} - F_{тр} = ' + Rx + '$, $R_y = F_т - N = ' + Ry + '$'; + renderMath(document.getElementById('p26-info')); + } + ['p26-ft-r','p26-N-r','p26-Ft2-r','p26-Ftr-r'].forEach(id => document.getElementById(id).addEventListener('input', draw26)); + draw26(); + + const upd26c = () => { + const F1 = +document.getElementById('p26c-F1-r').value; + const F2 = +document.getElementById('p26c-F2-r').value; + const dir = document.getElementById('p26c-dir').value; + document.getElementById('p26c-F1').textContent = F1; + document.getElementById('p26c-F2').textContent = F2; + let R; + if(dir === 'same') R = F1 + F2; + else R = Math.abs(F1 - F2); + let arrow1 = '→', arrow2 = '→'; + if(dir === 'opp') arrow2 = '←'; + let result; + if(dir === 'same') result = '$R = F_1 + F_2 = ' + F1 + ' + ' + F2 + ' = $ ' + R + ' Н (→)'; + else { + const dir_arrow = F1 > F2 ? '→' : (F2 > F1 ? '←' : ''); + result = '$R = |F_1 - F_2| = |' + F1 + ' - ' + F2 + '| = $ ' + R + ' Н ' + (R === 0 ? '(равновесие)' : '(' + dir_arrow + ')'); + } + document.getElementById('p26c-out').innerHTML = result; + renderMath(document.getElementById('p26c-out')); + }; + ['p26c-F1-r','p26c-F2-r'].forEach(id => document.getElementById(id).addEventListener('input', upd26c)); + document.getElementById('p26c-dir').addEventListener('change', upd26c); + upd26c(); + + wireDnd('p26-dnd', [ + { id:'a1', cat:'right' },{ id:'a2', cat:'right' },{ id:'a3', cat:'left' }, + { id:'a4', cat:'left' },{ id:'a5', cat:'zero' },{ id:'a6', cat:'zero' } + ]); + wireQuiz('p26-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p26'); }); + wireReadBtn('p26'); + renderMath(body); +} + +/* ========================================================== */ +/* §27 — Трение. Сила трения */ +/* ========================================================== */ +function add_p27(){ + const body = document.getElementById('p27-body'); + if(!body) return; + let h = ''; + + h += makeCard('theory', 'Откуда берётся трение', '§ 27.1', + 'При движении (или попытке движения) одного тела по поверхности другого возникает сила, ' + + 'мешающая движению — сила трения $\\vec F_{тр}$. Она направлена против движения.

' + + 'Причины: шероховатость поверхностей и притяжение молекул в местах контакта.'); + + h += makeCard('rule', 'Виды трения', '§ 27.2', + '
    ' + + '
  • Трение покоя — мешает сдвинуть тело с места. Бывает максимальным, после чего тело начинает скользить.
  • ' + + '
  • Трение скольжения — действует на скользящее тело. $F_{тр} \\approx \\mu N$, где $\\mu$ — коэффициент трения, $N$ — нормальная реакция (≈ вес).
  • ' + + '
  • Трение качения — катит колесо. Намного меньше скольжения. Поэтому колесо — гениальное изобретение.
  • ' + + '
' + + '$F_{тр}$ не зависит (почти) от площади контакта, но зависит от $N$ и от шероховатости.'); + + h += makeCard('example', 'Где трение мешает, а где помогает', '§ 27.3', + 'Полезно: идти и ехать (без трения — гололёд!), тормоза, гвозди в дереве, держать карандаш.
' + + 'Мешает: греет и изнашивает детали машин, замедляет движение. Чтобы уменьшить — смазывают маслом, ставят подшипники.'); + + /* IV-1 СИМ: брусок на поверхности с slider массы, μ, тяги */ + h += wgWrap('p27-iv1', 'СИМ', 'Симулятор трения', 'Меняй массу, материал и силу тяги — посмотри, едет брусок или стоит.', + '
' + + '' + + '' + + '' + + '
' + + '' + + '
'); + + /* IV-2 КВИЗ */ + h += wgWrap('p27-iv2', 'КВИЗ', 'Трение', '', + '
' + + quizQuestion('p27-q', 0, 'Куда направлена сила трения скольжения?', ['Перпендикулярно движению','Против движения','Вверх','Куда угодно'], 1) + + quizQuestion('p27-q', 1, 'Какое трение наименьшее (при прочих равных)?', ['Покоя','Скольжения','Качения','Все одинаковы'], 2) + + quizQuestion('p27-q', 2, 'Если на тело давит больший вес, $F_{тр}$ при скольжении…', ['Не меняется','Увеличивается','Уменьшается','Становится 0'], 1, '$F_{тр} \\sim N$, а $N$ зависит от веса.') + + quizQuestion('p27-q', 3, 'Гололёд опасен, потому что коэф. трения…', ['Очень большой','Очень маленький','Не существует','Зависит от веса'], 1) + + '
'); + + /* IV-3 DnD */ + h += wgWrap('p27-iv3', 'DnD', 'Трение полезно или вредно?', '', + dndPool('p27-dnd', [ + { id:'a1', cat:'good', html:'Можно идти (нога не скользит)' }, + { id:'a2', cat:'good', html:'Тормоза машины' }, + { id:'a3', cat:'good', html:'Гвоздь держится в доске' }, + { id:'a4', cat:'bad', html:'Шестерёнки изнашиваются' }, + { id:'a5', cat:'bad', html:'Двигатель греется и теряет КПД' }, + { id:'a6', cat:'bad', html:'Лыжи скользят медленнее без смазки' } + ], [ + { cat:'good', label:'Полезно' }, + { cat:'bad', label:'Мешает' } + ])); + + /* IV-4 ТРН */ + h += wgWrap('p27-iv4', 'ТРН', 'Тренажёр §27', '', + '
' + + quizQuestion('p27-tr', 0, 'Брусок $m = 2$ кг, $\\mu = 0{,}3$. $F_{тр}$ при скольжении (g=10)?', ['3 Н','6 Н','10 Н','20 Н'], 1, '$N = mg = 20$ Н. $F_{тр} = \\mu N = 0{,}3 \\cdot 20 = 6$ Н.') + + quizQuestion('p27-tr', 1, 'Чтобы брусок $m = 5$ кг сдвинуть, надо приложить $F > F_{тр\\,пок}$. Если $\\mu_{пок} = 0{,}4$ и $g = 10$, минимальная $F$?', ['10 Н','15 Н','20 Н','25 Н'], 2, '$F_{тр\\,пок} = \\mu N = 0{,}4 \\cdot 50 = 20$ Н.') + + quizQuestion('p27-tr', 2, 'Подшипники нужны, чтобы…', ['Увеличить трение','Заменить трение скольжения трением качения','Прибавить веса','Соединить детали'], 1) + + quizQuestion('p27-tr', 3, 'Если смазать ось маслом, $F_{тр}$ …', ['Увеличится','Уменьшится','Не изменится','Станет нулевой'], 1) + + quizQuestion('p27-tr', 4, 'Лыжи покрывают воском, чтобы…', ['Защитить от воды','Уменьшить трение','Увеличить массу','Покрасить'], 1) + + '
'); + + h += readButton('p27'); + body.innerHTML = h; + + function draw27(){ + const m = +document.getElementById('p27-m-r').value; + const F = +document.getElementById('p27-F-r').value; + const mu = +document.getElementById('p27-mu').value; + document.getElementById('p27-m').textContent = m; + document.getElementById('p27-F').textContent = F; + const g = 10; + const N = m * g; + const FtrMax = mu * N; + const moving = F > FtrMax; + const Ftr = moving ? FtrMax : F; + const R = moving ? (F - FtrMax) : 0; + + const W = 380, H = 150, baseY = 110; + let s = ''; + s += ''; + for(let i = 0; i < 18; i++) s += ''; + // Брусок + const bx = 130, bw = 80, bh = 40; + s += ''; + s += 'm=' + m + ' кг'; + // F тяги (вправо) + const fLen = Math.min(80, F * 1.5); + s += ''; + s += ''; + s += 'F=' + F + 'Н'; + // F_тр (влево, от низа бруска) + const trLen = Math.min(80, Ftr * 1.5); + if(trLen > 2){ + s += ''; + s += ''; + s += 'F_тр=' + Ftr.toFixed(1) + 'Н'; + } + // Verdict + s += '' + (moving ? 'ЕДЕТ →' : 'ПОКОИТСЯ') + ''; + document.getElementById('p27-svg').innerHTML = s; + + document.getElementById('p27-info').innerHTML = + '$N = mg = ' + N + '$ Н,   $F_{тр\\,max} = \\mu N = ' + FtrMax.toFixed(1) + '$ Н
' + + (moving + ? '$F$ > $F_{тр}$ → тело ускоряется, $R = F - F_{тр} = ' + R.toFixed(1) + '$ Н вправо.' + : '$F \\le F_{тр\\,max}$ → трение покоя уравновешивает силу тяги, $R = 0$. Тело не сдвинется.'); + renderMath(document.getElementById('p27-info')); + } + ['p27-m-r','p27-F-r'].forEach(id => document.getElementById(id).addEventListener('input', draw27)); + document.getElementById('p27-mu').addEventListener('change', draw27); + draw27(); + + wireDnd('p27-dnd', [ + { id:'a1', cat:'good' },{ id:'a2', cat:'good' },{ id:'a3', cat:'good' }, + { id:'a4', cat:'bad' },{ id:'a5', cat:'bad' },{ id:'a6', cat:'bad' } + ]); + wireQuiz('p27-q-host', () => { if(window.addXp) window.addXp(10, 'q-p27'); }); + wireQuiz('p27-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p27'); }); + wireReadBtn('p27'); + renderMath(body); +} + +/* ========================================================== */ +/* Финал главы 3 — 10 боссов + ачивка «Мастер движения» */ +/* ========================================================== */ +function add_final3(){ + const body = document.getElementById('final3-body'); + if(!body) return; + let h = ''; + + h += '
' + + '
Финал главы 3: победи 10 боссов
' + + '
Реши все 10 задач — получишь ачивку «Мастер движения» и +50 XP.
' + + '
' + + '
Побеждено: 0 / 10
' + + '
'; + + const bosses = [ + { n:1, tag:'§16', title:'Скорость', + q:'Автомобиль за $t = 4$ с проехал $s = 80$ м равномерно. Найди $v$ в м/с.', + hint:'$v = s/t = 80/4 = 20$ м/с.', + ans:20, tol:0.2, step:'0.1' }, + { n:2, tag:'§18', title:'Средняя скорость', + q:'Велосипедист: $v_1 = 10$ м/с за $t_1 = 60$ с, потом $v_2 = 4$ м/с за $t_2 = 60$ с. $\\langle v\\rangle$ в м/с?', + hint:'$\\langle v\\rangle = (10\\cdot 60 + 4\\cdot 60)/(60+60) = 840/120 = 7$ м/с.', + ans:7, tol:0.2, step:'0.1' }, + { n:3, tag:'§20', title:'Плотность', + q:'Брусок $V = 50$ см³, $m = 390$ г. Плотность $\\rho$ в г/см³? Что за вещество?', + hint:'$\\rho = 390/50 = 7{,}8$ г/см³ — железо.', + ans:7.8, tol:0.1, step:'0.1' }, + { n:4, tag:'§22', title:'Сила тяжести на Земле', + q:'$m = 4$ кг, $g = 9{,}8$ Н/кг. Найди $F_т$ в Н (округли до десятых).', + hint:'$F_т = mg = 4 \\cdot 9{,}8 = 39{,}2$ Н.', + ans:39.2, tol:0.2, step:'0.1' }, + { n:5, tag:'§22', title:'Сила тяжести на Луне', + q:'Тот же камень $m = 4$ кг на Луне ($g_Л = 1{,}6$ Н/кг). $F_т$ в Н?', + hint:'$F_т = 4 \\cdot 1{,}6 = 6{,}4$ Н.', + ans:6.4, tol:0.1, step:'0.1' }, + { n:6, tag:'§25', title:'Динамометр', + q:'Динамометр показал $P = 7{,}5$ Н на Земле ($g = 10$ Н/кг). Масса тела в граммах?', + hint:'$m = P/g = 0{,}75$ кг $= 750$ г.', + ans:750, tol:5, step:'1' }, + { n:7, tag:'§26', title:'Равнодействующая 2 сил', + q:'$F_1 = 30$ Н →, $F_2 = 18$ Н ←. Модуль R в Н?', + hint:'$R = |30 - 18| = 12$ Н вправо.', + ans:12, tol:0.5, step:'1' }, + { n:8, tag:'§26', title:'Равнодействующая 3 сил', + q:'$F_1 = 25$ Н →, $F_2 = 15$ Н →, $F_3 = 30$ Н ←. Модуль R в Н?', + hint:'Вправо: $25 + 15 = 40$. Влево: $30$. $R = |40 - 30| = 10$ Н вправо.', + ans:10, tol:0.5, step:'1' }, + { n:9, tag:'§27', title:'Сила трения', + q:'Брусок $m = 3$ кг скользит по столу с $\\mu = 0{,}2$ ($g = 10$ Н/кг). $F_{тр}$ в Н?', + hint:'$N = mg = 30$ Н. $F_{тр} = \\mu N = 0{,}2 \\cdot 30 = 6$ Н.', + ans:6, tol:0.2, step:'0.1' }, + { n:10, tag:'синтез', title:'Мастер движения', + q:'Брусок $m = 2$ кг с силой тяги $F = 8$ Н вправо. Коэф. трения $\\mu = 0{,}3$, $g = 10$ Н/кг. Найди равнодействующую R в Н (со знаком: + если вправо, − если влево, 0 если покой).', + hint:'$F_{тр\\,max} = \\mu mg = 0{,}3 \\cdot 2 \\cdot 10 = 6$ Н. $F = 8$ Н > $F_{тр\\,max} = 6$ Н — едет. $R = 8 - 6 = 2$ Н (вправо).', + ans:2, tol:0.2, step:'0.1' } + ]; + + const STATE_KEY = 'physics7_ch3_final_bosses'; + let solved = {}; + try{ solved = JSON.parse(localStorage.getItem(STATE_KEY) || '{}') || {}; }catch(e){} + + bosses.forEach(b => { + const isSolved = !!solved[b.n]; + h += '
' + + '
' + + '' + b.tag + '' + + 'Босс ' + b.n + '. ' + b.title + '' + + '
' + + '
' + b.q + '
' + + '
' + + '' + + '' + + '' + + '
' + + '' + + '
' + (isSolved ? '✓ Босс повержен! +20 XP.' : '') + '
' + + '
'; + }); + + h += ''; + + body.innerHTML = h; + renderMath(body); + + function updateBar(){ + const cnt = bosses.filter(b => solved[b.n]).length; + document.getElementById('ch3-fin-fill').style.width = (cnt * 100 / bosses.length) + '%'; + document.getElementById('ch3-fin-lab').textContent = 'Побеждено: ' + cnt + ' / ' + bosses.length; + if(cnt === bosses.length){ + document.getElementById('ch3-mastered').style.display = 'flex'; + const ACH_KEY = 'physics7_ch3_master'; + if(localStorage.getItem(ACH_KEY) !== '1'){ + localStorage.setItem(ACH_KEY, '1'); + if(window.addXp) window.addXp(50, 'ach-ch3-master'); + if(window.achievement) window.achievement('ch_done', 'Мастер движения'); + } + } + } + updateBar(); + + body.querySelectorAll('.boss-hint').forEach(btn => btn.addEventListener('click', () => { + const n = btn.dataset.n; + const txt = body.querySelector('.boss-hint-txt[data-n="' + n + '"]'); + if(txt) txt.style.display = txt.style.display === 'none' ? 'block' : 'none'; + })); + body.querySelectorAll('.boss-go').forEach(btn => btn.addEventListener('click', () => { + const n = +btn.dataset.n; + const b = bosses.find(x => x.n === n); + const inp = body.querySelector('.boss-inp[data-n="' + n + '"]'); + const fb = body.querySelector('.boss-fb[data-n="' + n + '"]'); + const card = body.querySelector('[data-boss="' + n + '"]'); + const v = parseFloat((inp.value || '').replace(',', '.')); + if(isNaN(v)){ + fb.style.display = 'block'; + fb.style.background = '#fee2e2'; fb.style.color = '#7f1d1d'; fb.style.borderLeft = '4px solid #dc2626'; + fb.textContent = 'Введи число.'; + return; + } + if(Math.abs(v - b.ans) < b.tol){ + fb.style.display = 'block'; + fb.style.background = '#d1fae5'; fb.style.color = '#065f46'; fb.style.borderLeft = '4px solid #10b981'; + fb.innerHTML = '✓ Босс повержен! +20 XP.'; + card.style.border = '2px solid #10b981'; + card.style.boxShadow = '0 0 0 3px rgba(16,185,129,.16)'; + btn.disabled = true; inp.disabled = true; + if(!solved[n]){ + solved[n] = true; + try{ localStorage.setItem(STATE_KEY, JSON.stringify(solved)); }catch(e){} + if(window.addXp) window.addXp(20, 'boss-ch3-' + n); + updateBar(); + } + } else { + fb.style.display = 'block'; + fb.style.background = '#fee2e2'; fb.style.color = '#7f1d1d'; fb.style.borderLeft = '4px solid #dc2626'; + fb.textContent = 'Не то. Перепроверь решение.'; + } + })); + body.querySelectorAll('.boss-inp').forEach(inp => inp.addEventListener('keydown', e => { + if(e.key === 'Enter'){ e.preventDefault(); body.querySelector('.boss-go[data-n="' + inp.dataset.n + '"]').click(); } + })); +} + window.PHYS7_CH3_WIDGETS = { - p14: add_p14, - p15: add_p15, - p16: add_p16, - p17: add_p17, - p18: add_p18, - p19: add_p19, - p20: add_p20 - // p21..p27 + final3 — в Phase 4 (силы) + p14: add_p14, p15: add_p15, p16: add_p16, p17: add_p17, + p18: add_p18, p19: add_p19, p20: add_p20, + p21: add_p21, p22: add_p22, p23: add_p23, + p24: add_p24, p25: add_p25, + p26: add_p26, p27: add_p27, + final3: add_final3 }; })();