30) bubbles.shift(); } function render(){ ctx.clearRect(0, 0, W, H); /* Pot */ ctx.strokeStyle = '#475569'; ctx.lineWidth = 3; ctx.fillStyle = '#cbd5e1'; ctx.fillRect(70, 80, 320, 130); ctx.strokeRect(70, 80, 320, 130); /* Lid */ ctx.fillStyle = pressure > 1.3 ? '#475569' : '#94a3b8'; ctx.fillRect(60, 70, 340, 12); ctx.strokeRect(60, 70, 340, 12); /* Water */ const T = Tboil(pressure); const waterColor = T > 100 ? '#fb923c' : '#7dd3fc'; ctx.fillStyle = waterColor; ctx.globalAlpha = 0.7; ctx.fillRect(75, 130, 310, 75); ctx.globalAlpha = 1; /* Steam if T high enough */ const intensity = (pressure - 0.5) / 2.5; /* Bubbles */ if (Math.random() < 0.3 + intensity * 0.5) spawnBubble(); bubbles.forEach(b => { b.y += b.vy; ctx.fillStyle = '#fff'; ctx.globalAlpha = 0.7; ctx.beginPath(); ctx.arc(b.x, b.y, b.r, 0, 2 * Math.PI); ctx.fill(); ctx.globalAlpha = 1; }); /* Filter dead bubbles */ for (let i = bubbles.length - 1; i >= 0; i--) if (bubbles[i].y < 130) bubbles.splice(i, 1); /* Pressure gauge */ ctx.fillStyle = '#0f172a'; ctx.font = "bold 14px 'JetBrains Mono', monospace"; ctx.textAlign = 'left'; ctx.fillText('P = '+pressure.toFixed(2)+' атм', 410, 110); ctx.fillText('T_кип = '+T+'°C', 410, 135); /* T arrow */ ctx.strokeStyle = '#dc2626'; ctx.lineWidth = 2; ctx.beginPath(); ctx.moveTo(410, 150); ctx.lineTo(410, 150 - (T - 80) * 1.2); ctx.stroke(); ctx.fillStyle = '#dc2626'; ctx.beginPath(); ctx.moveTo(410, 150 - (T - 80) * 1.2); ctx.lineTo(405, 150 - (T - 80) * 1.2 + 8); ctx.lineTo(415, 150 - (T - 80) * 1.2 + 8); ctx.fill(); } const raf = P8Anim.raf(render); raf.start(); document.getElementById('p11-iv6-p').oninput = ev => { pressure = +ev.target.value; document.getElementById('p11-iv6-p-val').textContent = pressure.toFixed(2); document.getElementById('p11-iv6-tboil').textContent = Tboil(pressure); }; } function _initP10_iv6(){ const sb = document.getElementById('p10-iv6-sandbox'); if (!sb || !window.P8Helpers) return; const svg = P8Helpers.svg.create(560, 220); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); let T = 50, S = 0.3, W = 2; function render(){ svg.innerHTML = ''; /* Water surface */ const surfaceW = 100 + S * 320; const surfaceX = (560 - surfaceW) / 2; svg.appendChild(P8Helpers.svg.el('rect', { x: surfaceX, y: 150, width: surfaceW, height: 60, fill: P8Helpers.thermal.tempColor(T/130), opacity: 0.85, stroke: '#0f172a', 'stroke-width': 2 })); svg.appendChild(P8Helpers.svg.el('text', { x: 280, y: 200, 'font-family':"'JetBrains Mono',monospace", 'font-size':10, 'font-weight':600, fill:'#fff', 'text-anchor':'middle', text: 'T='+T+'°C, S='+S.toFixed(2)+' м²' })); /* Evaporation rate (relative) */ const rate = (T / 100) * (0.5 + S) * (0.5 + W / 10); const numArrows = Math.round(3 + rate * 12); for (let i = 0; i < numArrows; i++) { const x = surfaceX + (i + 0.5) / numArrows * surfaceW + (Math.random() - 0.5) * 8; const len = 30 + rate * 60 + Math.random() * 20; const skew = W * 6 * (Math.random() - 0.3); const arrow = P8Helpers.svg.gradientArrow(svg, x, 150, x + skew, 150 - len, { colorFrom: '#7dd3fc', colorTo: '#bae6fd', width: 1.5, headSize: 7 }); if (arrow) svg.appendChild(arrow); } /* Wind indicator */ if (W > 1) { svg.appendChild(P8Helpers.svg.el('text', { x: 510, y: 30, 'font-family':"'Inter',sans-serif", 'font-size':22, fill: '#64748b', text: '~'.repeat(Math.min(3, Math.round(W/2))) })); svg.appendChild(P8Helpers.svg.el('text', { x: 480, y: 50, 'font-family':"'Inter',sans-serif", 'font-size':10, 'font-weight':700, fill: '#64748b', text: 'ветер →' })); } document.getElementById('p10-iv6-rate').textContent = rate.toFixed(2); } document.getElementById('p10-iv6-t').oninput = ev => { T = +ev.target.value; document.getElementById('p10-iv6-t-val').textContent = T; render(); }; document.getElementById('p10-iv6-s').oninput = ev => { S = +ev.target.value; document.getElementById('p10-iv6-s-val').textContent = S.toFixed(2); render(); }; document.getElementById('p10-iv6-w').oninput = ev => { W = +ev.target.value; document.getElementById('p10-iv6-w-val').textContent = W.toFixed(1); render(); }; render(); } function _initP9_iv6(){ const sb = document.getElementById('p9-iv6-sandbox'); if (!sb || !window.P8Helpers) return; const svg = P8Helpers.svg.create(560, 200); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); const mats = { ice: { lambda: 330, color: '#bfdbfe', name: 'Лёд' }, lead: { lambda: 25, color: '#9ca3af', name: 'Свинец' }, al: { lambda: 380, color: '#cbd5e1', name: 'Алюминий' }, iron: { lambda: 270, color: '#64748b', name: 'Железо' } }; let mat = 'ice', mass = 1; function render(){ svg.innerHTML = ''; const m = mats[mat]; const Q = m.lambda * mass; /* Block of material */ const blockH = 50 + mass * 25; svg.appendChild(P8Helpers.svg.el('rect', { x: 100, y: 100 - blockH/2, width: 100, height: blockH, fill: m.color, stroke: '#0f172a', 'stroke-width': 2, rx: 6 })); svg.appendChild(P8Helpers.svg.el('text', { x: 150, y: 100, 'font-family':"'Inter',sans-serif", 'font-size':12, 'font-weight':700, fill:'#0f172a', 'text-anchor':'middle', text: m.name })); svg.appendChild(P8Helpers.svg.el('text', { x: 150, y: 116, 'font-family':"'JetBrains Mono',monospace", 'font-size':10, fill:'#0f172a', 'text-anchor':'middle', text: mass.toFixed(1)+' кг' })); /* Arrow Q → */ const arrow = P8Helpers.svg.gradientArrow(svg, 220, 100, 360, 100, { colorFrom:'#fde047', colorTo:'#dc2626', width: 4, headSize: 16, glow: true }); svg.appendChild(arrow); svg.appendChild(P8Helpers.svg.el('text', { x: 290, y: 88, 'font-family':"'Unbounded',sans-serif", 'font-size':13, 'font-weight':800, fill:'#dc2626', 'text-anchor':'middle', text: 'Q = '+Q+' кДж' })); /* Melted state */ svg.appendChild(P8Helpers.svg.el('rect', { x: 380, y: 130, width: 100, height: blockH * 0.55, fill: m.color, opacity: 0.7, stroke: '#0f172a', 'stroke-width': 1.5, rx: 4 })); svg.appendChild(P8Helpers.svg.el('text', { x: 430, y: 156, 'font-family':"'Inter',sans-serif", 'font-size':11, 'font-weight':700, fill:'#0f172a', 'text-anchor':'middle', text: 'расплав' })); document.getElementById('p9-iv6-q').textContent = Q; } document.getElementById('p9-iv6-mat').onchange = ev => { mat = ev.target.value; render(); }; document.getElementById('p9-iv6-m').oninput = ev => { mass = +ev.target.value; document.getElementById('p9-iv6-m-val').textContent = mass.toFixed(1); render(); }; render(); } function _initP7_iv6(){ const sb = document.getElementById('p7-iv6-sandbox'); if (!sb || !window.P8Helpers) return; const svg = P8Helpers.svg.create(560, 220); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); const fuels = { wood: { q: 10e6, color: '#a16207' }, coal: { q: 29e6, color: '#1e293b' }, gas: { q: 44e6, color: '#3b82f6' } }; let activeFuel = 'wood'; let mass = 0.1; function render(){ svg.innerHTML = ''; const f = fuels[activeFuel]; /* Vessel with water */ svg.appendChild(P8Helpers.svg.el('rect', { x: 200, y: 30, width: 160, height: 100, fill: 'rgba(125, 211, 252, .55)', stroke: '#0f172a', 'stroke-width': 2, rx: 5 })); /* Fuel pile */ const pileH = 10 + mass * 50; svg.appendChild(P8Helpers.svg.el('rect', { x: 240, y: 140 + (40 - pileH), width: 80, height: pileH, fill: f.color, rx: 3 })); /* Flame */ const Q = f.q * mass; const intensity = Math.min(1, Q / 5e6); svg.appendChild(P8Helpers.svg.el('rect', { x: 230, y: 130 - intensity * 20, width: 100, height: 12 + intensity * 15, fill: '#dc2626', opacity: 0.85, rx: 4 })); /* Steam if hot enough */ const cm = 4200 * 1; const dT = Q / cm; if (dT > 60) { [0, 1, 2].forEach(i => { svg.appendChild(P8Helpers.svg.el('circle', { cx: 240 + i * 40, cy: 20 - intensity * 10, r: 6 + intensity * 2, fill: '#cbd5e1', opacity: 0.7 })); }); } /* Readouts */ document.getElementById('p7-iv6-q').textContent = (Q / 1e6).toFixed(2); document.getElementById('p7-iv6-dt').textContent = Math.round(dT); } document.querySelectorAll('#p7-iv6-sandbox ~ * [data-fuel]').forEach(btn => { btn.onclick = ev => { activeFuel = ev.currentTarget.dataset.fuel; document.querySelectorAll('[data-fuel]').forEach(b => b.style.outline = ''); ev.currentTarget.style.outline = '2px solid var(--p8-brand,#7c3aed)'; render(); }; }); /* Click on palette items globally */ Array.from(document.querySelectorAll('[data-fuel]')).forEach(btn => { btn.onclick = ev => { activeFuel = btn.dataset.fuel; document.querySelectorAll('[data-fuel]').forEach(b => b.style.outline = ''); btn.style.outline = '2px solid var(--p8-brand,#7c3aed)'; render(); if (window.addXp) addXp(5, 'p7-iv6-fuel-'+activeFuel); }; }); document.getElementById('p7-iv6-m').oninput = ev => { mass = +ev.target.value; document.getElementById('p7-iv6-m-val').textContent = mass.toFixed(2); render(); }; render(); } function _initP5_iv6(){ const sb = document.getElementById('p5-iv6-sandbox'); if (!sb || !window.P8Helpers || !window.P8Anim) return; const svg = P8Helpers.svg.create(560, 240); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); let lampPower = 60; const bodies = [ { name: 'Чёрное', absorption: 0.95, fill: '#0f172a', x: 130, T: 20 }, { name: 'Белое', absorption: 0.20, fill: '#f1f5f9', x: 280, T: 20 }, { name: 'Зеркало', absorption: 0.05, fill: '#cbd5e1', x: 430, T: 20 } ]; let running = false; function render(){ svg.innerHTML = ''; /* Lamp */ svg.appendChild(P8Helpers.svg.el('rect', { x: 240, y: 8, width: 80, height: 20, fill: '#facc15', rx: 4 })); svg.appendChild(P8Helpers.svg.el('text', { x: 280, y: 22, 'font-family':"'Unbounded',sans-serif", 'font-size':10, 'font-weight':800, fill:'#0f172a', 'text-anchor':'middle', text: lampPower+'%' })); /* Radiation rays */ bodies.forEach(b => { const len = lampPower * 1.2; const opacity = lampPower / 100; svg.appendChild(P8Helpers.svg.el('line', { x1: 280, y1: 28, x2: b.x, y2: 130, stroke: '#fde047', 'stroke-width': 2, opacity: opacity, 'stroke-dasharray': '4 3' })); }); /* Bodies */ bodies.forEach(b => { const g = P8Helpers.svg.el('g', { transform: 'translate('+b.x+',150)' }); g.appendChild(P8Helpers.svg.el('rect', { x:-32, y:-12, width:64, height:48, rx:5, fill: b.fill, stroke:'#0f172a', 'stroke-width':1.5 })); g.appendChild(P8Helpers.svg.el('text', { x:0, y:-22, 'font-family':"'Inter',sans-serif", 'font-size':11, 'font-weight':700, fill:'#0f172a', 'text-anchor':'middle', text: b.name })); /* Glow when warm */ const tempNorm = Math.min(1, (b.T - 20) / 80); if (tempNorm > 0.05) { g.appendChild(P8Helpers.svg.el('rect', { x:-36, y:-16, width:72, height:56, rx:8, fill: 'none', stroke: P8Helpers.thermal.tempColor(tempNorm*0.5 + 0.5), 'stroke-width': 4, opacity: 0.5 + tempNorm * 0.5 })); } svg.appendChild(g); /* T readout */ svg.appendChild(P8Helpers.svg.el('text', { x: b.x, y: 220, 'font-family':"'JetBrains Mono',monospace", 'font-size':12, 'font-weight':800, fill: P8Helpers.thermal.tempColor(tempNorm*0.5 + 0.4), 'text-anchor':'middle', text: 'T='+Math.round(b.T)+'°C' })); }); } const raf = P8Anim.raf(dt => { if (!running) return; bodies.forEach(b => { b.T += dt * (lampPower / 100) * b.absorption * 10; if (b.T > 120) b.T = 120; }); render(); }); document.getElementById('p5-iv6-lamp').oninput = ev => { lampPower = +ev.target.value; document.getElementById('p5-iv6-lamp-val').textContent = lampPower; render(); }; document.getElementById('p5-iv6-play').onclick = () => { if (!running) { running = true; raf.start(); if (window.addXp) addXp(10, 'p5-iv6-rad'); } }; document.getElementById('p5-iv6-reset').onclick = () => { running = false; raf.stop(); bodies.forEach(b => b.T = 20); render(); }; render(); } function _initP4_iv6(){ const sb = document.getElementById('p4-iv6-sandbox'); if (!sb || !window.P8Helpers || !window.P8Anim) return; const W = 560, H = 280; const canvas = document.createElement('canvas'); canvas.width = W; canvas.height = H; canvas.style.width = '100%'; canvas.style.height = '100%'; canvas.style.display = 'block'; sb.appendChild(canvas); const ctx = canvas.getContext('2d'); let power = 40; /* Particles in convection loops */ const particles = []; const NP = 60; for (let i = 0; i < NP; i++) { particles.push({ x: 60 + Math.random() * (W - 120), y: 40 + Math.random() * (H - 100), angle: Math.random() * 2 * Math.PI, speed: 0.3 + Math.random() * 0.4, r: 2.5 + Math.random() * 1.5 }); } function step(dt){ /* Clear */ ctx.clearRect(0, 0, W, H); /* Container */ ctx.strokeStyle = '#0f172a'; ctx.lineWidth = 2; ctx.strokeRect(40, 20, W - 80, H - 60); /* Burner */ ctx.fillStyle = '#475569'; ctx.fillRect(180, H - 30, 200, 16); /* Flame */ const flameH = (power / 100) * 16; ctx.fillStyle = '#dc2626'; ctx.fillRect(200, H - 30 - flameH, 160, flameH); /* Particles — convection loop: rise in center, fall on edges */ const cx = W / 2; particles.forEach(p => { const dx = p.x - cx; const localTemp = Math.max(0, 1 - (p.y - 40) / (H - 100)); /* bottom = hot */ /* Vertical velocity: up in center (proportional to power), down on sides */ let vy = 0; if (Math.abs(dx) < 80) { vy = -p.speed * (power / 50) * (0.6 + localTemp); } else { vy = p.speed * 0.4; } /* Horizontal: drift inward at top, outward at bottom */ let vx = 0; if (p.y < 60) vx = -dx * 0.005 * (power / 50); else if (p.y > H - 70) vx = dx * 0.008 * (power / 50); p.x += vx * dt * 60; p.y += vy * dt * 60; /* Constrain */ if (p.x < 50) p.x = 50; if (p.x > W - 50) p.x = W - 50; if (p.y < 30) p.y = 30; if (p.y > H - 38) p.y = H - 38; /* Color by temp (hotter = closer to bottom and rising) */ const tempVal = localTemp * (power / 100); ctx.fillStyle = P8Helpers.thermal.tempColor(tempVal * 0.7 + 0.15); ctx.beginPath(); ctx.arc(p.x, p.y, p.r, 0, 2 * Math.PI); ctx.fill(); }); } const raf = P8Anim.raf(dt => step(Math.min(dt, 0.05))); document.getElementById('p4-iv6-pwr').oninput = ev => { power = +ev.target.value; document.getElementById('p4-iv6-pwr-val').textContent = power; }; document.getElementById('p4-iv6-play').onclick = () => { if (!raf.running) { raf.start(); if (window.addXp) addXp(10, 'p4-iv6-conv'); } }; document.getElementById('p4-iv6-pause').onclick = () => raf.stop(); /* Auto-start on first view */ raf.start(); step(0); } function _initP2_iv6(){ const sb = document.getElementById('p2-iv6-sandbox'); if (!sb || !window.P8Helpers) return; const svg = P8Helpers.svg.create(560, 240); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); const state = { comp: 0, q: 0 }; function render(){ svg.innerHTML = ''; /* Cylinder */ const compFraction = state.comp / 100; const cylX = 80, cylY = 60, cylW = 320, cylH = 120; const pistonX = cylX + cylW * (0.2 + compFraction * 0.5); svg.appendChild(P8Helpers.svg.el('rect', { x: cylX, y: cylY, width: cylW, height: cylH, rx: 8, fill: 'none', stroke: '#0f172a', 'stroke-width': 2 })); /* Gas region (compressed = brighter, hotter) */ const T = 20 + compFraction * 60 + state.q * 0.1; const gasColor = P8Helpers.thermal.tempColor(T / 200); svg.appendChild(P8Helpers.svg.el('rect', { x: cylX + 2, y: cylY + 2, width: pistonX - cylX - 4, height: cylH - 4, rx: 6, fill: gasColor, opacity: 0.6 })); /* Molecules — count grows with T */ const numMol = Math.round(8 + T * 0.3); for (let i = 0; i < numMol; i++) { const px = cylX + 8 + Math.random() * (pistonX - cylX - 16); const py = cylY + 8 + Math.random() * (cylH - 16); svg.appendChild(P8Helpers.svg.el('circle', { cx: px, cy: py, r: 3, fill: '#fff', opacity: 0.7 })); } /* Piston */ svg.appendChild(P8Helpers.svg.el('rect', { x: pistonX - 6, y: cylY - 8, width: 12, height: cylH + 16, fill: '#475569', stroke: '#0f172a' })); svg.appendChild(P8Helpers.svg.el('rect', { x: pistonX + 6, y: cylY + cylH/2 - 6, width: 100, height: 12, fill: '#94a3b8', stroke: '#0f172a' })); /* Heat source if q>0 */ if (state.q > 0) { svg.appendChild(P8Helpers.svg.el('rect', { x: cylX + 60, y: cylY + cylH + 4, width: 60, height: 12, fill: '#dc2626', rx: 4 })); svg.appendChild(P8Helpers.svg.el('text', { x: cylX + 90, y: cylY + cylH + 32, 'font-family':"'Inter',sans-serif", 'font-size':10, 'font-weight':700, fill:'#dc2626', 'text-anchor':'middle', text: 'Q = '+state.q+' Дж' })); } if (state.comp > 0) { svg.appendChild(P8Helpers.svg.el('text', { x: pistonX + 56, y: cylY + cylH/2 - 14, 'font-family':"'Inter',sans-serif", 'font-size':10, 'font-weight':700, fill:'#475569', 'text-anchor':'middle', text: 'A над газом' })); } /* Readouts */ document.getElementById('p2-iv6-t').textContent = Math.round(T); document.getElementById('p2-iv6-u').textContent = Math.round(100 + compFraction * 60 + state.q * 0.5); } document.getElementById('p2-iv6-comp').oninput = ev => { state.comp = +ev.target.value; document.getElementById('p2-iv6-comp-val').textContent = state.comp; render(); }; document.getElementById('p2-iv6-q').oninput = ev => { state.q = +ev.target.value; document.getElementById('p2-iv6-q-val').textContent = state.q; render(); }; render(); } function _initP8_iv6(){ const sb = document.getElementById('p8-iv6-sandbox'); if (!sb || !window.P8Helpers || !window.P8Anim) return; const W = 560, H = 280; const svg = P8Helpers.svg.create(W, H); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); const m = 0.5; const c_ice = 2100, c_water = 4200, lambda = 330000, r_vap = 2300000; let power = 500, energyAccumulated = 0, running = false; let points = [{ t: 0, T: -20 }]; const pad = { l: 50, r: 18, t: 22, b: 32 }; const plotW = W - pad.l - pad.r; const plotH = H - pad.t - pad.b; svg.appendChild(P8Helpers.svg.el('rect', { x: pad.l, y: pad.t, width: plotW, height: plotH, fill: '#fafafa', stroke: '#e5e7eb' })); const yMin = -20, yMax = 120; function yToPx(T) { return pad.t + plotH * (1 - (T - yMin) / (yMax - yMin)); } function tToPx(t) { return pad.l + plotW * Math.min(1, t / 300); } [-20, 0, 20, 40, 60, 80, 100, 120].forEach(t => { const y = yToPx(t); svg.appendChild(P8Helpers.svg.el('line', { x1: pad.l, y1: y, x2: pad.l + plotW, y2: y, stroke: '#e5e7eb' })); svg.appendChild(P8Helpers.svg.el('text', { x: pad.l - 6, y: y + 3, 'font-family':"'JetBrains Mono',monospace", 'font-size': 10, fill: 'var(--p8-muted,#64748b)', 'text-anchor':'end', text: t+'°' })); }); const phaseRegions = [ { from: -20, to: 0, fill: '#bfdbfe', name: 'лёд' }, { from: 0, to: 100, fill: '#7dd3fc', name: 'вода' }, { from: 100, to: 120, fill: '#fde68a', name: 'пар' } ]; phaseRegions.forEach(r => { const y1 = yToPx(r.from), y2 = yToPx(r.to); svg.appendChild(P8Helpers.svg.el('rect', { x: pad.l, y: y2, width: plotW, height: y1 - y2, fill: r.fill, opacity: 0.18 })); svg.appendChild(P8Helpers.svg.el('text', { x: pad.l + plotW - 6, y: (y1 + y2) / 2 + 3, 'font-family':"'Inter',sans-serif", 'font-size': 10, 'font-weight': 700, fill: 'var(--p8-text)', 'text-anchor': 'end', text: r.name })); }); svg.appendChild(P8Helpers.svg.el('line', { x1: pad.l, y1: yToPx(0), x2: pad.l + plotW, y2: yToPx(0), stroke: '#0f172a', 'stroke-width': 1, 'stroke-dasharray': '3 3' })); svg.appendChild(P8Helpers.svg.el('line', { x1: pad.l, y1: yToPx(100), x2: pad.l + plotW, y2: yToPx(100), stroke: '#0f172a', 'stroke-width': 1, 'stroke-dasharray': '3 3' })); svg.appendChild(P8Helpers.svg.el('line', { x1: pad.l, y1: pad.t + plotH, x2: pad.l + plotW, y2: pad.t + plotH, stroke: '#0f172a' })); svg.appendChild(P8Helpers.svg.el('text', { x: pad.l + plotW / 2, y: H - 6, 'font-family':"'Inter',sans-serif", 'font-size': 11, 'font-weight': 700, fill: 'var(--p8-text)', 'text-anchor': 'middle', text: 'Время, с' })); const path = P8Helpers.svg.el('path', { d: '', fill: 'none', stroke: 'var(--th-mid, #f97316)', 'stroke-width': 3, 'stroke-linejoin': 'round', 'stroke-linecap': 'round' }); svg.appendChild(path); function updatePath(){ if (!points.length) return; const d = points.map((p, i) => (i === 0 ? 'M' : 'L') + tToPx(p.t).toFixed(1) + ',' + yToPx(p.T).toFixed(1)).join(' '); path.setAttribute('d', d); } function currentT(){ return points[points.length-1].T; } function currentPhase(T){ if (T < 0) return 'лёд'; if (T < 0.5 && energyAccumulated < lambda * m) return 'плавление'; if (T < 100) return 'вода'; if (T < 100.5 && energyAccumulated < (lambda + r_vap) * m) return 'кипение'; return 'пар'; } function tick(dt){ if (!running) return; const energy = power * dt; let T = currentT(); let newT = T; if (T < 0) { const dT = energy / (c_ice * m); newT = T + dT; if (newT > 0) newT = 0; } else if (T < 0.5 && energyAccumulated < lambda * m) { energyAccumulated += energy; newT = 0; if (energyAccumulated >= lambda * m) newT = 0.5; } else if (T < 100) { const dT = energy / (c_water * m); newT = T + dT; if (newT > 100) newT = 100; } else if (T < 100.5 && energyAccumulated < (lambda + r_vap) * m) { energyAccumulated += energy; newT = 100; if (energyAccumulated >= (lambda + r_vap) * m) newT = 100.5; } else if (T < 120) { const dT = energy / (c_water * m); newT = T + dT; if (newT > 120) newT = 120; } else { running = false; } const lastP = points[points.length-1]; points.push({ t: lastP.t + dt, T: newT }); if (points.length > 600) points.shift(); updatePath(); document.getElementById('p8-iv6-temp').textContent = Math.round(newT); document.getElementById('p8-iv6-phase').textContent = currentPhase(newT); if (lastP.t > 300) running = false; } const raf = P8Anim.raf(dt => tick(Math.min(dt * 4, 0.5))); const pwrInp = document.getElementById('p8-iv6-pwr'); const pwrLab = document.getElementById('p8-iv6-pwr-val'); pwrInp.oninput = () => { power = +pwrInp.value; pwrLab.textContent = power; }; document.getElementById('p8-iv6-play').onclick = () => { if (!running) { running = true; raf.start(); if (window.addXp) addXp(10, 'p8-iv6-melt'); } }; document.getElementById('p8-iv6-reset').onclick = () => { running = false; raf.stop(); energyAccumulated = 0; points = [{ t: 0, T: -20 }]; updatePath(); document.getElementById('p8-iv6-temp').textContent = '-20'; document.getElementById('p8-iv6-phase').textContent = 'лёд'; }; updatePath(); } function _initP6_iv6(){ const sb = document.getElementById('p6-iv6-sandbox'); if (!sb || !window.P8Helpers || !window.P8Anim) return; const svg = P8Helpers.svg.create(560, 240); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); const v1 = { x: 140, y: 130, m: 0.5, T: 80 }; const v2 = { x: 420, y: 130, m: 1.0, T: 20 }; const finalState = { active: false, T: 50 }; function drawVessel(x, y, m, T){ const g = P8Helpers.svg.el('g', { transform: 'translate('+x+','+y+')' }); const ht = 30 + m * 50; const w = 70; g.appendChild(P8Helpers.svg.el('rect', { x:-w/2, y:-ht, width:w, height:ht, rx:6, fill:'rgba(255,255,255,.6)', stroke:'#0f172a', 'stroke-width':1.5 })); g.appendChild(P8Helpers.svg.el('rect', { x:-w/2+3, y:-ht+5, width:w-6, height:ht-8, rx:4, fill: P8Helpers.thermal.tempColor(T/100) })); g.appendChild(P8Helpers.svg.el('text', { x:0, y:18, 'font-family':"'JetBrains Mono',monospace", 'font-size':11, 'font-weight':700, fill:'#0f172a', 'text-anchor':'middle', text: 'm='+m.toFixed(1)+' кг' })); g.appendChild(P8Helpers.svg.el('text', { x:0, y:32, 'font-family':"'JetBrains Mono',monospace", 'font-size':11, 'font-weight':700, fill:'#0f172a', 'text-anchor':'middle', text: 'T='+Math.round(T)+'°C' })); return g; } function redraw(){ svg.innerHTML = ''; if (!finalState.active) { svg.appendChild(drawVessel(v1.x, v1.y, v1.m, v1.T)); svg.appendChild(drawVessel(v2.x, v2.y, v2.m, v2.T)); } else { svg.appendChild(drawVessel(280, 130, v1.m + v2.m, finalState.T)); svg.appendChild(P8Helpers.svg.el('text', { x:280, y:60, 'font-family':"'Unbounded',sans-serif", 'font-size':14, 'font-weight':800, fill:'var(--th-mid,#f97316)', 'text-anchor':'middle', text: 'T_итог = '+Math.round(finalState.T)+' °C' })); } } function bindScrub(inputId, valId, obj, prop){ const input = document.getElementById(inputId); const lab = document.getElementById(valId); if (!input || !lab) return; input.addEventListener('input', () => { const v = parseFloat(input.value); obj[prop] = v; lab.textContent = v.toFixed(prop === 'm' ? 1 : 0); if (finalState.active) { finalState.active = false; document.getElementById('p6-iv6-tf').textContent = '—'; } redraw(); }); } bindScrub('p6-iv6-m1', 'p6-iv6-m1-val', v1, 'm'); bindScrub('p6-iv6-t1', 'p6-iv6-t1-val', v1, 'T'); bindScrub('p6-iv6-m2', 'p6-iv6-m2-val', v2, 'm'); bindScrub('p6-iv6-t2', 'p6-iv6-t2-val', v2, 'T'); document.getElementById('p6-iv6-mix').onclick = () => { const T = (v1.m * v1.T + v2.m * v2.T) / (v1.m + v2.m); finalState.active = true; P8Anim.tween({ from: v1.T, to: T, duration: 1200, easing: 'cubicInOut', onUpdate: t => { finalState.T = t; redraw(); document.getElementById('p6-iv6-tf').textContent = Math.round(t); } }); if (window.addXp) addXp(10, 'p6-iv6-mix'); }; document.getElementById('p6-iv6-reset').onclick = () => { finalState.active = false; document.getElementById('p6-iv6-tf').textContent = '—'; redraw(); }; redraw(); } function _initP3_iv6(){ const sb = document.getElementById('p3-iv6-sandbox'); if (!sb || !window.P8Helpers || !window.P8Drag || !window.P8Anim) return; const svg = P8Helpers.svg.create(560, 300); svg.setAttribute('width','100%'); svg.setAttribute('height','100%'); svg.style.display='block'; sb.appendChild(svg); const burner = P8Helpers.svg.el('g', { transform: 'translate(80, 240)' }); burner.appendChild(P8Helpers.svg.el('rect', { x:-32, y:-8, width:64, height:32, rx:4, fill:'#475569' })); burner.appendChild(P8Helpers.svg.el('rect', { x:-26, y:-22, width:52, height:14, rx:7, fill:'#dc2626' })); burner.appendChild(P8Helpers.svg.el('text', { x:0, y:48, 'font-family':"'Inter',sans-serif", 'font-size':11, 'font-weight':700, fill:'#475569', 'text-anchor':'middle', text:'Горелка (drop)' })); svg.appendChild(burner); const rods = [ { name:'Медь', lam:400, color:'#b45309', x:200, y:50 }, { name:'Серебро', lam:430, color:'#9ca3af', x:300, y:50 }, { name:'Стекло', lam:0.8, color:'#bae6fd', x:400, y:50 }, { name:'Дерево', lam:0.15,color:'#a16207', x:500, y:50 } ]; const rodEls = []; rods.forEach(rod => { const g = P8Helpers.svg.el('g', { transform: 'translate('+rod.x+','+rod.y+')' }); const segments = 12; const segs = []; for (let s = 0; s < segments; s++) { const r = P8Helpers.svg.el('rect', { x: -55 + s * (110/segments), y: -10, width: 110/segments, height: 20, fill: rod.color, stroke: 'none' }); g.appendChild(r); segs.push(r); } g.appendChild(P8Helpers.svg.el('rect', { x:-55, y:-10, width:110, height:20, rx:3, fill:'none', stroke:'#0f172a', 'stroke-width':1.5 })); g.appendChild(P8Helpers.svg.el('text', { x:0, y:-18, 'font-family':"'Inter',sans-serif", 'font-size':11, 'font-weight':700, fill:'#0f172a', 'text-anchor':'middle', text: rod.name })); g.appendChild(P8Helpers.svg.el('text', { x:0, y:30, 'font-family':"'JetBrains Mono',monospace", 'font-size':9, 'font-weight':600, fill:'var(--p8-muted, #64748b)', 'text-anchor':'middle', text: 'λ='+rod.lam })); svg.appendChild(g); rodEls.push({ rod, g, segs, x: rod.x, y: rod.y }); }); let simLoop = null; let simTime = 0; const matEl = document.getElementById('p3-iv6-mat'); const lamEl = document.getElementById('p3-iv6-lam'); const tendEl = document.getElementById('p3-iv6-tend'); function resetColors(rodObj){ rodObj.segs.forEach(s => s.setAttribute('fill', rodObj.rod.color)); } function startSim(rodObj){ if (simLoop) simLoop.stop(); simTime = 0; const lamNorm = Math.min(1, Math.log10(rodObj.rod.lam + 1) / Math.log10(500)); simLoop = P8Anim.raf(dt => { simTime += dt; const speed = lamNorm * 0.8 + 0.04; rodObj.segs.forEach((seg, i) => { const pos = i / (rodObj.segs.length - 1); const heat = Math.max(0, Math.min(1, speed * simTime - pos)); seg.setAttribute('fill', P8Helpers.thermal.tempColor(heat * 0.85 + 0.1)); }); const endHeat = Math.max(0, Math.min(1, speed * simTime - 0.95)); const tEnd = Math.round(20 + endHeat * 80); if (tendEl) tendEl.textContent = tEnd; if (simTime > 30) simLoop.stop(); }); simLoop.start(); if (matEl) matEl.textContent = rodObj.rod.name; if (lamEl) lamEl.textContent = rodObj.rod.lam; } rodEls.forEach((rodObj, i) => { P8Drag.attach(rodObj.g, { container: svg, onMove: (ev, pos) => { rodObj.x = pos.x; rodObj.y = pos.y; rodObj.g.setAttribute('transform', 'translate('+rodObj.x+','+rodObj.y+')'); }, onEnd: (ev, pos) => { if (Math.abs(pos.x - 80) < 70 && Math.abs(pos.y - 240) < 50) { rodEls.forEach((other, j) => { if (j !== i) resetColors(other); }); startSim(rodObj); if (window.addXp) addXp(10, 'p3-iv6-conduct'); } } }); }); svg.appendChild(P8Helpers.svg.el('text', { x: 280, y: 290, 'font-family': "'Inter', sans-serif", 'font-size': 10, fill: 'var(--p8-muted, #64748b)', 'text-anchor': 'middle', text: 'Перетащи стержень на горелку • Чем выше λ — тем быстрее цвет дойдёт до конца' })); } doctype html> Физика 8 · Глава 1 · «Тепловые явления»
37°C
Глава 1 · 11 параграфов

Тепловые явления

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

Тепловые явления — как энергия переходит между телами

Внутренняя энергия зависит от температуры тела. Тепло передаётся теплопроводностью, конвекцией и излучением. При нагревании, плавлении и кипении нужно разное количество теплоты.

Прогресс по главе
0%
Параграфы главы
§ 1

Внутренняя энергия

§ 2

Способы изменения внутренней энергии

§ 3

Теплопроводность

§ 4

Конвекция

§ 5

Излучение

§ 6

Расчёт количества теплоты при нагревании и охлаждении. Удельная теплоёмкость

§ 7

Горение. Удельная теплота сгорания топлива

§ 8

Плавление и кристаллизация

§ 9

Удельная теплота плавления и кристаллизации

§ 10

Испарение жидкостей. Факторы, влияющие на скорость испарения

§ 11

Кипение жидкостей. Удельная теплота парообразования

Финал главы

Достижение!