From 31b40b0e9926f5aa47fa325499d6f5a26b86bc58 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 08:18:40 +0300 Subject: [PATCH] =?UTF-8?q?fix(geom7):=20=D0=BA=D0=BE=D1=80=D0=BD=D0=B5?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20=D0=B1=D0=B0=D0=B3=20G.angle=20(=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BA=D0=B8=20=E2=88=A01=3D=E2=88=A02=20=D1=81?= =?UTF-8?q?=D0=B0=D0=B4=D0=B8=D0=BB=D0=B8=D1=81=D1=8C=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D1=83=20=D1=82=D0=BE=D1=87=D0=BA=D1=83)=20+=202=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20SVG=20=D0=B2=20=C2=A75?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Корневая причина проблемы с наложенными метками углов в §6: В G.angle формула центра метки была: midA = (a1 + a2) / 2 + (|delta| > π ? π : 0) При a1≈-153° и a2≈+153° (как у ∠2 в §6) среднее даёт 0° — ровно туда же, куда ставится метка ∠1 (a1≈+25°, a2≈-25°, тоже среднее = 0°). Результат: обе метки в одной точке. Правильная формула — идти от a1 на половину delta в направлении sweep: midA = a1 + delta / 2 Это автоматически разносит метки противоположных секторов в противоположные стороны. ∠1 уходит вправо, ∠2 — влево. Также добавил 2 новых SVG в §5: 1. Карточка 5.1 «Что такое угол» — теперь содержит три варианта обозначения одного и того же угла: ∠BAC (полное), ∠A (короткое), α (греческая буква). Каждый — отдельный SVG с подсветкой угла жёлтым сектором, общая подпись внизу. 2. Карточка 5.4 «Биссектриса» — наглядный SVG: ∠BAC = 70°, биссектриса AD (пунктирная красная) делит его на две равные половинки по 35°. Полупрозрачная заливка зелёным/фиолетовым для каждой половины, дуги с одинаковыми штрихами как маркер равных углов. Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/js/geom7_svg.js | 4 +- frontend/textbooks/geometry_7_ch1.html | 82 +++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/frontend/js/geom7_svg.js b/frontend/js/geom7_svg.js index 1afcbc2..8b812c2 100644 --- a/frontend/js/geom7_svg.js +++ b/frontend/js/geom7_svg.js @@ -155,8 +155,8 @@ G.angle = function(V, A, B, opts){ const color = opts.color || '#dc2626'; let s = ''; if(opts.label){ - /* Центр подписи — середина биссектрисы */ - const midA = (a1 + a2) / 2 + (Math.abs(delta) > Math.PI ? Math.PI : 0); + /* Центр подписи — середина ДУГИ, в направлении sweep */ + const midA = a1 + delta / 2; const lr = r + (opts.labelOffset || 12); const lx = V.x + lr * Math.cos(midA); const ly = V.y + lr * Math.sin(midA); diff --git a/frontend/textbooks/geometry_7_ch1.html b/frontend/textbooks/geometry_7_ch1.html index dfaa864..329b572 100644 --- a/frontend/textbooks/geometry_7_ch1.html +++ b/frontend/textbooks/geometry_7_ch1.html @@ -1018,11 +1018,52 @@ function buildP5(){ + '
'+angleViz(180,'#7c3aed','Развёрн.')+'
' + ''; + /* SVG: обозначение одного угла 3 разными способами */ + let svgNotation=''; + if(G){ + function notationVariant(label, mode){ + const b=G.svgBox(180,160,{id:'p5-not-'+mode,cell:20}); + const V={x:40,y:130}, A={x:160,y:130}; + const B={x:V.x+115*Math.cos(Math.PI/3.5), y:V.y-115*Math.sin(Math.PI/3.5)}; + let s=b.open; + /* Заливка-сектор */ + const a1=0, a2=-Math.PI/3.5, wR=32; + const x1=V.x+wR, y1=V.y; + const x2=V.x+wR*Math.cos(a2), y2=V.y+wR*Math.sin(a2); + s += ''; + s += G.segment(V,A,{color:'#0891b2',width:2.6}); + s += G.segment(V,B,{color:'#0891b2',width:2.6}); + s += G.angle(V,A,B,{color:'#dc2626',r:22,width:2,label:label,fontSize:14,labelOffset:14}); + s += G.point(V.x,V.y,'',{r:4,color:'#0891b2'}); + /* Подписи вершин по краям */ + if(mode==='full'){ + s += 'A'; + s += 'B'; + s += 'C'; + s += '∠BAC'; + } else if(mode==='short'){ + s += 'A'; + s += '∠A'; + } else { + s += 'α (альфа)'; + } + s += b.close; + return s; + } + svgNotation = '
' + + '
'+notationVariant('∠BAC','full')+'
' + + '
'+notationVariant('∠A','short')+'
' + + '
'+notationVariant('α','greek')+'
' + + '
'; + } + html += makeCard('theory', 'Что такое угол', '5.1', `

Если из точки провести два луча, получится угол.

Эти лучи называются сторонами угла, а их общая точка — вершиной.

Обозначение тремя буквами: $\\angle BAC$ — вершина $A$ записывается посередине. Если по рисунку понятно, какой угол — обозначают одной буквой: $\\angle A$.

-

Часто углы обозначают малыми греческими буквами: $\\alpha, \\beta, \\gamma, \\varphi$.

`); +

Часто углы обозначают малыми греческими буквами: $\\alpha, \\beta, \\gamma, \\varphi$.

+

Один и тот же угол можно обозначить тремя способами:

+ `+svgNotation+``); html += makeCard('rule', 'Измерение углов. Градус', '5.2', `

Углы измеряют в градусах. Развёрнутый угол (стороны на одной прямой) равен $180°$.

@@ -1042,9 +1083,46 @@ function buildP5(){
`+svgAngles+`
`); + /* SVG: биссектриса угла — наглядно две равные половинки */ + let svgBisector=''; + if(G){ + const b=G.svgBox(280,180,{id:'p5-bis',cell:20}); + const V={x:60,y:140}; + const A={x:240,y:140}; + const fullAngle=Math.PI/3; /* 60° сверху от горизонтали */ + const halfAngle=fullAngle/2; + const B={x:V.x+170*Math.cos(fullAngle), y:V.y-170*Math.sin(fullAngle)}; + const D={x:V.x+150*Math.cos(halfAngle), y:V.y-150*Math.sin(halfAngle)}; + /* Две залитые половинки разными цветами */ + function wedgePath(a1,a2,r,fill){ + const x1=V.x+r*Math.cos(a1), y1=V.y-r*Math.sin(a1); + const x2=V.x+r*Math.cos(a2), y2=V.y-r*Math.sin(a2); + return ''; + } + svgBisector = b.open + + wedgePath(0, halfAngle, 42, '#10b981') /* нижняя половинка ∠DAC */ + + wedgePath(halfAngle, fullAngle, 42, '#7c3aed') /* верхняя половинка ∠BAD */ + + G.segment(V,A,{color:'#0891b2',width:2.6}) + + G.segment(V,B,{color:'#0891b2',width:2.6}) + + G.segment(V,D,{color:'#dc2626',width:2.5,dash:'5 3'}) + /* Дуги равных половинок (одинаковое число штрихов = равные углы) */ + + '' + + '' + + '35°' + + '35°' + + G.point(V.x,V.y,'',{r:4,color:'#0891b2'}) + + 'A' + + 'B' + + 'C' + + 'D' + + 'AD — биссектриса ∠BAC = 70°' + + b.close; + } + html += makeCard('rule', 'Биссектриса угла', '5.4', `

Биссектрисой угла называется луч, исходящий из его вершины и делящий угол на два равных угла.

-

Если $\\angle BAC = 70°$, а $AD$ — биссектриса, то $\\angle BAD = \\angle DAC = 35°$.

`); +

Если $\\angle BAC = 70°$, а $AD$ — биссектриса, то $\\angle BAD = \\angle DAC = 35°$.

+
`+svgBisector+`
`); html += '
' +'
ИНТЕРАКТИВ 1
Какой угол?
'