Описанная около треугольника окружность проходит через все три вершины. Её центр — точка пересечения серединных перпендикуляров к сторонам, обозначается $O$. Радиус $R$.
+
Для любого треугольника существует и единственна описанная окружность.
+ Почему серединные перпендикуляры?
+ Серединный перпендикуляр к отрезку — множество точек, равноудалённых от его концов. Точка $O$ равноудалена от $A$ и $B$ (на серединном перпендикуляре к $AB$) и от $B$ и $C$ (на серединном перпендикуляре к $BC$), значит $OA = OB = OC = R$.
+
`);
+
+ /* IV1 — Описанная и вписанная окружности */
+ html += `
+
ИНТЕРАКТИВ 1
Описанная и вписанная окружности
+
Выбери тип треугольника — увидишь его описанную ($O$, синяя) и вписанную ($I$, оранжевая) окружности. Заметь, где располагается центр $O$ в каждом случае.
+
+
+
+
+
+
+
+
`;
+
+ /* IV2 — Калькулятор R и r */
+ html += `
+
ИНТЕРАКТИВ 2
Калькулятор $R$ и $r$
+
Введи три стороны треугольника $a$, $b$, $c$ — программа проверит неравенство треугольника и найдёт радиусы по формулам Герона: $S = \\sqrt{p(p-a)(p-b)(p-c)}$, $R = \\tfrac{abc}{4S}$, $r = \\tfrac{S}{p}$.
+
+ $a$ =
+
+ $b$ =
+
+ $c$ =
+
+
+
+
+
+
`;
+
+ /* IV3 — Quickfire «Внутри или снаружи?» */
+ html += `
+
ИНТЕРАКТИВ 3
Внутри или снаружи?
+
Дан треугольник — определи, где находится центр $O$ описанной окружности.
+
Задача 1 / 6Очки: 0 / 6
+
+
+
+
+
+
+
+
`;
+
+ /* IV4 — Тренажёр */
+ html += `
+
ИНТЕРАКТИВ 4
Тренажёр $R$ и $r$
+
Реши задачу и введи число (округли до 2 знаков, если получается дробное).
+
Задача 1 / 6Очки: 0 / 6
+
+
+ ответ =
+
+
+
+
+
+
`;
+
+ html += secNav(null, 'p8');
+ html += readButton('p7');
+
+ box.innerHTML = html;
+ renderMath(box);
+
+ /* IV1 — визуализатор окружностей */
+ (function(){
+ const sl = document.getElementById('p7-iv1-t');
+ const lab = document.getElementById('p7-iv1-tval');
+ const svg = document.getElementById('p7-iv1-svg');
+ const out = document.getElementById('p7-iv1-out');
+ const seen = new Set();
+ // 5 пресетов: углы A, B, C
+ const PRESETS = [
+ {name:'Равносторонний', angles:[60,60,60], kind:'in'},
+ {name:'Равнобедренный 70-70-40', angles:[70,70,40], kind:'in'},
+ {name:'Прямоугольный 30-60-90', angles:[30,60,90], kind:'hyp'},
+ {name:'Произвольный 40-60-80', angles:[40,60,80], kind:'in'},
+ {name:'Тупоугольный 30-30-120', angles:[30,30,120], kind:'out'}
+ ];
+ function draw(){
+ const idx = (+sl.value) - 1;
+ lab.textContent = (idx+1);
+ const P = PRESETS[idx];
+ const [Ad, Bd, Cd] = P.angles;
+ const aR = deg2rad(Ad), bR = deg2rad(Bd);
+ // Сторона BC = a, CA = b, AB = c (закон синусов: a/sinA = 2R)
+ // Зададим масштаб через 2R = 180 (картинка ~ 360 широкая после)
+ const twoR = 170;
+ const a = twoR * Math.sin(aR);
+ const b = twoR * Math.sin(bR);
+ const c = twoR * Math.sin(deg2rad(Cd));
+ // Положим B в (xB, yB) и C в (xB+a, yB) — горизонтально.
+ // Тогда A находится в позиции с углом B при вершине B и c — сторона BA.
+ const cx0 = 210, cy0 = 230; // центр SVG
+ const Bx = -a/2, By = 0;
+ const Cx = a/2, Cy = 0;
+ // A: длина BA = c, угол при B = B (между BA и BC), в SVG y вниз — поднимем A выше
+ const Ax = Bx + c * Math.cos(bR);
+ const Ay = By - c * Math.sin(bR);
+ // Сдвиг так, чтобы центрировать
+ const cxAll = (Ax+Bx+Cx)/3, cyAll = (Ay+By+Cy)/3;
+ const A = {x: cx0 + (Ax - cxAll), y: cy0 + (Ay - cyAll)};
+ const B = {x: cx0 + (Bx - cxAll), y: cy0 + (By - cyAll)};
+ const C = {x: cx0 + (Cx - cxAll), y: cy0 + (Cy - cyAll)};
+ // Длины сторон (в SVG пикселях)
+ function dist(P,Q){ return Math.hypot(P.x-Q.x, P.y-Q.y); }
+ const sa = dist(B,C), sb = dist(C,A), sc = dist(A,B);
+ const p = (sa+sb+sc)/2;
+ const S = Math.sqrt(Math.max(0, p*(p-sa)*(p-sb)*(p-sc)));
+ const R = (sa*sb*sc)/(4*S);
+ const r = S / p;
+ // Центр описанной (через формулы): O = пересечение серединных перпендикуляров.
+ const D = 2 * (A.x*(B.y-C.y) + B.x*(C.y-A.y) + C.x*(A.y-B.y));
+ const Ox = ((A.x*A.x+A.y*A.y)*(B.y-C.y) + (B.x*B.x+B.y*B.y)*(C.y-A.y) + (C.x*C.x+C.y*C.y)*(A.y-B.y)) / D;
+ const Oy = ((A.x*A.x+A.y*A.y)*(C.x-B.x) + (B.x*B.x+B.y*B.y)*(A.x-C.x) + (C.x*C.x+C.y*C.y)*(B.x-A.x)) / D;
+ // Инцентр: I = (sa·A + sb·B + sc·C) / (sa+sb+sc)
+ const Ix = (sa*A.x + sb*B.x + sc*C.x) / (sa+sb+sc);
+ const Iy = (sa*A.y + sb*B.y + sc*C.y) / (sa+sb+sc);
+
+ let s = '';
+ s += '';
+ // Описанная окружность
+ s += '';
+ // Вписанная окружность
+ s += '';
+ // Треугольник
+ s += '';
+ // Центры
+ s += '';
+ s += 'O';
+ s += '';
+ s += 'I';
+ // Вершины
+ s += '';
+ s += '';
+ s += '';
+ s += 'A';
+ s += 'B';
+ s += 'C';
+ // Подпись
+ s += ''+P.name+'';
+ svg.innerHTML = s;
+
+ const place = P.kind==='in' ? 'внутри треугольника' : (P.kind==='hyp' ? 'на гипотенузе' : 'снаружи треугольника');
+ out.innerHTML = 'Углы: '+Ad+'°, '+Bd+'°, '+Cd+'° · $R \\approx '+R.toFixed(1)+'$ · $r \\approx '+r.toFixed(1)+'$ Центр $O$ находится '+place+'.';
+ renderMath(out);
+ seen.add(idx);
+ if(seen.size>=4 && !seen.has('done')){ addXp(10,'p7-iv1'); bumpProgress('p7',15); seen.add('done'); }
+ }
+ sl.addEventListener('input', draw);
+ draw();
+ })();
+
+ /* IV2 — Калькулятор */
+ (function(){
+ const aI=document.getElementById('p7-iv2-a');
+ const bI=document.getElementById('p7-iv2-b');
+ const cI=document.getElementById('p7-iv2-c');
+ const go=document.getElementById('p7-iv2-go');
+ const out=document.getElementById('p7-iv2-out');
+ const fb=document.getElementById('p7-iv2-fb');
+ let solved=0;
+ function calc(){
+ const a=parseFloat(aI.value), b=parseFloat(bI.value), c=parseFloat(cI.value);
+ if(!isFinite(a)||!isFinite(b)||!isFinite(c)){ feedback(fb,false,'✗ Введи три числа.'); return; }
+ if(a<=0||b<=0||c<=0){ feedback(fb,false,'✗ Стороны должны быть положительными.'); return; }
+ if(a+b<=c||a+c<=b||b+c<=a){ feedback(fb,false,'✗ Неравенство треугольника не выполняется: сумма любых двух сторон должна быть больше третьей.'); out.innerHTML=''; return; }
+ const p=(a+b+c)/2;
+ const S=Math.sqrt(p*(p-a)*(p-b)*(p-c));
+ const R=(a*b*c)/(4*S);
+ const r=S/p;
+ out.innerHTML='$p = \\tfrac{'+a+'+'+b+'+'+c+'}{2} = '+fmt(p)+'$ '
+ + '$S = \\sqrt{'+fmt(p)+' \\cdot '+fmt(p-a)+' \\cdot '+fmt(p-b)+' \\cdot '+fmt(p-c)+'} \\approx '+S.toFixed(3)+'$ '
+ + '$R = \\dfrac{abc}{4S} = \\dfrac{'+(a*b*c)+'}{'+fmt(4*S)+'} \\approx '+R.toFixed(3)+'$ '
+ + '$r = \\dfrac{S}{p} \\approx '+r.toFixed(3)+'$';
+ renderMath(out);
+ feedback(fb,true,'✓ Готово!');
+ solved++;
+ if(solved===1){ addXp(10,'p7-iv2'); bumpProgress('p7',15); }
+ }
+ go.addEventListener('click', calc);
+ })();
+
+ /* IV3 — Quickfire */
+ (function(){
+ const Q=[
+ {t:'Остроугольный треугольник (все углы меньше 90°). Где центр $O$?', a:'in'},
+ {t:'Прямоугольный треугольник. Где центр $O$?', a:'hyp'},
+ {t:'Тупоугольный треугольник (один угол больше 90°). Где центр $O$?', a:'out'},
+ {t:'Равносторонний треугольник. Где центр $O$?', a:'in'},
+ {t:'Треугольник с углами $90°, 45°, 45°$. Где центр $O$?', a:'hyp'},
+ {t:'Треугольник с углами $30°, 30°, 120°$. Где центр $O$?', a:'out'}
+ ];
+ const qBox=document.getElementById('p7-iv3-q');
+ const iEl=document.getElementById('p7-iv3-i');
+ const sEl=document.getElementById('p7-iv3-s');
+ const fb=document.getElementById('p7-iv3-fb');
+ const btns=document.querySelectorAll('#p7-iv3 button[data-ans]');
+ let i=0, score=0, done=false;
+ function show(){
+ if(i>=Q.length){
+ qBox.innerHTML='Завершено! Очки: '+score+' / '+Q.length;
+ if(!done){ done=true; addXp(15,'p7-iv3'); bumpProgress('p7',25); if(score===Q.length) achievement('p7_done'); }
+ btns.forEach(b=>b.disabled=true);
+ return;
+ }
+ qBox.innerHTML=Q[i].t;
+ renderMath(qBox);
+ iEl.textContent=(i+1); sEl.textContent=score;
+ fb.style.display='none';
+ }
+ btns.forEach(b=>b.addEventListener('click', ()=>{
+ const ok = b.dataset.ans===Q[i].a;
+ if(ok) score++;
+ feedback(fb, ok, ok?'✓ Верно!':'✗ Правильный ответ: '+ ({in:'Внутри',hyp:'На гипотенузе',out:'Снаружи'}[Q[i].a]));
+ i++;
+ setTimeout(show, 700);
+ }));
+ show();
+ })();
+
+ /* IV4 — Тренажёр */
+ (function(){
+ const Q=[
+ {t:'В треугольнике стороны $3,4,5$. Найди $R$.', a:2.5},
+ {t:'В треугольнике стороны $3,4,5$. Найди $r$.', a:1},
+ {t:'В равностороннем треугольнике со стороной $6$ найди $R$ (округли до 2 знаков).', a:3.46},
+ {t:'В равностороннем треугольнике со стороной $6$ найди $r$ (округли до 2 знаков).', a:1.73},
+ {t:'В треугольнике стороны $5,12,13$. Найди $R$.', a:6.5},
+ {t:'В треугольнике стороны $6,8,10$. Найди $r$.', a:2}
+ ];
+ const qBox=document.getElementById('p7-iv4-q');
+ const ans=document.getElementById('p7-iv4-ans');
+ const go=document.getElementById('p7-iv4-go');
+ const reset=document.getElementById('p7-iv4-start');
+ const iEl=document.getElementById('p7-iv4-i');
+ const sEl=document.getElementById('p7-iv4-s');
+ const fb=document.getElementById('p7-iv4-fb');
+ let i=0, score=0, done=false;
+ function show(){
+ if(i>=Q.length){
+ qBox.innerHTML='Финиш! Очки: '+score+' / '+Q.length;
+ if(!done){ done=true; addXp(15,'p7-iv4'); bumpProgress('p7',25); }
+ go.disabled=true; ans.disabled=true;
+ return;
+ }
+ qBox.innerHTML=Q[i].t; renderMath(qBox);
+ iEl.textContent=(i+1); sEl.textContent=score;
+ ans.value=''; fb.style.display='none'; go.disabled=false; ans.disabled=false;
+ }
+ go.addEventListener('click', ()=>{
+ const v=parseFloat(ans.value);
+ if(!isFinite(v)){ feedback(fb,false,'✗ Введи число.'); return; }
+ const ok=Math.abs(v-Q[i].a)<0.05;
+ if(ok) score++;
+ feedback(fb, ok, ok?'✓ Верно!':'✗ Правильный ответ: $'+Q[i].a+'$');
+ i++;
+ setTimeout(show, 900);
+ });
+ reset.addEventListener('click', ()=>{ i=0; score=0; done=false; show(); });
+ show();
+ })();
+
+ wireReadBtn('p7');
+}
+
+/* ===== §8 Окружности прямоугольного треугольника ===== */
+function buildP8(){
+ const box = document.getElementById('p8-body');
+ let html = '';
+
+ html += makeCard('theory', 'Описанная окружность', '8.1', `
+
В прямоугольном треугольнике центр описанной окружности — середина гипотенузы. Радиус:
+ $$R = \\dfrac{c}{2}$$
+
где $c$ — гипотенуза. Это следствие теоремы о вписанном угле: вписанный угол, опирающийся на диаметр, равен $90°$.
+
Гипотенуза — диаметр описанной окружности!
+ Почему именно середина гипотенузы?
+ В прямоугольном треугольнике медиана к гипотенузе равна её половине. Точка $O$ — середина гипотенузы — равноудалена от трёх вершин на $c/2$, значит это центр описанной окружности.
+