diff --git a/frontend/textbooks/geometry_7_ch4.html b/frontend/textbooks/geometry_7_ch4.html index 196cf4a..5caf990 100644 --- a/frontend/textbooks/geometry_7_ch4.html +++ b/frontend/textbooks/geometry_7_ch4.html @@ -769,17 +769,19 @@ function buildP21(){ let svg21=''; if(G){ - const b=G.svgBox(280,180,{id:'p21-tri',cell:20}); - /* Сделаем треугольник со сторонами разной длины */ - const A={x:30,y:150}, B={x:250,y:150}, C={x:90,y:30}; + const b=G.svgBox(300,180,{id:'p21-tri',cell:20}); + /* Скалянный треугольник: AB ≈ 240 (самая длинная), BC ≈ 184, AC ≈ 170 (самая короткая) + Тогда ∠C — самый большой (напротив AB), ∠B — самый маленький (напротив AC) */ + const A={x:30,y:160}, B={x:270,y:160}, C={x:140,y:30}; svg21 = b.open + G.polygon([A,B,C],{color:'#0891b2',fill:'rgba(8,145,178,.08)'}) - + G.segment(A,B,{color:'#dc2626',width:2.5,label:'c (длинная)',labelOffset:18}) - + G.segment(A,C,{color:'#059669',width:2.5,label:'b',labelOffset:-16}) - + G.segment(B,C,{color:'#7c3aed',width:2.5,label:'a',labelOffset:-16}) - + G.angle(B,A,C,{color:'#dc2626',r:24,label:'∠B (бол.)',fontSize:11,labelOffset:14}) - + G.angle(A,B,C,{color:'#7c3aed',r:24,label:'∠A',fontSize:11,labelOffset:12}) - + G.angle(C,A,B,{color:'#059669',r:22,label:'∠C',fontSize:11,labelOffset:11}) + /* Цветовая кодировка: красный = самый большой, оранж. = средний, зелёный = самый маленький */ + + G.segment(A,B,{color:'#dc2626',width:3,label:'c — самая длин.',labelOffset:18,labelColor:'#dc2626'}) + + G.segment(B,C,{color:'#f59e0b',width:2.5,label:'a',labelOffset:-16,labelColor:'#f59e0b'}) + + G.segment(A,C,{color:'#059669',width:2,label:'b — самая корот.',labelOffset:-16,labelColor:'#059669'}) + + G.angle(C,A,B,{color:'#dc2626',r:28,label:'∠C — наиб.',fontSize:11,labelOffset:14}) + + G.angle(A,B,C,{color:'#f59e0b',r:22,label:'∠A',fontSize:11,labelOffset:12}) + + G.angle(B,A,C,{color:'#059669',r:18,label:'∠B — наим.',fontSize:11,labelOffset:12}) + G.point(A.x,A.y,'A',{color:'#1e293b',dx:-14,dy:12}) + G.point(B.x,B.y,'B',{color:'#1e293b',dx:8,dy:12}) + G.point(C.x,C.y,'C',{color:'#1e293b',dx:-4,dy:-8}) @@ -789,8 +791,9 @@ function buildP21(){ html += makeCard('rule', 'Прямое свойство', '21.1', `
Теорема. В треугольнике против бо́льшей стороны лежит бо́льший угол.
На рисунке: $AB > AC > BC$ $\\Rightarrow$ $\\angle C > \\angle B > \\angle A$.
-Правило большого пальца. Самая длинная сторона смотрит на самый большой угол.
`); +На рисунке: $AB > BC > AC$ (стороны $c > a > b$) $\\Rightarrow$ $\\angle C > \\angle A > \\angle B$.
+Цвет = размер. Красным выделены самая длинная сторона и самый большой угол напротив неё. Зелёным — самая короткая и самый маленький.
+Правило большого пальца. Самая длинная сторона «смотрит» на самый большой угол.
`); html += makeCard('rule', 'Обратное свойство', '21.2', `Теорема (обратная). Против бо́льшего угла лежит бо́льшая сторона.
@@ -881,29 +884,50 @@ function buildP22(){ let svgOK='', svgBAD=''; if(G){ - /* Валидный треугольник со сторонами 5, 6, 7 */ - const b1=G.svgBox(220,150,{id:'p22-ok',cell:20}); - const A={x:30,y:120}, B={x:180,y:120}, C={x:100,y:40}; + /* === Валидный треугольник 4, 5, 6 === + Масштаб: 1 ед = 25 px. AB = 6 ед = 150 px (база) + Решая систему AC=5*25=125, BC=4*25=100 от A={20,130}, B={170,130}: + C ≈ {114, 47} */ + const b1=G.svgBox(220,160,{id:'p22-ok',cell:20}); + const A={x:20,y:130}, B={x:170,y:130}, C={x:114,y:47}; svgOK = b1.open - + G.polygon([A,B,C],{color:'#059669',fill:'rgba(16,185,129,.10)'}) - + G.segment(A,B,{color:'#059669',width:2,label:'7',labelOffset:14}) - + G.segment(A,C,{color:'#059669',width:2,label:'5',labelOffset:-14}) - + G.segment(B,C,{color:'#059669',width:2,label:'6',labelOffset:-14}) - + 'Для прямоугольных треугольников дополнительно к 3 признакам обычных треугольников действуют упрощённые формулировки.
+Для прямоугольных треугольников дополнительно к 3 признакам обычных треугольников действуют упрощённые формулировки. Цвет = выделенный элемент.
+Признак 1. По двум катетам. Если 2 катета одного $\\triangle$ равны 2 катетам другого — треугольники равны. (По 1-му признаку обычных $\\triangle$: 2 стороны + угол $90°$ между ними.)
Признак 2. По катету и прилежащему острому углу. Если катет и прилежащий к нему острый угол одного $\\triangle$ равны катету и прилежащему углу другого — треугольники равны.
Признак 3. По гипотенузе и острому углу. Если гипотенуза и острый угол одного $\\triangle$ равны гипотенузе и острому углу другого — треугольники равны.
@@ -1188,37 +1258,61 @@ function buildP25(){ let svgBis=''; if(G){ - const b=G.svgBox(280,180,{id:'p25-bis',cell:20}); - const O={x:60,y:140}; - const A={x:240,y:60}; /* верхняя сторона */ - const B={x:260,y:160}; /* нижняя сторона */ - /* Биссектриса — между A и B */ - const Bs={x:260,y:108}; + /* Чистый рисунок: вершина угла O слева, биссектриса вправо вдоль оси x. + Угол ∠AOB = 50° (по 25° от биссектрисы вверх и вниз). */ + const b=G.svgBox(300,200,{id:'p25-bis',cell:20}); + const O={x:40,y:100}; + const ang=25*Math.PI/180; /* половина угла */ + const len=220; + /* OA — верхняя сторона: направление (cos(-25°), sin(-25°)) */ + const Aend={x:O.x+len*Math.cos(-ang), y:O.y+len*Math.sin(-ang)}; + /* OB — нижняя сторона */ + const Bend={x:O.x+len*Math.cos(ang), y:O.y+len*Math.sin(ang)}; + /* Биссектриса — горизонталь от O */ + const Bs={x:O.x+len,y:O.y}; /* Точка K на биссектрисе */ - const K={x:160,y:110}; - /* Перпендикуляры из K к сторонам */ - /* Сторона OA: вектор */ + const K={x:O.x+150,y:O.y}; + /* F1, F2 — основания перпендикуляров из K на OA и OB */ function foot(P, P1, P2){ const v={x:P2.x-P1.x, y:P2.y-P1.y}; const w={x:P.x-P1.x, y:P.y-P1.y}; const t=(v.x*w.x+v.y*w.y)/(v.x*v.x+v.y*v.y); return {x:P1.x+t*v.x, y:P1.y+t*v.y}; } - const F1=foot(K,O,A); - const F2=foot(K,O,B); + const F1=foot(K,O,Aend); + const F2=foot(K,O,Bend); svgBis = b.open - + G.segment(O,A,{color:'#7c3aed',width:2.5}) - + G.segment(O,B,{color:'#7c3aed',width:2.5}) - + G.segment(O,Bs,{color:'#dc2626',width:2,dash:'5 3'}) - + G.segment(K,F1,{color:'#0891b2',width:1.5,dash:'3 2'}) - + G.segment(K,F2,{color:'#0891b2',width:1.5,dash:'3 2'}) - + G.rightAngleMark(F1,K,O,{color:'#0891b2',size:8}) - + G.rightAngleMark(F2,K,O,{color:'#0891b2',size:8}) - + G.point(O.x,O.y,'O',{color:'#1e293b',dx:-12,dy:14}) - + G.point(K.x,K.y,'K',{color:'#dc2626',dx:6,dy:-6,r:3.5}) - + G.point(F1.x,F1.y,'',{r:2.5,color:'#0891b2'}) - + G.point(F2.x,F2.y,'',{r:2.5,color:'#0891b2'}) - + '