From 0bcb9e5f2e35e0490deff8de5a910ce37852fc94 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Thu, 28 May 2026 18:00:32 +0300 Subject: [PATCH] =?UTF-8?q?fix(geom8=20ch4):=20=C2=A73=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20T=E2=82=81/T?= =?UTF-8?q?=E2=82=82/AT=20=D1=83=D1=85=D0=BE=D0=B4=D1=8F=D1=82=20=D1=81=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=81=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D1=85,=20=C2=A72.1=20=E2=80=94=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20cx/cy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §3 Интерактив 1 'Две касательные из внешней точки': подписи T₁ и T₂ теперь располагаются по радиальному направлению (наружу от центра) с большим отступом, не лежат на касательной линии. Подписи длин AT₁ и AT₂ вынесены ПЕРПЕНДИКУЛЯРНО касательным наружу (через вычисление нормали к каждой касательной). Все подписи теперь крупнее (font 13, Unbounded для вершин, JetBrains Mono для длин) и читаются без наложения на линии. §3 Интерактив 2 'Доказательство касательных по шагам': те же фиксы плюс расширен viewBox 260×200 → 280×220 для размещения подписей. §2 Card 2.1: убран лишний атрибут cx='100' cy='95' на элементе радиуса (line не имеет атрибутов cx/cy — игнорировалось браузером, но загромождало код). Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/textbooks/geometry_8_ch4.html | 42 ++++++++++++++++++-------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/frontend/textbooks/geometry_8_ch4.html b/frontend/textbooks/geometry_8_ch4.html index 9b1d8a2..651240e 100644 --- a/frontend/textbooks/geometry_8_ch4.html +++ b/frontend/textbooks/geometry_8_ch4.html @@ -867,7 +867,7 @@ function buildP2(){
- + @@ -1379,6 +1379,20 @@ function buildP3(){ const ur2x=(T2x-cx)/R, ur2y=(T2y-cy)/R; const ut2x=-(ur2y), ut2y=ur2x; const rm2=`${(T2x+ur2x*s).toFixed(1)},${(T2y+ur2y*s).toFixed(1)} ${(T2x+ur2x*s+ut2x*s).toFixed(1)},${(T2y+ur2y*s+ut2y*s).toFixed(1)} ${(T2x+ut2x*s).toFixed(1)},${(T2y+ut2y*s).toFixed(1)}`; + /* Position T₁ label OUTSIDE circle, above-left of T₁ (away from upper tangent) */ + const T1lx=(T1x-cx)/R, T1ly=(T1y-cy)/R; /* outward unit */ + const T1labelX=T1x+T1lx*14-6, T1labelY=T1y+T1ly*14+3; + const T2labelX=T2x+(T2x-cx)/R*14-6, T2labelY=T2y+(T2y-cy)/R*14+10; + /* Length labels OFF the tangent line (perpendicular offset to outer side) */ + const m1x=(T1x+Ax)/2, m1y=(T1y+Ay)/2; + const t1dx=Ax-T1x, t1dy=Ay-T1y, t1len=Math.hypot(t1dx,t1dy); + /* Perpendicular outward (upper) */ + const n1x=-t1dy/t1len, n1y=t1dx/t1len; /* CCW perpendicular */ + const len1lx=m1x+n1x*-14-10, len1ly=m1y+n1y*-14; + const m2x=(T2x+Ax)/2, m2y=(T2y+Ay)/2; + const t2dx=Ax-T2x, t2dy=Ay-T2y, t2len=Math.hypot(t2dx,t2dy); + const n2x=-t2dy/t2len, n2y=t2dx/t2len; + const len2lx=m2x+n2x*14-10, len2ly=m2y+n2y*14+6; const svg=` @@ -1392,12 +1406,12 @@ function buildP3(){ - T₁ - T₂ - O - A - ${fmt(AT)} - ${fmt(AT)} + T₁ + T₂ + O + A + AT₁=${fmt(AT)} + AT₂=${fmt(AT)} `; svgWrap.innerHTML=svg; info.textContent='AT₁ = AT₂ = '+fmt(AT)+' (при R = '+R+', |OA| = '+OA+')'; @@ -1451,7 +1465,11 @@ function buildP3(){ equal+=``; } const mainColor=ph==='done'?'#10b981':'#0284c7'; - const svg=` + const T1lx=(T1x-cx)/R, T1ly=(T1y-cy)/R; + const T1labelX=T1x+T1lx*16-7, T1labelY=T1y+T1ly*16+4; + const T2lx=(T2x-cx)/R, T2ly=(T2y-cy)/R; + const T2labelX=T2x+T2lx*16-7, T2labelY=T2y+T2ly*16+10; + const svg=` ${tri1}${tri2} @@ -1464,10 +1482,10 @@ function buildP3(){ - O - T₁ - T₂ - A + O + T₁ + T₂ + A `; svgEl.innerHTML=svg; txtEl.innerHTML=steps.find(s=>s.phase===ph).text;