From 2fda4ee7f6287b514e6e0ab8ca3eade12547e0f6 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 11:11:33 +0300 Subject: [PATCH] =?UTF-8?q?fix(alg10=20ch1=20=C2=A78):=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B8=D1=83=D0=BC-=D1=80=D0=B8=D1=81=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B3=D0=B5=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=B8=20sin/cos/tg=20=3D=20a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Переделаны 3 SVG в §8 — теперь это полноценные плакатные визуализации с заголовками, формулами и цветовым кодированием: sin x = a (400×430): - Заголовочная плашка teal: 'УРАВНЕНИЕ: sin x = a' + пример a=1/2 - Окружность с осями, горизонтальная линия y=a в красной рамке - 2 сектора углов π/6 и 5π/6 разных цветов (бирюзовый + фиолетовый) - Вертикальные пунктиры от обеих точек к оси x (показывают sin α = a) - Подписи P_{π/6} и P_{5π/6} крупно, цветом совпадающим с сектором - Формульный блок снизу в рамке: x = (-1)^n · arcsin a + πn cos x = a (400×430): - Заголовочная плашка cyan - Вертикальная линия x=a с красной плашкой-меткой - Сектор +π/3 (верхний, cyan) и -π/3 (нижний, фиолетовый) - Горизонтальные пунктиры от точек к оси y - Формульный блок: x = ±arccos a + 2πn tg x = a (440×430, шире из-за оси тангенсов): - Заголовочная плашка green - Ось тангенсов справа (вертикальная пунктирная) - Точка A_a = (1; a) в красной рамке-метке - Прямая через O и A_a пунктиром в обе стороны - Пример a = √3/3 → корни π/6 и 7π/6 - Сектор угла π/6 + 2 точки - Формульный блок: x = arctg a + πn Все три SVG используют consistency: - Заголовок с подзаголовком сверху - Чёткое цветовое кодирование (a/sin/cos = красный) - Сектора заполненные пастельными цветами - Формула в нижней рамке с заголовком 'ОБЩАЯ ФОРМУЛА' --- frontend/textbooks/algebra_10_ch1.html | 155 ++++++++++++++++++------- 1 file changed, 110 insertions(+), 45 deletions(-) diff --git a/frontend/textbooks/algebra_10_ch1.html b/frontend/textbooks/algebra_10_ch1.html index d52eb01..0db6af2 100644 --- a/frontend/textbooks/algebra_10_ch1.html +++ b/frontend/textbooks/algebra_10_ch1.html @@ -1951,74 +1951,139 @@ function buildP8(){ const A = window.ALG10; let html = ''; - /* === SVG 1: геометрия решения sin x = a === */ + /* === SVG 1: геометрия решения sin x = a (премиум) === */ let svgSin = ''; if(A){ - const c = A.tri.canvas({id:'p8-sin', W:320, H:320, R:120}); - const a = 0.5; /* sin x = 0.5 */ - const x1 = Math.asin(a); /* π/6 */ - const x2 = Math.PI - x1; /* 5π/6 */ + const c = A.tri.canvas({id:'p8-sin', W:400, H:430, R:125, bg:'#fff'}); + const a = 0.5; /* sin x = 1/2 */ + const x1 = Math.asin(a); /* π/6 */ + const x2 = Math.PI - x1; /* 5π/6 */ const yL = c.cy - a * c.R; + const p1 = c.pointPx(x1); + const p2 = c.pointPx(x2); let s = c.open + /* === Заголовочная плашка === */ + + '' + + 'УРАВНЕНИЕ: sin x = a' + + 'Пример: a = 1/2 → корни π/6 и 5π/6' + /* === Оси и окружность === */ + c.axes() - + c.circle({width:2}) - /* Горизонтальная линия y = a */ - + '' - + 'y = a' - /* Две точки пересечения */ - + c.radius(x1, {color:'#0d9488'}) - + c.point(x1, {color:'#0d9488', label:'P_{x_1}', labelOffset:18, fontSize:11}) - + c.radius(x2, {color:'#7c3aed'}) - + c.point(x2, {color:'#7c3aed', label:'P_{x_2}', labelOffset:18, fontSize:11}) - + 'x_1 = arcsin a, x_2 = π − arcsin a' + + c.circle({width:2.5}) + /* === Горизонтальная линия y = a === */ + + '' + + '' + + 'y = a' + /* Метка значения a на оси y */ + + 'a' + /* === Сектор угла π/6 === */ + + '' + + 'π/6' + /* === Сектор угла 5π/6 (от 0 идём CCW почти до 5π/6, но рисуем оба угла рядом) === */ + + '' + /* === Радиусы к точкам решения === */ + + c.radius(x1, {color:'#0d9488', width:2.8}) + + c.radius(x2, {color:'#7c3aed', width:2.8}) + /* === Точки решения P_{π/6} и P_{5π/6} с подписями === */ + + c.point(x1, {color:'#0d9488', label:'P_{π/6}', labelOffset:22, fontSize:13, labelColor:'#0f766e'}) + + c.point(x2, {color:'#7c3aed', label:'P_{5π/6}', labelOffset:22, fontSize:13, labelColor:'#6d28d9'}) + /* === Вертикальные пунктиры — sin α для обеих точек === */ + + '' + + '' + /* === Формульный блок === */ + + '' + + 'ОБЩАЯ ФОРМУЛА' + + 'x = (−1)ⁿ · arcsin a + πn, n ∈ Z' + c.close; svgSin = s; } - /* === SVG 2: геометрия cos x = a === */ + /* === SVG 2: геометрия cos x = a (премиум) === */ let svgCos = ''; if(A){ - const c = A.tri.canvas({id:'p8-cos', W:320, H:320, R:120}); - const a = 0.5; /* cos x = 0.5 */ - const x1 = Math.acos(a); - const x2 = -x1; + const c = A.tri.canvas({id:'p8-cos', W:400, H:430, R:125, bg:'#fff'}); + const a = 0.5; /* cos x = 1/2 */ + const x1 = Math.acos(a); /* π/3 */ + const x2 = -x1; /* -π/3 */ const xL = c.cx + a * c.R; + const p1 = c.pointPx(x1); + const p2 = c.pointPx(x2); let s = c.open + /* === Заголовочная плашка === */ + + '' + + 'УРАВНЕНИЕ: cos x = a' + + 'Пример: a = 1/2 → корни ±π/3' + /* === Оси и окружность === */ + c.axes() - + c.circle({width:2}) - /* Вертикальная линия x = a */ - + '' - + 'x = a' - + c.radius(x1, {color:'#0d9488'}) - + c.point(x1, {color:'#0d9488', label:'P_{x_1}', labelOffset:18, fontSize:11}) - + c.radius(x2, {color:'#7c3aed'}) - + c.point(x2, {color:'#7c3aed', label:'P_{x_2}', labelOffset:18, fontSize:11}) - + 'x_{1,2} = ±arccos a' + + c.circle({width:2.5}) + /* === Вертикальная линия x = a === */ + + '' + + '' + + 'x = a' + /* Метка значения a на оси x */ + + 'a' + /* === Сектор угла π/3 (верхний) === */ + + '' + + 'π/3' + /* === Сектор угла -π/3 (нижний) === */ + + '' + + '-π/3' + /* === Радиусы === */ + + c.radius(x1, {color:'#0891b2', width:2.8}) + + c.radius(x2, {color:'#7c3aed', width:2.8}) + /* === Точки решения === */ + + c.point(x1, {color:'#0891b2', label:'P_{π/3}', labelOffset:22, fontSize:13, labelColor:'#0e7490'}) + + c.point(x2, {color:'#7c3aed', label:'P_{-π/3}', labelOffset:22, fontSize:13, labelColor:'#6d28d9'}) + /* === Горизонтальные пунктиры — cos α для обеих точек (от P до оси y) === */ + + '' + + '' + /* === Формульный блок === */ + + '' + + 'ОБЩАЯ ФОРМУЛА' + + 'x = ± arccos a + 2πn, n ∈ Z' + c.close; svgCos = s; } - /* === SVG 3: геометрия tg x = a === */ + /* === SVG 3: геометрия tg x = a (премиум) === */ let svgTg = ''; if(A){ - const c = A.tri.canvas({id:'p8-tg', W:340, H:320, R:120}); - const a = 0.6; /* tg x = 0.6 */ - const x1 = Math.atan(a); /* arctg a */ - const x2 = x1 + Math.PI; /* arctg a + π */ + const c = A.tri.canvas({id:'p8-tg', W:440, H:430, R:125, bg:'#fff'}); + const a = Math.sqrt(3)/3; /* tg x = √3/3 ≈ 0.577 */ + const x1 = Math.atan(a); /* π/6 */ + const x2 = x1 + Math.PI; /* 7π/6 */ const xAx = c.cx + c.R; const yA = c.cy - a * c.R; + /* Прямая через O и A_a, продлённая в обе стороны */ + const k = a; /* y = kx */ + const xL_start = c.cx - c.R - 12; + const xL_end = c.cx + c.R + 12; + const yL_start = c.cy + k * (c.cx - xL_start); + const yL_end = c.cy - k * (xL_end - c.cx); let s = c.open - + c.axes({xExt:c.R+40}) - + c.circle({width:2}) - + c.tgAxis() - /* Метка точки A_a на оси тангенсов */ - + '' - + 'A_a = (1; a)' - /* Линия от точки A через начало координат */ - + '' - + c.point(x1, {color:'#0d9488', label:'P_{x_1}', labelOffset:14, fontSize:10}) - + c.point(x2, {color:'#7c3aed', label:'P_{x_2}', labelOffset:14, fontSize:10}) - + 'x = arctg a + πn (одна формула!)' + /* === Заголовочная плашка === */ + + '' + + 'УРАВНЕНИЕ: tg x = a' + + 'Пример: a = √3/3 → корни π/6 и 7π/6 (одна серия!)' + /* === Оси, окружность, ось тангенсов === */ + + c.axes({xExt:c.R+50}) + + c.circle({width:2.5}) + + c.tgAxis({color:'#16a34a', ext:c.R+5}) + /* === Прямая через O и A_a === */ + + '' + /* === Точка A_a на оси тангенсов === */ + + '' + + '' + + 'A_a = (1; a)' + /* === Сектор угла π/6 === */ + + '' + + 'π/6' + /* === Точки решения === */ + + c.point(x1, {color:'#16a34a', label:'P_{π/6}', labelOffset:22, fontSize:13, labelColor:'#15803d'}) + + c.point(x2, {color:'#7c3aed', label:'P_{7π/6}', labelOffset:22, fontSize:13, labelColor:'#6d28d9'}) + /* === Формульный блок === */ + + '' + + 'ОБЩАЯ ФОРМУЛА (одна серия, период π)' + + 'x = arctg a + πn, n ∈ Z' + c.close; svgTg = s; }