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;
}