refactor: distribute lab-init.js into 34 engine files
lab-init.js: 4098 -> 543 lines (infrastructure + THEORY only) Each sim's _open*() + UI helpers moved to its engine file: graph.js, projectile.js, collision.js, magnetic.js, triangle.js, geometry.js, trigcircle.js, gas.js (molphys), coulomb.js, circuit.js, reactions.js (chemistry), newton.js (dynamics), chemsandbox.js, celldivision.js, photosynthesis.js, angrybirds.js, quadratic.js, normaldist.js, graphtransform.js, pendulum.js, equilibrium.js, thinlens.js, mirror.js, isoprocess.js, titration.js, refraction.js, probability.js, bohratom.js, electrolysis.js, waves.js, crystal.js, orbitals.js, stereo.js, hydrostatics.js All 34 engine files syntax-checked OK.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
'use strict';
|
||||
'use strict';
|
||||
/* ══════════════════════════════════════════════════════
|
||||
TriangleSim — interactive triangle geometry simulation
|
||||
Draggable vertices A / B / C, toggleable layers:
|
||||
@@ -959,3 +959,93 @@ class TriangleSim {
|
||||
ctx.restore();
|
||||
}
|
||||
}
|
||||
|
||||
/* ─── lab UI init ─────────────────────────────────── */
|
||||
function _openTriangle() {
|
||||
document.getElementById('sim-topbar-title').textContent = 'Геометрия треугольника';
|
||||
_simShow('sim-tri');
|
||||
_simShow('ctrl-tri');
|
||||
|
||||
requestAnimationFrame(() => requestAnimationFrame(() => {
|
||||
if (!tSim) {
|
||||
tSim = new TriangleSim(document.getElementById('tri-canvas'));
|
||||
tSim.onUpdate = _triUpdateUI;
|
||||
}
|
||||
tSim.fit();
|
||||
tSim.draw();
|
||||
_triUpdateUI(tSim.stats());
|
||||
}));
|
||||
}
|
||||
|
||||
function triToggle(layer, rowEl) {
|
||||
if (!tSim) return;
|
||||
tSim.toggleLayer(layer);
|
||||
rowEl.classList.toggle('active', tSim.layers[layer]);
|
||||
}
|
||||
|
||||
function _triUpdateUI(s) {
|
||||
const f2 = v => v.toFixed(2);
|
||||
const deg = v => v.toFixed(1) + '°';
|
||||
const unit = v => f2(v) + ' ед';
|
||||
|
||||
// panel
|
||||
document.getElementById('ts-a').textContent = unit(s.a);
|
||||
document.getElementById('ts-b').textContent = unit(s.b);
|
||||
document.getElementById('ts-c').textContent = unit(s.c);
|
||||
document.getElementById('ts-A').textContent = deg(s.A);
|
||||
document.getElementById('ts-B').textContent = deg(s.B);
|
||||
document.getElementById('ts-C').textContent = deg(s.C);
|
||||
document.getElementById('ts-S').textContent = f2(s.S) + ' ед²';
|
||||
document.getElementById('ts-P').textContent = unit(s.perim);
|
||||
document.getElementById('ts-R').textContent = unit(s.R);
|
||||
document.getElementById('ts-r').textContent = unit(s.r);
|
||||
document.getElementById('ts-type').textContent = s.type;
|
||||
|
||||
// stats bar
|
||||
document.getElementById('tbar-a').textContent = unit(s.a);
|
||||
document.getElementById('tbar-b').textContent = unit(s.b);
|
||||
document.getElementById('tbar-c').textContent = unit(s.c);
|
||||
document.getElementById('tbar-S').textContent = f2(s.S) + ' ед²';
|
||||
document.getElementById('tbar-P').textContent = unit(s.perim);
|
||||
document.getElementById('tbar-Rr').textContent = f2(s.R) + ' / ' + f2(s.r);
|
||||
}
|
||||
|
||||
/* ── geometry (planimetry) ── */
|
||||
|
||||
const _GEO_HINTS = {
|
||||
select: 'Клик — выбрать объект, перетащи точку для перемещения',
|
||||
point: 'Клик — поставить точку',
|
||||
segment: 'Кликни 2 точки для отрезка',
|
||||
line: 'Кликни 2 точки для прямой',
|
||||
ray: 'Кликни: начало, затем направление',
|
||||
circle: 'Клик — центр; второй клик — радиус',
|
||||
triangle: 'Кликни 3 точки для треугольника',
|
||||
quad: 'Кликни 4 точки для четырёхугольника',
|
||||
polygon: 'Кликай точки; двойной клик или Enter — завершить',
|
||||
midpoint: 'Кликни 2 точки — получи середину отрезка',
|
||||
perpbisect: 'Кликни 2 точки — получи серединный перпендикуляр',
|
||||
anglebisect: 'Кликни: точку A, затем вершину угла, затем точку B',
|
||||
parallel: 'Сначала кликни на прямую/отрезок, затем на точку',
|
||||
perpendicular:'Сначала кликни на прямую/отрезок, затем на точку',
|
||||
intersect: 'Кликни на первую прямую, затем на вторую',
|
||||
foot: 'Сначала кликни на прямую/отрезок',
|
||||
circumcircle: 'Кликни 3 точки треугольника — получи описанную окружность',
|
||||
incircle: 'Кликни 3 точки треугольника — получи вписанную окружность',
|
||||
reflect: 'Сначала кликни на ось симметрии (прямую/отрезок)',
|
||||
ngon: 'Клик — центр правильного многоугольника; второй клик — вершина',
|
||||
tangent: 'Кликни на окружность — построим касательные',
|
||||
translate: 'Кликни начало вектора A',
|
||||
tick: 'Кликни на отрезок или сторону — добавить штрих (1–3; ещё раз — убрать)',
|
||||
arcmark: 'Кликни на вершину полигона — добавить дугу (1–3; ещё раз — убрать)',
|
||||
parallelmark: 'Кликни на отрезок или сторону — добавить метку параллельности (1–2; ещё раз — убрать)',
|
||||
altitude: 'Кликни на вершину треугольника — построим высоту из неё',
|
||||
median: 'Кликни на вершину треугольника — построим медиану из неё',
|
||||
centroid: 'Кликни на треугольник или внутри него — построим все 3 медианы и центроид G',
|
||||
orthocenter: 'Кликни на треугольник или внутри него — построим все 3 высоты и ортоцентр H',
|
||||
thales: 'Кликни центр подобия O (начало лучей)',
|
||||
midline: 'Кликни вершину A треугольника',
|
||||
parallelogram:'Кликни вершину A параллелограмма',
|
||||
diagonal: 'Кликни внутри четырёхугольника — построим диагонали',
|
||||
scale: 'Кликни центр подобия O',
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user