fix(geom9 ch3): §10 и §11 — стороны/радиусы в реальных единицах

§10 IV1 «Теорема синусов»: убрал ремарку «(в пикселях SVG)»,
ввёл коэффициент K = 26 px/ед., теперь R ≈ 5, 2R ≈ 10 и стороны
a, b, c показываются как 4..7 ед. (а не 100..130 px).

§11 IV1 «Теорема косинусов»: было b=100, c=150 px — отображалось
$a^2 = 10000 + 22500 - 30000·cos A$ — невменяемые числа.
Стало b=4, c=6 ед., K=25 px/ед.: $a^2 = 16 + 36 - 48 cos A$.
Подписи и формула в единицах, SVG-геометрия — та же.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-29 10:59:49 +03:00
parent f3cff6ad03
commit 52824d8fc9
+22 -16
View File
@@ -628,10 +628,13 @@ function buildP10(){
svg.innerHTML=s;
const sinA=Math.sin(deg2rad(A))||1e-9;
const ratio = 2*R; // в наших экранных единицах
out.innerHTML = '$A = '+A+'°$, $B = '+B+'°$, $C = '+C+'°$<br>'
+ '$\\dfrac{a}{\\sin A} = \\dfrac{b}{\\sin B} = \\dfrac{c}{\\sin C} = 2R = '+(2*R).toFixed(0)+'$ <span style="color:var(--muted);font-size:.85rem">(в пикселях SVG)</span><br>'
+ '$a \\approx '+a.toFixed(1)+'$, $b \\approx '+b.toFixed(1)+'$, $c \\approx '+c.toFixed(1)+'$ &nbsp;·&nbsp; $a/\\sin A \\approx '+(a/sinA).toFixed(1)+'$';
// R = 130 px ↔ R = 5 ед., коэффициент K = 26 px / ед.
const K = 26;
const Ru = R / K; // = 5
const au = a / K, bu = b / K, cu = c / K;
out.innerHTML = '$A = '+A+'°$, $B = '+B+'°$, $C = '+C+'°$ &nbsp;·&nbsp; $R = '+Ru.toFixed(2)+'$<br>'
+ '$\\dfrac{a}{\\sin A} = \\dfrac{b}{\\sin B} = \\dfrac{c}{\\sin C} = 2R = '+(2*Ru).toFixed(2)+'$<br>'
+ '$a \\approx '+au.toFixed(2)+'$, $b \\approx '+bu.toFixed(2)+'$, $c \\approx '+cu.toFixed(2)+'$ &nbsp;·&nbsp; $a/\\sin A \\approx '+(au/sinA).toFixed(2)+'$';
renderMath(out);
seen.add(A+'|'+B);
if(seen.size>=4 && !seen.has('done')){ addXp(10,'p10-iv1'); bumpProgress('p10',15); seen.add('done'); }
@@ -871,14 +874,17 @@ function buildP11(){
const svg=document.getElementById('p11-iv1-svg');
const out=document.getElementById('p11-iv1-out');
const seen=new Set();
const b=100, c=150;
// Стороны зафиксированы: b = 4 ед., c = 6 ед. Масштаб K = 25 px/ед.
const bU = 4, cU = 6, K = 25;
const bPx = bU * K, cPx = cU * K;
function draw(){
const A=+sA.value; lA.textContent=A;
// A_v в позиции (90, 240), B_v = A_v + (c, 0) = (240, 240). C_v под углом A от A_v на расстояние b.
// A_v — вершина с углом A (низ-лево), B_v — на расстоянии c (низ-право), C_v под углом A от A_v на расстояние b.
const Av={x:90, y:240};
const Bv={x:Av.x+c, y:Av.y};
const Cv={x:Av.x+b*Math.cos(deg2rad(A)), y:Av.y-b*Math.sin(deg2rad(A))};
const a=Math.hypot(Bv.x-Cv.x, Bv.y-Cv.y);
const Bv={x:Av.x+cPx, y:Av.y};
const Cv={x:Av.x+bPx*Math.cos(deg2rad(A)), y:Av.y-bPx*Math.sin(deg2rad(A))};
const aPx=Math.hypot(Bv.x-Cv.x, Bv.y-Cv.y);
const aU=aPx/K;
let s='';
s += '<rect x="0" y="0" width="400" height="320" fill="none"/>';
// треугольник
@@ -890,13 +896,13 @@ function buildP11(){
if(Math.abs(A-90)<0.5){
s += '<polyline points="'+rightAngleMark(Av, uAB, uAC, 14)+'" fill="none" stroke="#dc2626" stroke-width="2"/>';
}
// подписи сторон
// подписи сторон в единицах
const midAB={x:(Av.x+Bv.x)/2, y:(Av.y+Bv.y)/2};
const midAC={x:(Av.x+Cv.x)/2, y:(Av.y+Cv.y)/2};
const midBC={x:(Bv.x+Cv.x)/2, y:(Bv.y+Cv.y)/2};
s += '<text x="'+midAB.x.toFixed(2)+'" y="'+(midAB.y+18).toFixed(2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#5b21b6">c = '+c+'</text>';
s += '<text x="'+(midAC.x-18).toFixed(2)+'" y="'+midAC.y.toFixed(2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#5b21b6">b = '+b+'</text>';
s += '<text x="'+(midBC.x+14).toFixed(2)+'" y="'+midBC.y.toFixed(2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#dc2626">a = '+a.toFixed(1)+'</text>';
s += '<text x="'+midAB.x.toFixed(2)+'" y="'+(midAB.y+18).toFixed(2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#5b21b6">c = '+cU+'</text>';
s += '<text x="'+(midAC.x-18).toFixed(2)+'" y="'+midAC.y.toFixed(2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#5b21b6">b = '+bU+'</text>';
s += '<text x="'+(midBC.x+14).toFixed(2)+'" y="'+midBC.y.toFixed(2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#dc2626">a '+aU.toFixed(2)+'</text>';
// подпись угла A
s += '<text x="'+(Av.x+34).toFixed(2)+'" y="'+(Av.y-10).toFixed(2)+'" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#dc2626">A = '+A+'°</text>';
// вершины
@@ -908,9 +914,9 @@ function buildP11(){
svg.innerHTML=s;
const cosA=Math.cos(deg2rad(A));
const a2 = b*b + c*c - 2*b*c*cosA;
let info = '$a^2 = b^2 + c^2 - 2bc \\cos A = '+(b*b)+' + '+(c*c)+' - '+(2*b*c)+' \\cdot \\cos '+A+'° \\approx '+a2.toFixed(1)+'$<br>'
+ '$a \\approx '+Math.sqrt(a2).toFixed(2)+'$';
const a2u = bU*bU + cU*cU - 2*bU*cU*cosA;
let info = '$a^2 = b^2 + c^2 - 2bc \\cos A = '+(bU*bU)+' + '+(cU*cU)+' - '+(2*bU*cU)+' \\cdot \\cos '+A+'° \\approx '+a2u.toFixed(2)+'$<br>'
+ '$a \\approx '+Math.sqrt(Math.max(0,a2u)).toFixed(2)+'$';
if(Math.abs(A-90)<0.5) info += '<br><b style="color:#dc2626">&#10003; Прямой угол — это теорема Пифагора!</b>';
out.innerHTML=info;
renderMath(out);