// Физика 7 · Глава 1 · виджеты §§1–7 (Wave 1: §1, §2). // Экспорт: window.PHYS7_CH1_WIDGETS = { p1: fn, p2: fn, ... }. // Каждая функция вставляет в pN-body: 3 теоретические карточки + 4 виджета + кнопку «Прочитал». (function(){ 'use strict'; /* === Общие хелперы (вдохновлено phys9_ch1_widgets.js, но независимо) === */ function renderMath(root){ if(window.renderMathInElement){ try{ window.renderMathInElement(root, { delimiters: [{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}], throwOnError: false }); }catch(e){} } } function makeCard(kind, title, badge, body){ // kind: 'theory' | 'rule' | 'example' const colorByKind = { theory:'#0284c7', rule:'#dc2626', example:'#10b981' }; const labelByKind = { theory:'Теория', rule:'Правило', example:'Пример' }; const c = colorByKind[kind] || '#0284c7'; return '
' + '
' + '' + labelByKind[kind] + '' + '' + (badge||'') + '' + '' + title + '' + '
' + '
' + body + '
' + '
'; } function wgWrap(id, badge, title, hint, body){ return '
' + '
' + '' + badge + '' + '' + title + '' + '
' + (hint ? '
' + hint + '
' : '') + body + '
'; } function readButton(pid){ return '
'; } function wireReadBtn(pid){ const btn = document.querySelector('.phys7-read-btn[data-pid="' + pid + '"]'); if(!btn) return; const KEY = 'physics7_ch1_read_' + pid; if(localStorage.getItem(KEY) === '1'){ btn.innerHTML = ' Прочитано'; btn.disabled = true; btn.style.background = '#94a3b8'; btn.style.cursor = 'default'; return; } btn.addEventListener('click', function(){ if(localStorage.getItem(KEY) === '1') return; localStorage.setItem(KEY, '1'); if(typeof window.bumpProgress === 'function') window.bumpProgress(pid, 30); if(typeof window.addXp === 'function') window.addXp(10, 'read-' + pid); btn.innerHTML = ' Прочитано'; btn.disabled = true; btn.style.background = '#94a3b8'; btn.style.cursor = 'default'; }); } /* DnD на 4 корзины — общий движок */ function wireDnd(host, items, cats){ const root = document.getElementById(host); if(!root) return; const checkBtn = root.querySelector('.dnd-check'); const fb = root.querySelector('.dnd-fb'); let placed = {}; // itemId -> catKey let armed = null; // Pool clicks root.querySelectorAll('.dnd-chip').forEach(chip => { chip.addEventListener('click', () => { if(armed === chip){ armed.classList.remove('armed'); armed = null; return; } if(armed) armed.classList.remove('armed'); armed = chip; chip.classList.add('armed'); }); }); // Drop boxes root.querySelectorAll('.drop-box').forEach(box => { box.addEventListener('click', () => { if(!armed) return; const cat = box.dataset.cat; const id = armed.dataset.id; placed[id] = cat; const inner = box.querySelector('.drop-items'); const clone = armed.cloneNode(true); clone.classList.remove('armed'); clone.classList.add('placed'); clone.addEventListener('click', e => { e.stopPropagation(); delete placed[id]; clone.remove(); // Возвращаем в пул armed = null; const orig = root.querySelector('.dnd-chip[data-id="' + id + '"]:not(.placed)'); if(orig) orig.style.display = ''; }); inner.appendChild(clone); armed.style.display = 'none'; armed.classList.remove('armed'); armed = null; }); }); // Check if(checkBtn) checkBtn.addEventListener('click', () => { const total = items.length; let correct = 0; items.forEach(it => { if(placed[it.id] === it.cat) correct++; }); const pct = Math.round(correct * 100 / total); fb.style.display = 'block'; if(correct === total){ fb.style.background = '#d1fae5'; fb.style.color = '#065f46'; fb.style.borderLeft = '4px solid #10b981'; fb.innerHTML = '✓ Идеально! Все ' + total + ' карточек на своих местах.'; if(typeof window.bumpProgress === 'function') window.bumpProgress(host.split('-')[0].replace('p','p') === host ? host : null, 0); if(typeof window.addXp === 'function') window.addXp(15, 'dnd-' + host); } else { fb.style.background = '#fee2e2'; fb.style.color = '#7f1d1d'; fb.style.borderLeft = '4px solid #dc2626'; fb.innerHTML = '✗ Правильно: ' + correct + '/' + total + ' (' + pct + '%). Попробуй ещё раз.'; } }); } function dndPool(host, items, cats){ const chips = items.map(it => '').join(''); const boxes = cats.map(c => '
' + c.label + '
').join(''); return '
' + '
Нажми на карточку, потом на нужный ящик. Чтобы вернуть карточку — кликни по ней в ящике.
' + '
' + chips + '
' + '
' + boxes + '
' + '
' + '' + '
'; } /* Quiz одиночного выбора — карточка вопроса */ function quizQuestion(host, idx, q, opts, correctIdx, explain){ const optsHtml = opts.map((o,i) => '').join(''); return '
' + '
' + (idx+1) + '. ' + q + '
' + '
' + optsHtml + '
' + '' + '
'; } function wireQuiz(host, onAllCorrect){ const root = document.getElementById(host); if(!root) return; const all = root.querySelectorAll('.qz-q'); const done = new Set(); all.forEach(qDiv => { const opts = qDiv.querySelectorAll('.qz-opt'); const correct = +qDiv.querySelector('.qz-opts').dataset.correct; const explain = qDiv.querySelector('.qz-opts').dataset.explain; const fb = qDiv.querySelector('.qz-fb'); opts.forEach(o => o.addEventListener('click', () => { if(done.has(qDiv)) return; const i = +o.dataset.i; opts.forEach(x => x.disabled = true); if(i === correct){ o.style.background = '#d1fae5'; o.style.borderColor = '#10b981'; o.style.color = '#065f46'; fb.style.display = 'block'; fb.style.background = '#d1fae5'; fb.style.color = '#065f46'; fb.style.borderLeft = '4px solid #10b981'; fb.innerHTML = '✓ Верно!' + (explain ? ' ' + explain : ''); done.add(qDiv); if(done.size === all.length && typeof onAllCorrect === 'function') onAllCorrect(); } else { o.style.background = '#fee2e2'; o.style.borderColor = '#dc2626'; o.style.color = '#7f1d1d'; opts[correct].style.background = '#d1fae5'; opts[correct].style.borderColor = '#10b981'; opts[correct].style.color = '#065f46'; fb.style.display = 'block'; fb.style.background = '#fee2e2'; fb.style.color = '#7f1d1d'; fb.style.borderLeft = '4px solid #dc2626'; fb.innerHTML = '✗ Неверно. Правильно: «' + opts[correct].textContent + '».' + (explain ? ' ' + explain : ''); done.add(qDiv); } // Renable click-через-кнопки запрещён, но повторное прохождение через reset: })); }); } /* ========================================================== */ /* §1 — Физика — наука о природе. Связь с другими науками */ /* ========================================================== */ function add_p1(){ const body = document.getElementById('p1-body'); if(!body) return; let h = ''; /* 3 теоретические карточки */ h += makeCard('theory', 'Что изучает физика', '§ 1.1', 'Физика — это наука о природе. Она изучает физические явления: ' + 'падение тел, движение машин, нагрев и охлаждение, свет, звук, электрический ток, магниты. ' + 'Слово «физика» произошло от греческого фюзис — «природа».'); h += makeCard('rule', 'Связь с другими науками', '§ 1.2', ''); h += makeCard('example', 'Примеры физических явлений', '§ 1.3', '
' + '
Радуга
световое явление
' + '
Гром
звуковое явление
' + '
Северное сияние
электрическое
' + '
Падение яблока
механическое
' + '
Кипение чайника
тепловое
' + '
Тающий лёд
фазовое
' + '
'); /* IV-1: галерея явлений (визуализатор) */ h += wgWrap('p1-iv1', 'СИМ', 'Явления вокруг нас', 'Наведи курсор на иконку, чтобы увидеть, какую сторону природы изучает физика.', '
' + ['Свет','Звук','Тепло','Движение','Электричество','Магнетизм','Жидкости','Газы'].map((nm,i) => '
' + '
' + ['☀','♪','♨','→','⚡','⌘','≈','○'][i] + '
' + '
' + nm + '
' + '
').join('') + '
'); /* IV-2: квикфайр-понимание */ h += wgWrap('p1-iv2', 'КВИЗ', 'Понятия физики', 'Отметь верное утверждение.', '
' + quizQuestion('p1-q', 0, 'Что НЕ изучает физика?', ['Падение тел','Образование облаков','Историю Древнего Рима','Электрический ток'], 2, 'История — это гуманитарная наука; физика изучает явления природы.') + quizQuestion('p1-q', 1, 'От какого греческого слова произошло название «физика»?', ['Фюзис (природа)','Космос (мир)','Логос (учение)','Софос (мудрость)'], 0, 'Греческое фюзис = «природа», поэтому физика — наука о природе.') + quizQuestion('p1-q', 2, 'Какая наука изучает планеты и звёзды и опирается на физику?', ['Биология','Астрономия','География','Химия'], 1, 'Астрономия — наука о небесных телах.') + '
'); /* IV-3: DnD соответствие наука↔область */ h += wgWrap('p1-iv3', 'DnD', 'Связь наук', 'Соедини науку с её областью изучения.', dndPool('p1-dnd', [ { id:'i1', cat:'astro', html:'Звёзды и планеты' }, { id:'i2', cat:'chem', html:'Кислоты и щёлочи' }, { id:'i3', cat:'bio', html:'Клетка и ДНК' }, { id:'i4', cat:'phys', html:'Падение мяча' }, { id:'i5', cat:'astro', html:'Затмение Солнца' }, { id:'i6', cat:'chem', html:'Реакция железа с кислородом' }, { id:'i7', cat:'bio', html:'Работа сердца' }, { id:'i8', cat:'phys', html:'Электрический ток' } ], [ { cat:'astro', label:'Астрономия' }, { cat:'chem', label:'Химия' }, { cat:'bio', label:'Биология' }, { cat:'phys', label:'Физика' } ])); /* IV-4: тренажёр (5 вопросов) */ h += wgWrap('p1-iv4', 'ТРН', 'Тренажёр §1', 'Ответь на 5 вопросов подряд — получишь +10 XP.', '
' + quizQuestion('p1-tr', 0, 'Что изучает физика?', ['Только живую природу','Природные явления (свет, звук, тепло, движение, …)','Только звёзды','Только химические реакции'], 1) + quizQuestion('p1-tr', 1, 'Какое из явлений — НЕ физическое?', ['Кипение воды','Дыхание человека','Падение мяча','Работа лампочки'], 1, 'Дыхание — биологический процесс.') + quizQuestion('p1-tr', 2, 'Электромобиль — пример…', ['Биологического объекта','Технического устройства, основанного на физике','Химического вещества','Астрономического тела'], 1) + quizQuestion('p1-tr', 3, 'Какая пара тесно связана?', ['Физика — литература','Физика — техника','Физика — история','Физика — музыка'], 1, 'Без физики нет техники.') + quizQuestion('p1-tr', 4, 'Слово «физика» означает…', ['Мудрость','Природу','Знание','Закон'], 1) + '
'); h += readButton('p1'); body.innerHTML = h; // Wire interactivity wireDnd('p1-dnd', [ { id:'i1', cat:'astro' },{ id:'i2', cat:'chem' },{ id:'i3', cat:'bio' },{ id:'i4', cat:'phys' }, { id:'i5', cat:'astro' },{ id:'i6', cat:'chem' },{ id:'i7', cat:'bio' },{ id:'i8', cat:'phys' } ], []); wireQuiz('p1-q-host', () => { if(window.addXp) window.addXp(10, 'quiz-p1'); }); wireQuiz('p1-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p1'); }); wireReadBtn('p1'); renderMath(body); } /* ========================================================== */ /* §2 — Физическое тело, физическое явление, физическая величина */ /* ========================================================== */ function add_p2(){ const body = document.getElementById('p2-body'); if(!body) return; let h = ''; /* 3 теоретические карточки */ h += makeCard('theory', 'Четыре главных понятия', '§ 2.1', '' + '' + '' + '' + '' + '' + '
ПонятиеЧто этоПример
Телоконкретный объектмяч, книга, дом
Веществоиз чего сделано телодерево, железо, вода
Явлениеизменение в природепадение, кипение, гроза
Величинато, что можно измеритьмасса, скорость, температура
'); h += makeCard('rule', 'Как отличать?', '§ 2.2', 'Тело — отвечает на вопрос «что это?» — конкретный предмет.
' + 'Вещество — отвечает «из чего?» — материал.
' + 'Явление — отвечает «что происходит?» — изменение, процесс.
' + 'Величина — отвечает «сколько? в каких единицах?» — у неё всегда есть число и единица: $m = 5$ кг, $v = 10$ м/с, $t = 20$ °C.'); h += makeCard('example', 'Один и тот же объект — разные роли', '§ 2.3', 'Рассмотрим стакан с водой:
' + ''); /* IV-1: главный DnD — 12 карточек по 4 корзинам */ h += wgWrap('p2-iv1', 'СИМ', 'Сортировщик: тело / вещество / явление / величина', 'Перетащи 12 карточек в правильные корзины. Это главный визуал §2 — потренируй интуицию.', dndPool('p2-dnd', [ { id:'a1', cat:'body', html:'Стол' }, { id:'a2', cat:'body', html:'Автомобиль' }, { id:'a3', cat:'body', html:'Капля росы' }, { id:'b1', cat:'subst', html:'Алюминий' }, { id:'b2', cat:'subst', html:'Кислород' }, { id:'b3', cat:'subst', html:'Сахар' }, { id:'c1', cat:'phen', html:'Молния' }, { id:'c2', cat:'phen', html:'Замерзание воды' }, { id:'c3', cat:'phen', html:'Движение поезда' }, { id:'d1', cat:'val', html:'$m = 5$ кг' }, { id:'d2', cat:'val', html:'$t = -10$ °C' }, { id:'d3', cat:'val', html:'$v = 30$ км/ч' } ], [ { cat:'body', label:'Тело' }, { cat:'subst', label:'Вещество' }, { cat:'phen', label:'Явление' }, { cat:'val', label:'Величина' } ])); /* IV-2: «найди величину» — выбрать из списка */ h += wgWrap('p2-iv2', 'КВИЗ', 'Найди величину', 'У величины всегда есть число и единица измерения.', '
' + quizQuestion('p2-q', 0, 'Что из списка — физическая величина?', ['Скорость','Скоростной поезд','Стрелка часов','Кипение'], 0, 'Скорость измеряется (м/с, км/ч) — это величина.') + quizQuestion('p2-q', 1, 'А что из этого — явление?', ['Лужа','Испарение воды','Лёд','Холодильник'], 1, 'Испарение — процесс, изменение состояния.') + quizQuestion('p2-q', 2, 'Какое слово обозначает вещество?', ['Гвоздь','Сталь','Молоток','Удар'], 1, 'Сталь — материал, из которого сделан гвоздь.') + '
'); /* IV-3: квикфайр да/нет по 8 утверждениям */ h += wgWrap('p2-iv3', 'ТЕСТ', 'Тело vs величина (быстрые ответы)', 'Прочитай и отметь верное.', '
' + quizQuestion('p2-tn', 0, '«Карандаш» — это…', ['Тело','Вещество','Явление','Величина'], 0) + quizQuestion('p2-tn', 1, '«Дерево» (из чего сделана линейка) — это…', ['Тело','Вещество','Явление','Величина'], 1) + quizQuestion('p2-tn', 2, '«Длина» — это…', ['Тело','Вещество','Явление','Величина'], 3) + quizQuestion('p2-tn', 3, '«Замерзание» — это…', ['Тело','Вещество','Явление','Величина'], 2) + quizQuestion('p2-tn', 4, '$10$ кг — это…', ['Тело','Вещество','Явление','Значение величины'], 3, 'Число + единица = величина.') + '
'); /* IV-4: тренажёр — 4 практических вопроса */ h += wgWrap('p2-iv4', 'ТРН', 'Тренажёр §2', 'Закрепи материал — 4 вопроса.', '
' + quizQuestion('p2-tr', 0, 'Что НЕ является телом?', ['Воздушный шар','Капля воды','Скорость','Кирпич'], 2, 'Скорость — величина, а не тело.') + quizQuestion('p2-tr', 1, 'Стакан с молоком: молоко в стакане — это…', ['Тело','Вещество','Явление','Величина'], 0, 'Молоко в этой ситуации — отдельное тело со своей формой (формой стакана).') + quizQuestion('p2-tr', 2, 'Парусник, плывущий в океане. Назови явление.', ['Парусник','Дерево (мачта)','Движение','Длина паруса'], 2) + quizQuestion('p2-tr', 3, 'Что нужно для записи величины?', ['Только число','Только единица','Число + единица','Только название'], 2, 'Например: $v = 20$ м/с — число 20 и единица м/с.') + '
'); h += readButton('p2'); body.innerHTML = h; wireDnd('p2-dnd', [ { id:'a1', cat:'body' },{ id:'a2', cat:'body' },{ id:'a3', cat:'body' }, { id:'b1', cat:'subst' },{ id:'b2', cat:'subst' },{ id:'b3', cat:'subst' }, { id:'c1', cat:'phen' },{ id:'c2', cat:'phen' },{ id:'c3', cat:'phen' }, { id:'d1', cat:'val' },{ id:'d2', cat:'val' },{ id:'d3', cat:'val' } ], []); wireQuiz('p2-q-host', () => { if(window.addXp) window.addXp(10, 'quiz-p2'); }); wireQuiz('p2-tn-host', () => { if(window.addXp) window.addXp(10, 'tn-p2'); }); wireQuiz('p2-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p2'); }); wireReadBtn('p2'); renderMath(body); } /* ========================================================== */ /* §3 — Методы исследования в физике */ /* ========================================================== */ function add_p3(){ const body = document.getElementById('p3-body'); if(!body) return; let h = ''; h += makeCard('theory', 'Как физики изучают природу', '§ 3.1', 'Физика использует три метода познания:' + '
    ' + '
  1. Наблюдение — изучение явления без вмешательства. Учёный смотрит, фиксирует, не изменяя условий.
  2. ' + '
  3. Экспериментцеленаправленное воссоздание явления в нужных условиях с измерениями.
  4. ' + '
  5. Теоретическое описание — построение модели, формул, законов; гипотеза сначала, потом — проверка.
  6. ' + '
'); h += makeCard('rule', 'Чем отличаются?', '§ 3.2', 'Наблюдение: смотрим за грозой — не запускаем её сами.
' + 'Эксперимент: бросаем шары разной массы в трубке без воздуха и измеряем время падения.
' + 'Гипотеза: «может быть, тела падают одинаково в вакууме?» — её надо проверить экспериментом.
' + 'Теория: подтверждённая гипотеза становится частью знаний — например, закон всемирного тяготения.'); h += makeCard('example', 'Опыт Галилея с Пизанской башней', '§ 3.3', 'По легенде, в конце XVI века Галилео Галилей поднялся на наклонную Пизанскую башню ' + 'и одновременно бросил с её вершины два шара разной массы — тяжёлый и лёгкий. ' + 'Шары упали на землю почти одновременно. Это был эксперимент, ' + 'опровергнувший представление Аристотеля о том, что тяжёлые тела падают быстрее. ' + 'Так появилась гипотеза «все тела падают с одним ускорением», позже подтверждённая в опытах с вакуумной трубкой.'); /* IV-1: timeline исторических опытов */ h += wgWrap('p3-iv1', 'СИМ', 'Великие опыты и наблюдения', 'Кликай по этапам — узнавай, чем прославился каждый учёный.', '
' + ['Архимед / III в. до н. э. — закон рычага. Наблюдение и расчёт.', 'Галилей / 1590-е — падение тел с башни. Эксперимент.', 'Торричелли / 1643 — открыл атмосферное давление. Эксперимент с ртутью.', 'Паскаль / 1648 — закон передачи давления. Эксперимент и теория.', 'Ньютон / 1687 — закон всемирного тяготения. Теория, объединившая всё.'].map((txt, i) => { const [name, rest] = txt.split(' — '); return '
' + (i+1) + '. ' + name + '
' + rest + '
'; }).join('') + '
'); /* IV-2: КВИЗ опыт vs наблюдение */ h += wgWrap('p3-iv2', 'КВИЗ', 'Опыт или наблюдение?', 'Выбери, какой метод использован.', '
' + quizQuestion('p3-q', 0, 'Метеоролог смотрит на облака и записывает их форму.', ['Наблюдение','Эксперимент','Гипотеза','Теория'], 0) + quizQuestion('p3-q', 1, 'Ученик помещает шарик в воду и измеряет, насколько поднялся уровень.', ['Наблюдение','Эксперимент','Гипотеза','Теория'], 1) + quizQuestion('p3-q', 2, 'Учёный предполагает: «возможно, металл проводит тепло из-за свободных электронов».', ['Наблюдение','Эксперимент','Гипотеза','Теория'], 2) + quizQuestion('p3-q', 3, 'Архимед открыл закон рычага и записал его в виде формулы $F_1 l_1 = F_2 l_2$.', ['Наблюдение','Эксперимент','Гипотеза','Теория'], 3, 'Подтверждённое соотношение — это теория (закон).') + '
'); /* IV-3: DnD «классифицируй» */ h += wgWrap('p3-iv3', 'DnD', 'Классификация ситуаций', 'Распредели 8 ситуаций по трём корзинам.', dndPool('p3-dnd', [ { id:'a1', cat:'obs', html:'Смотрим, как тает снег весной' }, { id:'a2', cat:'obs', html:'Записываем температуру за неделю' }, { id:'a3', cat:'exp', html:'Нагреваем металл лампой и измеряем удлинение' }, { id:'a4', cat:'exp', html:'Сравниваем падение перышка в трубке с воздухом и без' }, { id:'a5', cat:'hyp', html:'Возможно, скорость света — максимальная во Вселенной' }, { id:'a6', cat:'hyp', html:'Может быть, существуют тёмная материя и тёмная энергия' }, { id:'a7', cat:'exp', html:'Бросаем мяч с разной высоты и засекаем время полёта' }, { id:'a8', cat:'obs', html:'Изучаем затмение Луны' } ], [ { cat:'obs', label:'Наблюдение' }, { cat:'exp', label:'Эксперимент' }, { cat:'hyp', label:'Гипотеза' } ])); /* IV-4: тренажёр */ h += wgWrap('p3-iv4', 'ТРН', 'Тренажёр §3', 'Закрепи материал.', '
' + quizQuestion('p3-tr', 0, 'Что НЕ относится к методам познания в физике?', ['Наблюдение','Эксперимент','Угадывание','Теория'], 2, 'Угадывание — это не научный метод.') + quizQuestion('p3-tr', 1, 'Главное отличие эксперимента от наблюдения — это…', ['Использование приборов','Активное вмешательство и контроль условий','Запись результатов','Участие учёного'], 1) + quizQuestion('p3-tr', 2, 'Гипотеза становится теорией, когда…', ['Её опубликовали','Она проверена опытом','Её одобрил профессор','Её записали в учебник'], 1) + quizQuestion('p3-tr', 3, 'Какой учёный знаменит опытами с падающими телами?', ['Архимед','Галилей','Ньютон','Эйнштейн'], 1) + quizQuestion('p3-tr', 4, 'Что такое физическая модель?', ['Реальный прибор','Упрощённое представление явления для расчётов','Любая теория','Только формула'], 1, 'Модель опускает несущественные детали ради простоты.') + '
'); h += readButton('p3'); body.innerHTML = h; wireDnd('p3-dnd', [ { id:'a1', cat:'obs' },{ id:'a2', cat:'obs' },{ id:'a3', cat:'exp' },{ id:'a4', cat:'exp' }, { id:'a5', cat:'hyp' },{ id:'a6', cat:'hyp' },{ id:'a7', cat:'exp' },{ id:'a8', cat:'obs' } ], []); wireQuiz('p3-q-host', () => { if(window.addXp) window.addXp(10, 'quiz-p3'); }); wireQuiz('p3-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p3'); }); wireReadBtn('p3'); renderMath(body); } /* ========================================================== */ /* §4 — Прямые и косвенные измерения */ /* ========================================================== */ function add_p4(){ const body = document.getElementById('p4-body'); if(!body) return; let h = ''; h += makeCard('theory', 'Два типа измерений', '§ 4.1', 'Прямое измерение — значение читается прямо со шкалы прибора. ' + 'Длину книги — линейкой, массу — весами, время — секундомером, температуру — термометром.

' + 'Косвенное измерение — значение вычисляется по формуле из других величин, ' + 'измеренных прямо. Например, чтобы найти площадь стола, измеряют длину и ширину линейкой ' + '(прямые), а площадь $S = a b$ — это уже косвенное измерение.'); h += makeCard('rule', 'Основные формулы косвенных измерений', '§ 4.2', ''); h += makeCard('example', 'Объём картофеля', '§ 4.3', 'Картофелина имеет неправильную форму — линейкой её не измерить. Но можно сделать так:' + '
    ' + '
  1. Налить в мензурку воды до отметки $V_1 = 200$ мл (прямое измерение).
  2. ' + '
  3. Опустить картофелину; уровень поднялся до $V_2 = 280$ мл (прямое).
  4. ' + '
  5. Объём картофелины: $V = V_2 - V_1 = 80$ мл $= 80$ см³ (косвенное).
  6. ' + '
'); /* IV-1: лаборатория приборов */ h += wgWrap('p4-iv1', 'СИМ', 'Лаборатория измерительных приборов', 'Каждый прибор даёт прямое измерение одной величины.', '
' + [ ['Линейка','длина','м, см, мм','#0284c7'], ['Весы','масса','кг, г','#7c3aed'], ['Термометр','температура','°C','#dc2626'], ['Секундомер','время','с, мин','#10b981'], ['Мензурка','объём жидкости','мл, л','#0891b2'], ['Динамометр','сила','Н','#d97706'] ].map(([nm, v, u, col]) => '
' + '
' + nm + '
' + '
' + v + '
' + '
' + u + '
' + '
').join('') + '
'); /* IV-2: главный калькулятор косвенных измерений */ h += wgWrap('p4-iv2', 'КАЛЬК', 'Калькулятор косвенных измерений', 'Меняй размеры $a, b, c$ и массу $m$ — формулы пересчитываются автоматически.', '
' + '' + '' + '' + '' + '
' + '
' + '
Площадь: $S = a b = $ 50 см²
' + '
Объём: $V = a b c = $ 150 см³
' + '
Плотность: $\\rho = m/V = $ 2.7 г/см³ (близко к алюминию)
' + '
'); /* IV-3: DnD прямое/косвенное */ h += wgWrap('p4-iv3', 'DnD', 'Прямое или косвенное?', 'Распредели измерения по типу.', dndPool('p4-dnd', [ { id:'a1', cat:'dir', html:'Длина книги линейкой' }, { id:'a2', cat:'ind', html:'Площадь стола из длины × ширины' }, { id:'a3', cat:'dir', html:'Температура воздуха термометром' }, { id:'a4', cat:'ind', html:'Скорость велосипедиста (путь / время)' }, { id:'a5', cat:'dir', html:'Время урока секундомером' }, { id:'a6', cat:'ind', html:'Объём картофеля через вытеснение воды' }, { id:'a7', cat:'dir', html:'Масса яблока на весах' }, { id:'a8', cat:'ind', html:'Плотность металла $\\rho = m/V$' } ], [ { cat:'dir', label:'Прямое' }, { cat:'ind', label:'Косвенное' } ])); /* IV-4: тренажёр расчётных */ h += wgWrap('p4-iv4', 'ТРН', 'Тренажёр §4', '5 расчётных задач.', '
' + quizQuestion('p4-tr', 0, 'Прямоугольник: $a = 6$ см, $b = 4$ см. Площадь $S = ?$', ['10 см²','24 см²','12 см²','20 см²'], 1, '$S = 6 \\cdot 4 = 24$ см².') + quizQuestion('p4-tr', 1, 'Кирпич: $a = 25$ см, $b = 12$ см, $c = 6{,}5$ см. Объём $V$?', ['1900 см³','1950 см³','2000 см³','2500 см³'], 1, '$V = 25 \\cdot 12 \\cdot 6{,}5 = 1950$ см³.') + quizQuestion('p4-tr', 2, 'Тело массой $m = 200$ г занимает объём $V = 25$ см³. Плотность?', ['4 г/см³','6 г/см³','8 г/см³','10 г/см³'], 2, '$\\rho = m/V = 200/25 = 8$ г/см³ (близко к железу).') + quizQuestion('p4-tr', 3, 'Путь $s = 60$ м, время $t = 12$ с. Скорость?', ['4 м/с','5 м/с','6 м/с','8 м/с'], 1, '$v = s/t = 60/12 = 5$ м/с.') + quizQuestion('p4-tr', 4, 'В мензурку с водой $V_1 = 50$ мл опустили камень — уровень поднялся до $V_2 = 78$ мл. Объём камня?', ['22 мл','28 мл','32 мл','78 мл'], 1, '$V = V_2 - V_1 = 78 - 50 = 28$ мл.') + '
'); h += readButton('p4'); body.innerHTML = h; // Wire calc §4 IV-2 const upd = () => { const a = +document.getElementById('p4-a-r').value; const b = +document.getElementById('p4-b-r').value; const c = +document.getElementById('p4-c-r').value; const m = +document.getElementById('p4-m-r').value; document.getElementById('p4-a').textContent = a; document.getElementById('p4-b').textContent = b; document.getElementById('p4-c').textContent = c; document.getElementById('p4-m').textContent = m; const S = a * b; const V = a * b * c; const rho = m / V; document.getElementById('p4-S').textContent = S; document.getElementById('p4-V').textContent = V; document.getElementById('p4-rho').textContent = rho.toFixed(2); // Угадывание вещества по плотности (г/см³) let name = ''; if(rho < 0.3) name = '(легче пенопласта — нереально!)'; else if(rho < 0.7) name = '(дерево / сосна)'; else if(rho < 1.1) name = '(вода или лёд)'; else if(rho < 3.5) name = '(алюминий / стекло)'; else if(rho < 9) name = '(железо / медь)'; else if(rho < 15) name = '(свинец / ртуть)'; else if(rho < 22) name = '(золото / платина)'; else name = '(плотнее любого металла)'; document.getElementById('p4-rho-name').textContent = name; }; ['p4-a-r','p4-b-r','p4-c-r','p4-m-r'].forEach(id => document.getElementById(id).addEventListener('input', upd)); upd(); wireDnd('p4-dnd', [ { id:'a1', cat:'dir' },{ id:'a2', cat:'ind' },{ id:'a3', cat:'dir' },{ id:'a4', cat:'ind' }, { id:'a5', cat:'dir' },{ id:'a6', cat:'ind' },{ id:'a7', cat:'dir' },{ id:'a8', cat:'ind' } ], []); wireQuiz('p4-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p4'); }); wireReadBtn('p4'); renderMath(body); } /* ========================================================== */ /* §5 — Единицы измерения физических величин. СИ */ /* ========================================================== */ function add_p5(){ const body = document.getElementById('p5-body'); if(!body) return; let h = ''; h += makeCard('theory', 'Зачем СИ?', '§ 5.1', 'Если каждый учёный использует свои единицы — результаты невозможно сравнить. ' + 'В 1960 году принята Международная система единиц (СИ) — единый стандарт. ' + 'В СИ — 7 основных единиц; все остальные получаются комбинацией основных.'); h += makeCard('rule', '7 основных единиц СИ', '§ 5.2', '' + '' + [['Длина','метр','м'],['Масса','килограмм','кг'],['Время','секунда','с'],['Сила тока','ампер','А'],['Температура','кельвин','К'],['Кол-во вещества','моль','моль'],['Сила света','кандела','кд']].map(([v,u,s]) => '').join('') + '
ВеличинаЕдиницаОбозначение
' + v + '' + u + '' + s + '
'); h += makeCard('example', 'Кратные и дольные приставки', '§ 5.3', '' + '' + [['Г (гига)','$10^9$','1 ГГц = $10^9$ Гц'],['М (мега)','$10^6$','1 МВт = $10^6$ Вт'],['к (кило)','$10^3$','1 кг = 1000 г'],['—','1','1 м'],['м (милли)','$10^{-3}$','1 мс = 0,001 с'],['мк (микро)','$10^{-6}$','1 мкм = $10^{-6}$ м'],['н (нано)','$10^{-9}$','1 нс = $10^{-9}$ с']].map(([pf,k,ex]) => '').join('') + '
ПриставкаМножительПример
' + pf + '' + k + '' + ex + '
'); /* IV-1: визуал — 7 основных */ h += wgWrap('p5-iv1', 'СИМ', '7 китов СИ', 'Семь основных единиц — фундамент всех физических измерений.', '
' + [['Длина','м','#0284c7'],['Масса','кг','#7c3aed'],['Время','с','#10b981'],['Ток','А','#d97706'],['Темп.','К','#dc2626'],['Вещ-во','моль','#0891b2'],['Свет','кд','#fbbf24']].map(([v, u, col]) => '
' + '
' + u + '
' + '
' + v + '
' + '
').join('') + '
'); /* IV-2: главный конвертер */ h += wgWrap('p5-iv2', 'КАЛЬК', 'Конвертер единиц', 'Выбери приставку и величину — увидь перевод в основную единицу СИ.', '
' + '' + '' + '' + '
' + '
' + '5 км' + '   =   ' + '5000 м' + '
' + '
'); /* IV-3: DnD — величина ↔ единица СИ */ h += wgWrap('p5-iv3', 'DnD', 'Величина ↔ единица СИ', 'Соедини каждую величину с её основной единицей.', dndPool('p5-dnd', [ { id:'a1', cat:'m', html:'Длина' }, { id:'a2', cat:'kg', html:'Масса' }, { id:'a3', cat:'s', html:'Время' }, { id:'a4', cat:'K', html:'Температура' }, { id:'a5', cat:'A', html:'Сила тока' }, { id:'a6', cat:'m', html:'Расстояние от Минска до Бреста' }, { id:'a7', cat:'kg', html:'Масса арбуза' }, { id:'a8', cat:'s', html:'Длительность урока' } ], [ { cat:'m', label:'метр (м)' }, { cat:'kg', label:'килограмм (кг)' }, { cat:'s', label:'секунда (с)' }, { cat:'K', label:'кельвин (К)' }, { cat:'A', label:'ампер (А)' } ])); /* IV-4: тренажёр на перевод */ h += wgWrap('p5-iv4', 'ТРН', 'Тренажёр §5', '5 задач на перевод единиц.', '
' + quizQuestion('p5-tr', 0, '$5$ км $= ?$ м', ['50','500','5 000','50 000'], 2, '$5 \\cdot 1000 = 5\\,000$ м.') + quizQuestion('p5-tr', 1, '$0{,}25$ кг $= ?$ г', ['25','100','250','2500'], 2, '$0{,}25 \\cdot 1000 = 250$ г.') + quizQuestion('p5-tr', 2, '$2$ ч $= ?$ с', ['120','3 600','7 200','12 000'], 2, '$2 \\cdot 60 \\cdot 60 = 7\\,200$ с.') + quizQuestion('p5-tr', 3, '$300$ мс $= ?$ с', ['0,03','0,3','3','30'], 1, '$300 \\cdot 10^{-3} = 0{,}3$ с.') + quizQuestion('p5-tr', 4, '$1$ см² $= ?$ м²', ['0,1','0,01','0,001','0,0001'], 3, '$1\\,\\text{см}^2 = (10^{-2}\\,\\text{м})^2 = 10^{-4}\\,\\text{м}^2$.') + '
'); h += readButton('p5'); body.innerHTML = h; // Wire converter §5 IV-2 const updConv = () => { const n = +document.getElementById('p5-n-r').value; const pf = +document.getElementById('p5-pf').value; const u = document.getElementById('p5-u').value; document.getElementById('p5-n').textContent = n; const prefixLabels = { '1000000000':'Г','1000000':'М','1000':'к','1':'','0.01':'с','0.001':'м','1e-6':'мк','1e-9':'н' }; // Получим символ по value const sel = document.getElementById('p5-pf'); const pfLabel = (sel.options[sel.selectedIndex].text.match(/^([А-Яа-я—]+)/) || ['',''])[1]; const result = n * pf; // Format result let resStr; if(Math.abs(result) >= 1e6 || (Math.abs(result) > 0 && Math.abs(result) < 0.001)) resStr = result.toExponential(2); else if(Number.isInteger(result)) resStr = result.toLocaleString('ru-RU'); else resStr = (+result.toPrecision(6)).toLocaleString('ru-RU'); document.getElementById('p5-src').textContent = n + ' ' + pfLabel + u; document.getElementById('p5-dst').textContent = resStr + ' ' + u; const explain = pf === 1 ? 'Без приставки.' : ('Множитель ' + (pf >= 1 ? pf.toLocaleString('ru-RU') : pf) + '. Умножаем число на этот множитель.'); document.getElementById('p5-explain').textContent = explain; }; document.getElementById('p5-n-r').addEventListener('input', updConv); document.getElementById('p5-pf').addEventListener('change', updConv); document.getElementById('p5-u').addEventListener('change', updConv); updConv(); wireDnd('p5-dnd', [ { id:'a1', cat:'m' },{ id:'a2', cat:'kg' },{ id:'a3', cat:'s' },{ id:'a4', cat:'K' }, { id:'a5', cat:'A' },{ id:'a6', cat:'m' },{ id:'a7', cat:'kg' },{ id:'a8', cat:'s' } ], []); wireQuiz('p5-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p5'); }); wireReadBtn('p5'); renderMath(body); } /* ========================================================== */ /* §6 — Действия над физическими величинами */ /* ========================================================== */ function add_p6(){ const body = document.getElementById('p6-body'); if(!body) return; let h = ''; h += makeCard('theory', 'Правила сложения и сравнения', '§ 6.1', 'Складывать, вычитать и сравнивать можно только однородные величины (одного типа) ' + 'и только в одинаковых единицах. Нельзя сложить $2$ кг и $3$ м — это разные физические величины. ' + 'Нельзя сложить $5$ м и $2$ см без предварительного перевода в одну единицу: $5$ м $+ 0{,}02$ м $= 5{,}02$ м.'); h += makeCard('rule', 'Перевод между разными системами', '§ 6.2', 'Скорость: $1$ км/ч $= \\dfrac{1000\\,\\text{м}}{3600\\,\\text{с}} \\approx 0{,}278$ м/с;
' + 'обратно: $1$ м/с $= 3{,}6$ км/ч.

' + 'Плотность: $1$ г/см³ $= 1000$ кг/м³ (умножаем на $1000$).

' + 'Мощность: $1$ л. с. $= 736$ Вт; $1$ кВт $= 1000$ Вт.

' + 'Энергия / работа: $1$ кДж $= 1000$ Дж, $1$ кВт·ч $= 3{,}6 \\cdot 10^6$ Дж.'); h += makeCard('example', 'Умножение / деление величин', '§ 6.3', 'При действиях с величинами числа умножаются/делятся отдельно от единиц:' + ''); /* IV-1: визуал — таблица переводов скорости */ h += wgWrap('p6-iv1', 'СИМ', 'Скорости в природе', 'Сравни типичные скорости — одно и то же в разных единицах.', '' + '' + [['Улитка',0.001,0.0036],['Пешеход',1.4,5],['Велосипедист',5.5,20],['Автомобиль в городе',16.7,60],['Гепард',31,112],['Самолёт',250,900],['Звук в воздухе',340,1224]].map(([nm,ms,kh]) => '').join('') + '
Объектм/скм/ч
' + nm + '' + ms + '' + kh + '
'); /* IV-2: главный калькулятор-конвертер */ h += wgWrap('p6-iv2', 'КАЛЬК', 'Конвертер величин', 'Выбери, что переводишь — двигай slider.', '
' + '' + '' + '
' + '
'); /* IV-3: DnD равные величины */ h += wgWrap('p6-iv3', 'DnD', 'Найди равные пары', 'Соедини 8 эквивалентных записей.', dndPool('p6-dnd', [ { id:'a1', cat:'60', html:'$1$ мин' }, { id:'a2', cat:'1000', html:'$1$ кВт' }, { id:'a3', cat:'10', html:'$10$ см' }, { id:'a4', cat:'500', html:'$\\dfrac{1}{2}$ кг' }, { id:'a5', cat:'60', html:'$60$ с' }, { id:'a6', cat:'1000', html:'$1000$ Вт' }, { id:'a7', cat:'10', html:'$0{,}1$ м' }, { id:'a8', cat:'500', html:'$500$ г' } ], [ { cat:'60', label:'1 мин = 60 с' }, { cat:'1000', label:'1 кВт = 1000 Вт' }, { cat:'10', label:'10 см = 0,1 м' }, { cat:'500', label:'0,5 кг = 500 г' } ])); /* IV-4: тренажёр */ h += wgWrap('p6-iv4', 'ТРН', 'Тренажёр §6', '5 задач на действия с величинами.', '
' + quizQuestion('p6-tr', 0, '$72$ км/ч $= ?$ м/с', ['10','15','20','25'], 2, '$72 / 3{,}6 = 20$ м/с.') + quizQuestion('p6-tr', 1, '$5$ м/с $= ?$ км/ч', ['15','18','20','25'], 1, '$5 \\cdot 3{,}6 = 18$ км/ч.') + quizQuestion('p6-tr', 2, '$2{,}5$ г/см³ $= ?$ кг/м³', ['25','250','2500','25000'], 2, '$2{,}5 \\cdot 1000 = 2500$ кг/м³.') + quizQuestion('p6-tr', 3, '$3$ ч $20$ мин $= ?$ с', ['12 000','11 200','12 200','13 200'], 0, '$3 \\cdot 3600 + 20 \\cdot 60 = 10\\,800 + 1\\,200 = 12\\,000$ с.') + quizQuestion('p6-tr', 4, 'Сложить: $5$ м $+ 40$ см $+ 10$ мм $= ?$ м', ['5,41','5,5','5,401','5,41'], 0, '$5 + 0{,}40 + 0{,}010 = 5{,}41$ м.') + '
'); h += readButton('p6'); body.innerHTML = h; // Wire converter §6 IV-2 const updConv6 = () => { const kind = document.getElementById('p6-kind').value; const v = +document.getElementById('p6-v-r').value; document.getElementById('p6-v').textContent = v; const out = document.getElementById('p6-out'); let html = ''; if(kind === 'vel'){ html = '$' + v + '$ км/ч $= $ ' + (v / 3.6).toFixed(2) + ' м/с' + '
$' + v + '$ м/с $= $ ' + (v * 3.6).toFixed(1) + ' км/ч'; } else if(kind === 'den'){ html = '$' + v + '$ г/см³ $= $ ' + (v * 1000).toLocaleString('ru-RU') + ' кг/м³'; } else if(kind === 'pow'){ html = '$' + v + '$ кВт $= $ ' + (v * 1000).toLocaleString('ru-RU') + ' Вт' + '
$' + v + '$ л. с. $= $ ' + (v * 736).toLocaleString('ru-RU') + ' Вт'; } else if(kind === 'en'){ html = '$' + v + '$ кДж $= $ ' + (v * 1000).toLocaleString('ru-RU') + ' Дж' + '
$' + v + '$ кВт·ч $= $ ' + (v * 3.6e6).toExponential(2) + ' Дж'; } else if(kind === 't'){ html = '$' + v + '$ мин $= $ ' + (v * 60).toLocaleString('ru-RU') + ' с' + '
$' + v + '$ ч $= $ ' + (v * 3600).toLocaleString('ru-RU') + ' с'; } out.innerHTML = html; renderMath(out); }; document.getElementById('p6-kind').addEventListener('change', updConv6); document.getElementById('p6-v-r').addEventListener('input', updConv6); updConv6(); wireDnd('p6-dnd', [ { id:'a1', cat:'60' },{ id:'a2', cat:'1000' },{ id:'a3', cat:'10' },{ id:'a4', cat:'500' }, { id:'a5', cat:'60' },{ id:'a6', cat:'1000' },{ id:'a7', cat:'10' },{ id:'a8', cat:'500' } ], []); wireQuiz('p6-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p6'); }); wireReadBtn('p6'); renderMath(body); } /* ========================================================== */ /* §7 — Измерительные приборы. Цена деления. Погрешность */ /* ========================================================== */ function add_p7(){ const body = document.getElementById('p7-body'); if(!body) return; let h = ''; h += makeCard('theory', 'Цена деления шкалы', '§ 7.1', 'Цена деления — это значение наименьшего деления на шкале прибора. Формула:
' + '$$C = \\dfrac{X_2 - X_1}{N}$$ где $X_1$, $X_2$ — два соседних подписанных значения, $N$ — число малых делений между ними.

' + 'Пример: на линейке между отметками $0$ и $1$ см нанесено $10$ делений. ' + '$C = (1 - 0)/10 = 0{,}1$ см $= 1$ мм.'); h += makeCard('rule', 'Погрешность измерения', '§ 7.2', 'Любое измерение имеет погрешность $\\Delta X$. Обычно берут половину цены деления:
' + '$$\\Delta X = \\dfrac{C}{2}$$' + 'Результат записывают как $X = X_0 \\pm \\Delta X$, например: $l = (15{,}3 \\pm 0{,}05)$ см.

' + 'Чем меньше цена деления, тем точнее прибор.'); h += makeCard('example', 'Как снять отсчёт', '§ 7.3', 'Правила:' + '
    ' + '
  1. Определи цену деления по двум соседним подписанным отметкам.
  2. ' + '
  3. Смотри на шкалу перпендикулярно (избегая параллакса).
  4. ' + '
  5. Если стрелка между делениями — округли до ближайшего.
  6. ' + '
  7. Запиши с погрешностью $\\pm C/2$.
  8. ' + '
'); /* IV-1: главный визуал — виртуальная линейка с переключаемой ценой деления */ h += wgWrap('p7-iv1', 'СИМ', 'Виртуальная линейка', 'Меняй цену деления и положение риски — наблюдай, как меняется точность.', '
' + '' + '' + '
' + '
' + '' + '
' + '
'); /* IV-2: калькулятор цены деления */ h += wgWrap('p7-iv2', 'КАЛЬК', 'Калькулятор цены деления', 'Введи две подписанные отметки и количество делений.', '
' + '' + '' + '' + '
' + '
' + 'Цена деления: ' + '
Погрешность: ' + '
'); /* IV-3: DnD — соедини прибор с подходящей ценой деления */ h += wgWrap('p7-iv3', 'DnD', 'Прибор и его точность', 'Соотнеси приборы и их типичную цену деления.', dndPool('p7-dnd', [ { id:'a1', cat:'mm', html:'Школьная линейка' }, { id:'a2', cat:'01mm', html:'Штангенциркуль' }, { id:'a3', cat:'001mm', html:'Микрометр' }, { id:'a4', cat:'1c', html:'Бытовой термометр' }, { id:'a5', cat:'01c', html:'Лабораторный термометр' }, { id:'a6', cat:'01s', html:'Школьный секундомер' } ], [ { cat:'mm', label:'1 мм' }, { cat:'01mm', label:'0,1 мм' }, { cat:'001mm', label:'0,01 мм' }, { cat:'1c', label:'1 °C' }, { cat:'01c', label:'0,1 °C' }, { cat:'01s', label:'0,1 с' } ])); /* IV-4: тренажёр */ h += wgWrap('p7-iv4', 'ТРН', 'Тренажёр §7', '5 задач на цену деления и погрешность.', '
' + quizQuestion('p7-tr', 0, 'Между отметками $0$ и $1$ см на линейке $10$ маленьких делений. Цена деления?', ['0,1 мм','1 мм','5 мм','10 мм'], 1, '$C = (10-0)/10 = 1$ мм.') + quizQuestion('p7-tr', 1, 'Цена деления $C = 0{,}5$ см. Погрешность?', ['0,25 мм','0,25 см','0,5 см','5 мм'], 1, '$\\Delta X = C/2 = 0{,}25$ см.') + quizQuestion('p7-tr', 2, 'Какой прибор точнее: с $C = 1$ мм или с $C = 0{,}1$ мм?', ['Первый','Второй','Они одинаково точны','Зависит от величины'], 1, 'Чем меньше цена деления, тем точнее прибор.') + quizQuestion('p7-tr', 3, 'Длина $l = (12{,}3 \\pm 0{,}05)$ см. Какова цена деления линейки?', ['0,05 см','0,1 см','0,5 см','1 см'], 1, '$C = 2 \\Delta X = 2 \\cdot 0{,}05 = 0{,}1$ см.') + quizQuestion('p7-tr', 4, 'Стрелка термометра стоит между $20$ и $21$ °C, ближе к $20$. Цена деления $1$ °C. Запиши температуру.', ['20 °C','20,5 °C','21 °C','20,3 °C'], 0, 'Округляем до ближайшего деления — $20$ °C; запись с погрешностью: $(20 \\pm 0{,}5)$ °C.') + '
'); h += readButton('p7'); body.innerHTML = h; // §7 IV-1 wire: SVG ruler function drawRuler(){ const cd = +document.getElementById('p7-cd').value; const pos = +document.getElementById('p7-pos-r').value; const W = 360, leftPad = 14, scaleW = W - 2 * leftPad; const totalMm = 100; const pxPerMm = scaleW / totalMm; let s = ''; s += ''; for(let mm = 0; mm <= totalMm; mm += cd){ const x = leftPad + mm * pxPerMm; const isCm = mm % 10 === 0; const tickH = isCm ? 18 : 10; s += ''; if(isCm) s += '' + (mm/10) + ''; } s += 'см'; // Риска const rx = leftPad + pos * pxPerMm; s += ''; s += ''; document.getElementById('p7-svg').innerHTML = s; // Info document.getElementById('p7-pos').textContent = pos; // Округление до ближайшей цены деления const rounded = Math.round(pos / cd) * cd; const dx = cd / 2; document.getElementById('p7-info').innerHTML = 'Цена деления: ' + cd + ' мм
' + 'Отсчёт (округлён до деления): ' + rounded + ' мм
' + 'Запись с погрешностью: $l = (' + rounded + ' \\pm ' + dx + ')$ мм'; renderMath(document.getElementById('p7-info')); } document.getElementById('p7-cd').addEventListener('change', drawRuler); document.getElementById('p7-pos-r').addEventListener('input', drawRuler); drawRuler(); // §7 IV-2 wire: calc const updCalc = () => { let x1 = +document.getElementById('p7-x1-r').value; let x2 = +document.getElementById('p7-x2-r').value; const N = +document.getElementById('p7-N-r').value; if(x2 <= x1){ x2 = x1 + 1; document.getElementById('p7-x2-r').value = x2; } document.getElementById('p7-x1').textContent = x1; document.getElementById('p7-x2').textContent = x2; document.getElementById('p7-N').textContent = N; const C = (x2 - x1) / N; const Cltx = (+C.toPrecision(4)).toString().replace('.', '{,}'); const dxLtx = (+(C / 2).toPrecision(4)).toString().replace('.', '{,}'); const cdEq = document.getElementById('p7-cd2-eq'); const dxEq = document.getElementById('p7-dx-eq'); if(cdEq){ cdEq.textContent = '$C = \\dfrac{X_2 - X_1}{N} = \\dfrac{' + x2 + ' - ' + x1 + '}{' + N + '} = ' + Cltx + '$'; renderMath(cdEq); } if(dxEq){ dxEq.textContent = '$\\Delta X = C/2 = ' + dxLtx + '$'; renderMath(dxEq); } }; ['p7-x1-r','p7-x2-r','p7-N-r'].forEach(id => document.getElementById(id).addEventListener('input', updCalc)); updCalc(); wireDnd('p7-dnd', [ { id:'a1', cat:'mm' },{ id:'a2', cat:'01mm' },{ id:'a3', cat:'001mm' }, { id:'a4', cat:'1c' },{ id:'a5', cat:'01c' },{ id:'a6', cat:'01s' } ], []); wireQuiz('p7-tr-host', () => { if(window.addXp) window.addXp(15, 'tr-p7'); }); wireReadBtn('p7'); renderMath(body); } /* ========================================================== */ /* Финал главы 1 — 5 боссов + ачивка «Юный физик» (+50 XP) */ /* ========================================================== */ function add_final1(){ const body = document.getElementById('final1-body'); if(!body) return; let h = ''; h += '
' + '
Финал главы 1: победи 5 боссов
' + '
Реши все 5 задач — получишь ачивку «Юный физик» и +50 XP.
' + '
' + '
Побеждено: 0 / 5
' + '
'; const bosses = [ { n:1, tag:'§4–6', title:'Перевод и площадь', q:'Прямоугольный лист бумаги: $a = 21$ см, $b = 30$ см. Найди площадь в м².', hint:'$a = 0{,}21$ м, $b = 0{,}30$ м. $S = a b = 0{,}21 \\cdot 0{,}30 = 0{,}063$ м².', ans:0.063, tol:0.001, step:'0.001' }, { n:2, tag:'§4 + §6', title:'Плотность бруска', q:'Брусок $a = 4$ см, $b = 5$ см, $c = 2{,}5$ см, $m = 135$ г. Найди $\\rho$ в г/см³.', hint:'$V = 4 \\cdot 5 \\cdot 2{,}5 = 50$ см³. $\\rho = m/V = 135/50 = 2{,}7$ г/см³ (алюминий).', ans:2.7, tol:0.05, step:'0.01' }, { n:3, tag:'§6', title:'Скорость в м/с', q:'Автомобиль едет $v = 90$ км/ч. Найди $v$ в м/с.', hint:'$v = 90/3{,}6 = 25$ м/с.', ans:25, tol:0.2, step:'0.1' }, { n:4, tag:'§7', title:'Цена деления', q:'Между отметками $10$ см и $15$ см на линейке $50$ малых делений. Какова цена деления в мм?', hint:'$X_2 - X_1 = 5$ см $= 50$ мм. $C = 50/50 = 1$ мм.', ans:1, tol:0.05, step:'0.1' }, { n:5, tag:'§7', title:'Юный физик (погрешность)', q:'Цена деления мензурки $C = 2$ мл. Отсчёт $V = 84$ мл. Запиши погрешность $\\Delta V$ в мл.', hint:'$\\Delta V = C/2 = 2/2 = 1$ мл. (Запись: $V = (84 \\pm 1)$ мл.)', ans:1, tol:0.05, step:'0.1' } ]; const STATE_KEY = 'physics7_ch1_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('ch1-fin-fill').style.width = (cnt * 100 / bosses.length) + '%'; document.getElementById('ch1-fin-lab').textContent = 'Побеждено: ' + cnt + ' / ' + bosses.length; if(cnt === bosses.length){ document.getElementById('ch1-mastered').style.display = 'flex'; const ACH_KEY = 'physics7_ch1_yphys'; if(localStorage.getItem(ACH_KEY) !== '1'){ localStorage.setItem(ACH_KEY, '1'); if(window.addXp) window.addXp(50, 'ach-ch1-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('.boss-card[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-ch1-' + 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_CH1_WIDGETS = { p1: add_p1, p2: add_p2, p3: add_p3, p4: add_p4, p5: add_p5, p6: add_p6, p7: add_p7, final1: add_final1 }; })();