fix(geom8 ch3): аудит §1, §3, §5, §6, §7 — корректная геометрия SVG

§1 Доказательство Фалеса: точки пересечения трёх параллельных секущих
со второй стороной угла были заданы фиксированно (y=65/92/119), но
по геометрии должны вычисляться из наклона второй стороны
(slope=-80/230). Пересчитано во всех 5 шагах + добавлены метки точек,
штрихи равенства параллельных отрезков, корректные подписи A'/B'/C'.
Step 5: вертикальные линии заменены на отрезки между двумя секущими.

§3 Card 3.1: треугольник A'B'C' не был подобен ABC (отношения
сторон 1.59 vs 2.06). Пересчитан как точное масштабирование ABC
с коэффициентом k=2 относительно якоря B. Также фикс баги
'a/a*k/k' (всегда =1) в подписи коэффициента.

§5 Card 5.1: малый треугольник не подобен большому (отношения
1.71/2.03/1.88). Пересчитан с k=2 от якоря B.
Босс задача 1: тоже не подобен — исправлен на k=3.
Step 1 доказательства: тоже исправлен на k=5/3.

§6 Card 6.1: треугольники имели разные углы ∠A (68.6° vs 50.8°)
и непропорциональные стороны. Пересчитано с равными углами в A
и пропорцией k=2.
Босс задача 1: viewBox расширен, координаты исправлены на k=1.5.
Step 1: исправлено на k=2.

§7 Card 7.1: стороны не пропорциональны (2.68/1.68/1.80).
Пересчитано с k=2.5 от якоря B.
Step 1: исправлено на k=2.

Интерактивные слайдеры (§3 k, §5 α/β/k, §6 SAS, §7 SSS) — проверены,
они корректно вычисляют координаты по слайдерам.

Всего: 18 статичных + 5 интерактивных SVG проверено, 12 исправлено.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-28 14:55:00 +03:00
parent e0e3280404
commit f9f6a04c88
+142 -90
View File
@@ -659,38 +659,57 @@ function buildP1(){
const steps=[
{desc:'<b>Шаг 1.</b> Даны два луча из вершины O и три параллельные прямые, пересекающие их в точках A, B, C и A\', B\', C\'.',
svg:()=>{
// Ray 1: horizontal from O=(20,140) to (250,140)
// Ray 2: from O=(20,140) to (250,60), slope = (60-140)/(250-20) = -80/230
// Parallel transversals at x=70,150,230 (vertical)
// Intersection with ray 2: y = 140 + (x-20)*(-80/230)
// x=70: y = 140 - 50*80/230 ≈ 123
// x=150: y = 140 - 130*80/230 ≈ 95
// x=230: y = 140 - 210*80/230 ≈ 67
const W=260,H=160,Ox=20,Oy=140;
let s=`<svg viewBox="0 0 ${W} ${H}" style="max-width:${W}px;width:100%;background:#fafafa;border:1px solid var(--border);border-radius:10px">`;
s+=`<line x1="${Ox}" y1="${Oy}" x2="250" y2="${Oy}" stroke="#7c3aed" stroke-width="2"/>`;
s+=`<line x1="${Ox}" y1="${Oy}" x2="250" y2="60" stroke="#7c3aed" stroke-width="2"/>`;
[[70,140,70,65],[150,140,150,92],[230,140,230,119]].forEach(([x1,y1,x2,y2])=>{
// parallels: connect point on ray1 to correctly computed point on ray2
[[70,140,70,123],[150,140,150,95],[230,140,230,67]].forEach(([x1,y1,x2,y2])=>{
s+=`<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="#a78bfa" stroke-width="1.5" stroke-dasharray="4,3"/>`;
});
s+=`<text x="${Ox-4}" y="${Oy+4}" font-size="10" fill="#6d28d9" font-weight="700">O</text>`;
['A','B','C'].forEach((l,i)=>s+=`<text x="${70+i*80}" y="${Oy+14}" text-anchor="middle" font-size="10" fill="#6d28d9" font-weight="700">${l}</text>`);
['A\'','B\'','C\''].forEach((l,i)=>s+=`<text x="${70+i*80+4}" y="${[62,89,116][i]-4}" font-size="10" fill="#6d28d9" font-weight="700">${l}</text>`);
['A\'','B\'','C\''].forEach((l,i)=>s+=`<text x="${70+i*80+4}" y="${[119,91,63][i]-4}" font-size="10" fill="#6d28d9" font-weight="700">${l}</text>`);
s+='</svg>';return s;}},
{desc:'<b>Шаг 2.</b> Через точки A, B, C проводим прямые, параллельные второму лучу. Получаем параллелограммы.',
svg:()=>{
// Same geometry as step 1. Corrected y values on ray 2.
// Ray 2 direction vector: (230,-80). Auxiliary lines from A,B parallel to ray 2:
// From A=(70,140) in dir (230,-80) scaled: Δx=80 → Δy=-80*80/230≈-28 → meets x=150 at y≈112
// From B=(150,140) in dir (230,-80): meets x=230 at y≈112
const W=260,H=160,Ox=20,Oy=140;
let s=`<svg viewBox="0 0 ${W} ${H}" style="max-width:${W}px;width:100%;background:#fafafa;border:1px solid var(--border);border-radius:10px">`;
s+=`<line x1="${Ox}" y1="${Oy}" x2="250" y2="${Oy}" stroke="#7c3aed" stroke-width="2"/>`;
s+=`<line x1="${Ox}" y1="${Oy}" x2="250" y2="60" stroke="#7c3aed" stroke-width="2"/>`;
[[70,140,70,65],[150,140,150,92],[230,140,230,119]].forEach(([x1,y1,x2,y2])=>{
[[70,140,70,123],[150,140,150,95],[230,140,230,67]].forEach(([x1,y1,x2,y2])=>{
s+=`<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="#a78bfa" stroke-width="1.5" stroke-dasharray="4,3"/>`;
});
// вспомогательные параллельные линии через A, B
s+=`<line x1="70" y1="140" x2="150" y2="92" stroke="#f59e0b" stroke-width="1.5" stroke-dasharray="3,3"/>`;
s+=`<line x1="150" y1="140" x2="230" y2="119" stroke="#f59e0b" stroke-width="1.5" stroke-dasharray="3,3"/>`;
s+=`<text x="100" y="128" font-size="9" fill="#b45309" font-weight="700">параллелограмм</text>`;
// auxiliary lines from A and B parallel to ray 2 (direction (230,-80))
s+=`<line x1="70" y1="140" x2="150" y2="112" stroke="#f59e0b" stroke-width="1.5" stroke-dasharray="3,3"/>`;
s+=`<line x1="150" y1="140" x2="230" y2="112" stroke="#f59e0b" stroke-width="1.5" stroke-dasharray="3,3"/>`;
s+=`<text x="100" y="131" font-size="9" fill="#b45309" font-weight="700">параллелограмм</text>`;
s+='</svg>';return s;}},
{desc:'<b>Шаг 3.</b> В параллелограмме противоположные стороны равны: $A_1B_1 = AB_2 = AB$, поэтому параллельная прямая откладывает равные отрезки на обоих лучах (если исходные части равны).',
svg:()=>{
// Parallelogram: A=(70,140), B=(150,140) on ray1; A'=(70,123), aux=(150,112) from auxiliary line
// This forms parallelogram A-B-aux-A' with A'B' (on ray2) as the top side
const W=260,H=160;
let s=`<svg viewBox="0 0 ${W} ${H}" style="max-width:${W}px;width:100%;background:#fafafa;border:1px solid var(--border);border-radius:10px">`;
s+=`<polygon points="70,140 150,140 150,92 70,65" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="1.5"/>`;
s+=`<text x="110" y="108" text-anchor="middle" font-size="10" fill="#6d28d9" font-weight="700">Параллелограмм</text>`;
s+=`<text x="110" y="120" text-anchor="middle" font-size="9" fill="#6d28d9">AB = A'B'</text>`;
s+=`<polygon points="70,140 150,140 150,112 70,123" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="1.5"/>`;
// tick marks on parallel sides AB and A'B'' to show equality
s+=`<line x1="107" y1="140" x2="110" y2="134" stroke="#7c3aed" stroke-width="1.5"/>`;
s+=`<line x1="113" y1="140" x2="116" y2="134" stroke="#7c3aed" stroke-width="1.5"/>`;
s+=`<line x1="107" y1="118" x2="110" y2="112" stroke="#7c3aed" stroke-width="1.5"/>`;
s+=`<line x1="113" y1="118" x2="116" y2="112" stroke="#7c3aed" stroke-width="1.5"/>`;
s+=`<text x="110" y="110" text-anchor="middle" font-size="10" fill="#6d28d9" font-weight="700">Параллелограмм</text>`;
s+=`<text x="110" y="150" text-anchor="middle" font-size="9" fill="#6d28d9">AB = A\'B\' (пр. стор.)</text>`;
s+='</svg>';return s;}},
{desc:'<b>Шаг 4.</b> Если параллельные прямые делят луч на <em>равные</em> части, то и второй луч делится на равные части. Это и есть теорема Фалеса в классической форме.',
svg:()=>{
@@ -698,23 +717,46 @@ function buildP1(){
let s=`<svg viewBox="0 0 ${W} ${H}" style="max-width:${W}px;width:100%;background:#fafafa;border:1px solid var(--border);border-radius:10px">`;
s+=`<line x1="${Ox}" y1="${Oy}" x2="250" y2="${Oy}" stroke="#7c3aed" stroke-width="2"/>`;
s+=`<line x1="${Ox}" y1="${Oy}" x2="250" y2="60" stroke="#7c3aed" stroke-width="2"/>`;
[[70,140,70,65],[150,140,150,92],[230,140,230,119]].forEach(([x1,y1,x2,y2])=>{
// corrected y values on ray2: y=140+(x-20)*(-80/230)
[[70,140,70,123],[150,140,150,95],[230,140,230,67]].forEach(([x1,y1,x2,y2])=>{
s+=`<line x1="${x1}" y1="${y1}" x2="${x2}" y2="${y2}" stroke="#a78bfa" stroke-width="1.5"/>`;
});
// равные отрезки
s+=`<text x="110" y="${Oy+14}" text-anchor="middle" font-size="10" fill="#10b981" font-weight="700">равно</text>`;
s+=`<text x="190" y="${Oy+14}" text-anchor="middle" font-size="10" fill="#10b981" font-weight="700">равно</text>`;
// равные отрезки — tick marks on ray1 segments
[[110,140],[190,140]].forEach(([x,y])=>{
s+=`<line x1="${x-4}" y1="${y-5}" x2="${x}" y2="${y+5}" stroke="#10b981" stroke-width="1.5"/>`;
});
// tick marks on ray2 segments
[[110,109],[190,81]].forEach(([x,y])=>{
s+=`<line x1="${x-4}" y1="${y-5}" x2="${x}" y2="${y+5}" stroke="#10b981" stroke-width="1.5"/>`;
});
s+=`<text x="110" y="${Oy+14}" text-anchor="middle" font-size="9" fill="#10b981" font-weight="700">AB=AB</text>`;
s+=`<text x="190" y="${Oy+14}" text-anchor="middle" font-size="9" fill="#10b981" font-weight="700">BC=BC</text>`;
s+='</svg>';return s;}},
{desc:'<b>Шаг 5.</b> Обобщённая теорема Фалеса: при <em>произвольных</em> параллельных прямых (не обязательно с равными частями) отрезки на двух лучах всё равно пропорциональны: $\\dfrac{AB}{BC}=\\dfrac{A\'B\'}{B\'C\'}$. <b>Доказано.</b>',
svg:()=>{
// Ray1: O=(20,140) horizontal to (250,140)
// Ray2: O=(20,140) to (250,50), slope=-90/230
// 2 parallel verticals at x=80 and x=170
// Ray2 intersections: x=80 → y=140-60*90/230≈117; x=170 → y=140-150*90/230≈81
const W=260,H=160;
let s=`<svg viewBox="0 0 ${W} ${H}" style="max-width:${W}px;width:100%;background:#fafafa;border:1px solid var(--border);border-radius:10px">`;
s+=`<line x1="20" y1="140" x2="250" y2="140" stroke="#7c3aed" stroke-width="2"/>`;
s+=`<line x1="20" y1="140" x2="250" y2="50" stroke="#7c3aed" stroke-width="2"/>`;
s+=`<line x1="80" y1="10" x2="80" y2="150" stroke="#a78bfa" stroke-width="1.5"/>`;
s+=`<line x1="170" y1="10" x2="170" y2="150" stroke="#a78bfa" stroke-width="1.5"/>`;
s+=`<text x="125" y="30" text-anchor="middle" font-size="11" fill="#6d28d9" font-weight="800">AB/BC = A'B'/B'C'</text>`;
s+=`<text x="125" y="100" text-anchor="middle" font-size="10" fill="#10b981" font-weight="700">QED</text>`;
// parallel transversals from ray1 to ray2 (not full vertical lines - just the segments)
s+=`<line x1="80" y1="140" x2="80" y2="117" stroke="#a78bfa" stroke-width="1.8" stroke-dasharray="4,3"/>`;
s+=`<line x1="170" y1="140" x2="170" y2="81" stroke="#a78bfa" stroke-width="1.8" stroke-dasharray="4,3"/>`;
// dot intersections on both rays
s+=`<circle cx="80" cy="140" r="3" fill="#7c3aed"/>`;
s+=`<circle cx="170" cy="140" r="3" fill="#7c3aed"/>`;
s+=`<circle cx="80" cy="117" r="3" fill="#7c3aed"/>`;
s+=`<circle cx="170" cy="81" r="3" fill="#7c3aed"/>`;
s+=`<text x="80" y="152" text-anchor="middle" font-size="9" fill="#6d28d9">A</text>`;
s+=`<text x="170" y="152" text-anchor="middle" font-size="9" fill="#6d28d9">B</text>`;
s+=`<text x="84" y="114" font-size="9" fill="#6d28d9">A'</text>`;
s+=`<text x="174" y="78" font-size="9" fill="#6d28d9">B'</text>`;
s+=`<text x="20" y="152" text-anchor="middle" font-size="9" fill="#6d28d9">O</text>`;
s+=`<text x="130" y="20" text-anchor="middle" font-size="10" fill="#6d28d9" font-weight="800">AB/A'B' = OA/OA'</text>`;
s+=`<text x="130" y="100" text-anchor="middle" font-size="9" fill="#10b981" font-weight="700">QED ∎</text>`;
s+='</svg>';return s;}},
];
let step=0;
@@ -1216,22 +1258,25 @@ function buildP3(){
<p style="margin-top:6px">где $k > 0$ — <b>коэффициент подобия</b>.</p>
<p style="margin-top:8px"><b>Обозначения:</b> стороны треугольника: $a=BC$, $b=CA$, $c=AB$ и $a'=B'C'$, $b'=C'A'$, $c'=A'B'$.</p>
<div style="display:flex;justify-content:center;margin-top:14px">
<svg viewBox="0 0 280 150" style="max-width:300px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- большой треугольник ABC -->
<polygon points="30,130 180,130 80,30" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="2"/>
<text x="74" y="24" font-size="11" font-weight="700" fill="#6d28d9">A</text>
<text x="22" y="143" font-size="11" font-weight="700" fill="#6d28d9">B</text>
<text x="183" y="143" font-size="11" font-weight="700" fill="#6d28d9">C</text>
<!-- малый треугольник A'B'C' (k=0.5) -->
<polygon points="200,130 270,130 237,70" fill="rgba(139,92,246,.15)" stroke="#8b5cf6" stroke-width="1.8"/>
<text x="233" y="64" font-size="10" font-weight="700" fill="#8b5cf6">A'</text>
<text x="194" y="143" font-size="10" font-weight="700" fill="#8b5cf6">B'</text>
<text x="271" y="143" font-size="10" font-weight="700" fill="#8b5cf6">C'</text>
<!-- коэффициент -->
<text x="140" y="16" text-anchor="middle" font-size="10" fill="#6d28d9">k = a/a' = b/b' = c/c'</text>
<svg viewBox="0 0 280 155" style="max-width:300px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- большой треугольник ABC: A=(60,30), B=(20,130), C=(160,130) -->
<!-- BC=140, AB=sqrt(40²+100²)≈107.7, AC=sqrt(100²+100²)≈141.4 -->
<polygon points="60,30 20,130 160,130" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="2"/>
<text x="60" y="23" text-anchor="middle" font-size="11" font-weight="700" fill="#6d28d9">A</text>
<text x="11" y="142" font-size="11" font-weight="700" fill="#6d28d9">B</text>
<text x="163" y="142" font-size="11" font-weight="700" fill="#6d28d9">C</text>
<!-- малый треугольник A'B'C' (k=2): A'=B+(A-B)/2=(40,80), B'=(20+70,130)... -->
<!-- Place B'=(155,130), C'=(155+70,130)=(225,130), A'=B'+(A-B)*0.5=(175,80) -->
<!-- Verify: B'C'=70=140/2✓, |A'B'|=sqrt(20²+50²)≈53.9≈107.7/2✓, |A'C'|=sqrt(50²+50²)≈70.7≈141.4/2✓ -->
<polygon points="175,80 155,130 225,130" fill="rgba(139,92,246,.15)" stroke="#8b5cf6" stroke-width="1.8"/>
<text x="175" y="74" text-anchor="middle" font-size="10" font-weight="700" fill="#8b5cf6">A'</text>
<text x="147" y="142" font-size="10" font-weight="700" fill="#8b5cf6">B'</text>
<text x="228" y="142" font-size="10" font-weight="700" fill="#8b5cf6">C'</text>
<!-- коэффициент подобия k=2 -->
<text x="113" y="16" text-anchor="middle" font-size="9" fill="#6d28d9">k=2: a/a'=b/b'=c/c'=2</text>
<!-- равенство углов -->
<text x="35" y="125" font-size="8" fill="#6d28d9">∠B</text>
<text x="203" y="125" font-size="8" fill="#8b5cf6">∠B'</text>
<text x="25" y="124" font-size="8" fill="#6d28d9">∠B</text>
<text x="160" y="124" font-size="8" fill="#8b5cf6">∠B'</text>
</svg>
</div>`);
@@ -1372,7 +1417,7 @@ function buildP3(){
s+=`<text x="190" y="15" text-anchor="middle" font-size="11" fill="#6d28d9" font-weight="800">k = ${k.toFixed(1)}</text>`;
s+='</svg>';
svgWrap.innerHTML=s;
infoEl.innerHTML=`$k=${k.toFixed(1)}$: $a/a'=${fmt(a/a*k/k)} \\to a'=${fmt(a/10/k)}$, $b'=${fmt(b/10/k)}$, $c'=${fmt(c/10/k)}$. Углы всегда равны: $\\angle A=\\angle A', \\angle B=\\angle B', \\angle C=\\angle C'$.`;
infoEl.innerHTML=`$k=${k.toFixed(1)}$: $a/a'=k=${k.toFixed(1)} \\to a'=${fmt(a/10/k)}$, $b'=${fmt(b/10/k)}$, $c'=${fmt(c/10/k)}$. Углы всегда равны: $\\angle A=\\angle A', \\angle B=\\angle B', \\angle C=\\angle C'$.`;
renderMath(infoEl);
addXp(1,'p3-sim');
}
@@ -1918,24 +1963,27 @@ function buildP5(){
<p style="margin-top:8px">Если $\\angle A = \\angle A'$ и $\\angle B = \\angle B'$, то $\\triangle ABC \\sim \\triangle A'B'C'$.</p>
<p style="margin-top:8px"><b>Почему достаточно двух углов?</b> Сумма углов треугольника равна $180°$. Если два угла равны, третий автоматически тоже равен: $\\angle C = 180° - \\angle A - \\angle B = 180° - \\angle A' - \\angle B' = \\angle C'$.</p>
<div style="display:flex;justify-content:center;margin-top:14px">
<svg viewBox="0 0 280 155" style="max-width:300px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- большой треугольник ABC -->
<polygon points="50,140 180,140 100,30" fill="rgba(79,70,229,.11)" stroke="#4f46e5" stroke-width="2"/>
<text x="96" y="25" font-size="11" font-weight="700" fill="#4338ca">A</text>
<text x="40" y="150" font-size="11" font-weight="700" fill="#4338ca">B</text>
<text x="183" y="150" font-size="11" font-weight="700" fill="#4338ca">C</text>
<!-- угловые метки -->
<path d="M100,30 Q112,40 105,50" fill="none" stroke="#f59e0b" stroke-width="2"/>
<svg viewBox="0 0 280 160" style="max-width:300px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- большой треугольник ABC: A=(100,30), B=(50,140), C=(180,140) -->
<!-- BC=130, AB≈120.8, AC≈136. k=2 для малого -->
<polygon points="100,30 50,140 180,140" fill="rgba(79,70,229,.11)" stroke="#4f46e5" stroke-width="2"/>
<text x="100" y="23" text-anchor="middle" font-size="11" font-weight="700" fill="#4338ca">A</text>
<text x="40" y="151" font-size="11" font-weight="700" fill="#4338ca">B</text>
<text x="183" y="151" font-size="11" font-weight="700" fill="#4338ca">C</text>
<!-- угловые метки (∠A orange, ∠B green) -->
<path d="M100,30 Q112,42 105,52" fill="none" stroke="#f59e0b" stroke-width="2"/>
<path d="M50,140 Q62,130 70,136" fill="none" stroke="#10b981" stroke-width="2"/>
<!-- маленький треугольник A'B'C' -->
<polygon points="200,140 264,140 230,76" fill="rgba(99,102,241,.15)" stroke="#6366f1" stroke-width="1.8"/>
<text x="227" y="70" font-size="10" font-weight="700" fill="#4f46e5">A'</text>
<text x="193" y="150" font-size="10" font-weight="700" fill="#4f46e5">B'</text>
<text x="266" y="150" font-size="10" font-weight="700" fill="#4f46e5">C'</text>
<!-- угловые метки -->
<path d="M230,76 Q237,84 232,91" fill="none" stroke="#f59e0b" stroke-width="1.5"/>
<path d="M200,140 Q210,132 215,136" fill="none" stroke="#10b981" stroke-width="1.5"/>
<text x="140" y="15" text-anchor="middle" font-size="10" fill="#4338ca">∠A=∠A', ∠B=∠B' → △ABC∼△A'B'C'</text>
<!-- малый треугольник A'B'C' (k=2): B'=B+(65,0)=(196+?, anchor B'=(196,140)) -->
<!-- B'=(196,140), C'=(261,140), A'=B'+(A-B)/2=(196+25,140-55)=(221,85) -->
<!-- Verify: B'C'=65=130/2✓, |A'B'|=sqrt(25²+55²)≈60.4≈120.8/2✓, |A'C'|=sqrt(40²+55²)≈68≈136/2✓ -->
<polygon points="221,85 196,140 261,140" fill="rgba(99,102,241,.15)" stroke="#6366f1" stroke-width="1.8"/>
<text x="221" y="79" text-anchor="middle" font-size="10" font-weight="700" fill="#4f46e5">A'</text>
<text x="188" y="151" font-size="10" font-weight="700" fill="#4f46e5">B'</text>
<text x="264" y="151" font-size="10" font-weight="700" fill="#4f46e5">C'</text>
<!-- угловые метки (∠A'=∠A orange, ∠B'=∠B green) -->
<path d="M221,85 Q229,95 224,102" fill="none" stroke="#f59e0b" stroke-width="1.5"/>
<path d="M196,140 Q206,132 211,136" fill="none" stroke="#10b981" stroke-width="1.5"/>
<text x="140" y="15" text-anchor="middle" font-size="9" fill="#4338ca">∠A=∠A', ∠B=∠B' → △ABC∼△A'B'C', k=2</text>
</svg>
</div>`);
@@ -2146,7 +2194,7 @@ function buildP5(){
(function(){
const steps=[
{desc:'<b>Шаг 1.</b> Даны $\\triangle ABC$ и $\\triangle A\'B\'C\'$ с $\\angle A = \\angle A\'$ и $\\angle B = \\angle B\'$. Требуется доказать $\\triangle ABC \\sim \\triangle A\'B\'C\'$.',
svg:`<svg viewBox="0 0 280 145" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="50,130 170,130 100,30" fill="rgba(79,70,229,.10)" stroke="#4f46e5" stroke-width="2"/><polygon points="185,130 255,130 220,68" fill="rgba(99,102,241,.15)" stroke="#6366f1" stroke-width="1.8"/><text x="97" y="25" font-size="11" font-weight="700" fill="#4338ca">A</text><text x="40" y="140" font-size="11" font-weight="700" fill="#4338ca">B</text><text x="172" y="140" font-size="11" font-weight="700" fill="#4338ca">C</text><text x="218" y="63" font-size="10" font-weight="700" fill="#4f46e5">A'</text><text x="177" y="140" font-size="10" font-weight="700" fill="#4f46e5">B'</text><text x="257" y="140" font-size="10" font-weight="700" fill="#4f46e5">C'</text><text x="140" y="14" text-anchor="middle" font-size="9" fill="#4338ca">∠A=∠A', ∠B=∠B' — условие</text></svg>`},
svg:`<svg viewBox="0 0 280 145" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="100,30 50,130 170,130" fill="rgba(79,70,229,.10)" stroke="#4f46e5" stroke-width="2"/><polygon points="210,70 180,130 252,130" fill="rgba(99,102,241,.15)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="24" text-anchor="middle" font-size="11" font-weight="700" fill="#4338ca">A</text><text x="40" y="140" font-size="11" font-weight="700" fill="#4338ca">B</text><text x="173" y="140" font-size="11" font-weight="700" fill="#4338ca">C</text><text x="210" y="65" text-anchor="middle" font-size="10" font-weight="700" fill="#4f46e5">A\'</text><text x="172" y="140" font-size="10" font-weight="700" fill="#4f46e5">B\'</text><text x="254" y="140" font-size="10" font-weight="700" fill="#4f46e5">C\'</text><text x="140" y="14" text-anchor="middle" font-size="9" fill="#4338ca">∠A=∠A\', ∠B=∠B\' — условие, k≈5/3</text></svg>`},
{desc:'<b>Шаг 2.</b> Из суммы углов треугольника: $\\angle C = 180° - \\angle A - \\angle B$ и $\\angle C\' = 180° - \\angle A\' - \\angle B\'$. Так как $\\angle A=\\angle A\'$ и $\\angle B=\\angle B\'$, получаем $\\angle C = \\angle C\'$.',
svg:`<svg viewBox="0 0 280 90" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><text x="140" y="26" text-anchor="middle" font-size="11" fill="#4338ca" font-weight="700">∠A+∠B+∠C = 180°</text><text x="140" y="46" text-anchor="middle" font-size="11" fill="#4f46e5" font-weight="700">∠A'+∠B'+∠C' = 180°</text><text x="140" y="72" text-anchor="middle" font-size="11" fill="#10b981" font-weight="800">∠C = 180°−∠A−∠B = 180°−∠A'−∠B' = ∠C'</text></svg>`},
{desc:'<b>Шаг 3.</b> На луче $A\'B\'$ откладываем отрезок $A\'M = AB$. Через $M$ проводим прямую, параллельную $B\'C\'$ — она встречает $A\'C\'$ в точке $N$. По теореме §4: $\\triangle A\'MN \\sim \\triangle A\'B\'C\'$.',
@@ -2301,7 +2349,7 @@ function buildP5(){
/* == INIT: Босс §5 == */
(function(){
const tasks=[
{q:'<svg viewBox="0 0 240 140" style="display:block;max-width:240px;margin:0 auto 8px;background:#e0e7ff;border:1px solid #a5b4fc;border-radius:8px"><polygon points="50,125 165,125 100,30" fill="rgba(79,70,229,.12)" stroke="#4f46e5" stroke-width="2"/><polygon points="175,125 230,125 200,78" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="97" y="26" font-size="10" fill="#4338ca" font-weight="700">A</text><text x="40" y="134" font-size="10" fill="#4338ca" font-weight="700">B</text><text x="167" y="134" font-size="10" fill="#4338ca" font-weight="700">C</text><text x="197" y="74" font-size="9" fill="#4f46e5" font-weight="700">A\'</text><text x="168" y="134" font-size="9" fill="#4f46e5" font-weight="700">B\'</text><text x="232" y="134" font-size="9" fill="#4f46e5" font-weight="700">C\'</text><text x="120" y="12" text-anchor="middle" font-size="8" fill="#4338ca">∠A=∠A\'=60°, ∠B=∠B\'=80°</text></svg>$\\angle A=\\angle A\'=60°$, $\\angle B=\\angle B\'=80°$. $AB=15$, $A\'B\'=5$. Найди $k$.',ans:3,hint:'k=AB/A\'B\'=15/5=3.'},
{q:'<svg viewBox="0 0 240 140" style="display:block;max-width:240px;margin:0 auto 8px;background:#e0e7ff;border:1px solid #a5b4fc;border-radius:8px"><polygon points="100,30 50,125 165,125" fill="rgba(79,70,229,.12)" stroke="#4f46e5" stroke-width="2"/><polygon points="192,93 175,125 213,125" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="24" text-anchor="middle" font-size="10" fill="#4338ca" font-weight="700">A</text><text x="41" y="134" font-size="10" fill="#4338ca" font-weight="700">B</text><text x="167" y="134" font-size="10" fill="#4338ca" font-weight="700">C</text><text x="192" y="87" text-anchor="middle" font-size="9" fill="#4f46e5" font-weight="700">A\'</text><text x="168" y="134" font-size="9" fill="#4f46e5" font-weight="700">B\'</text><text x="215" y="134" font-size="9" fill="#4f46e5" font-weight="700">C\'</text><text x="120" y="12" text-anchor="middle" font-size="8" fill="#4338ca">∠A=∠A\'=60°, ∠B=∠B\'=80°, k=3</text></svg>$\\angle A=\\angle A\'=60°$, $\\angle B=\\angle B\'=80°$. $AB=15$, $A\'B\'=5$. Найди $k$.',ans:3,hint:'k=AB/A\'B\'=15/5=3.'},
{q:'Два прямоугольных треугольника. Острый угол одного $42°$, другого $42°$. Подобны ли? Гипотенуза первого $13$, второго $6.5$. Найди $k$.',ans:2,hint:'Подобны (ДД). k=13/6.5=2.'},
{q:'$\\triangle ABC \\sim \\triangle A\'B\'C\'$ по ДД. $k=4$. Периметр $\\triangle A\'B\'C\'=18$. Найди периметр $\\triangle ABC$.',ans:72,hint:'P=k·P\'=4·18=72.'},
{q:'В $\\triangle ABC$ и $\\triangle DEF$: $\\angle A=\\angle D=55°$, $\\angle B=\\angle E=75°$. $BC=20$, $EF=8$. Найди $k=BC/EF$.',ans:2.5,hint:'k=20/8=2.5.'},
@@ -2337,29 +2385,31 @@ function buildP6(){
<p style="margin-top:8px">Если $\\dfrac{AB}{A'B'} = \\dfrac{AC}{A'C'} = k$ и $\\angle A = \\angle A'$, то $\\triangle ABC \\sim \\triangle A'B'C'$.</p>
<p style="margin-top:8px">Это означает: двух пропорциональных сторон и равного угла между ними <b>достаточно</b> для подобия — третью сторону и остальные углы можно не проверять.</p>
<div style="display:flex;justify-content:center;margin-top:14px">
<svg viewBox="0 0 300 160" style="max-width:320px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- Triangle 1: A=(100,20) B=(30,140) C=(195,140) -->
<svg viewBox="0 0 300 165" style="max-width:320px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- Triangle 1: A=(100,20), B=(30,140), C=(195,140) -->
<!-- AB≈138.9, AC≈153.1, ∠A≈68.6° -->
<polygon points="100,20 30,140 195,140" fill="rgba(124,58,237,.11)" stroke="#7c3aed" stroke-width="2"/>
<!-- Angle mark at A -->
<path d="M100,20 Q118,38 108,52" fill="none" stroke="#f59e0b" stroke-width="2"/>
<!-- Angle mark at A (between AB direction (-70,-120) and AC direction (95,-120)) -->
<path d="M88,36 Q100,44 112,37" fill="none" stroke="#f59e0b" stroke-width="2"/>
<!-- Side labels -->
<text x="100" y="14" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text>
<text x="20" y="150" font-size="11" font-weight="800" fill="#6d28d9">B</text>
<text x="198" y="150" font-size="11" font-weight="800" fill="#6d28d9">C</text>
<text x="54" y="90" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">AB</text>
<text x="155" y="88" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">AC</text>
<!-- Triangle 2: A'=(235,48) B'=(208,118) C'=(275,118) -->
<polygon points="235,48 208,118 275,118" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/>
<!-- Angle mark at A' -->
<path d="M235,48 Q246,59 241,68" fill="none" stroke="#f59e0b" stroke-width="1.8"/>
<text x="235" y="42" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text>
<text x="199" y="127" font-size="10" font-weight="800" fill="#4f46e5">B'</text>
<text x="277" y="127" font-size="10" font-weight="800" fill="#4f46e5">C'</text>
<text x="218" y="87" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">A'B'</text>
<text x="262" y="85" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">A'C'</text>
<!-- Equal angle label -->
<text x="150" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">∠A = ∠A'</text>
<text x="150" y="24" text-anchor="middle" font-size="9" fill="#7c3aed">AB/A'B' = AC/A'C' = k → △ABC∼△A'B'C'</text>
<text x="100" y="13" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text>
<text x="20" y="151" font-size="11" font-weight="800" fill="#6d28d9">B</text>
<text x="198" y="151" font-size="11" font-weight="800" fill="#6d28d9">C</text>
<text x="57" y="87" text-anchor="end" font-size="10" fill="#7c3aed" font-style="italic">AB</text>
<text x="155" y="85" font-size="10" fill="#7c3aed" font-style="italic">AC</text>
<!-- Triangle 2 (k=2): A'=(235,58), B'=A'+(-35,60)=(200,118), C'=A'+(48,60)=(283,118) -->
<!-- A'B'=AB/2≈69.5✓, A'C'=AC/2≈76.6✓, ∠A'=∠A≈68.6°✓ -->
<polygon points="235,58 200,118 283,118" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/>
<!-- Angle mark at A' (same shape, same direction vectors scaled) -->
<path d="M226,72 Q235,78 244,73" fill="none" stroke="#f59e0b" stroke-width="1.8"/>
<text x="235" y="52" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text>
<text x="192" y="128" font-size="10" font-weight="800" fill="#4f46e5">B'</text>
<text x="285" y="128" font-size="10" font-weight="800" fill="#4f46e5">C'</text>
<text x="212" y="93" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">A'B'</text>
<text x="263" y="88" font-size="9" fill="#6366f1" font-style="italic">A'C'</text>
<!-- Equal angle and ratio labels -->
<text x="150" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">∠A = ∠A' (равны)</text>
<text x="150" y="24" text-anchor="middle" font-size="9" fill="#7c3aed">AB/A'B' = AC/A'C' = k=2 → △ABC∼△A'B'C'</text>
</svg>
</div>`);
@@ -2563,7 +2613,7 @@ function buildP6(){
(function(){
const steps=[
{desc:'<b>Шаг 1.</b> Дано: $\\dfrac{AB}{A\'B\'} = \\dfrac{AC}{A\'C\'} = k$ и $\\angle A = \\angle A\'$. Нужно доказать: $\\triangle ABC \\sim \\triangle A\'B\'C\'$.',
svg:`<svg viewBox="0 0 280 140" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="100,20 30,130 200,130" fill="rgba(124,58,237,.10)" stroke="#7c3aed" stroke-width="2"/><polygon points="210,48 185,115 255,115" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="14" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text><text x="20" y="138" font-size="11" font-weight="800" fill="#6d28d9">B</text><text x="202" y="138" font-size="11" font-weight="800" fill="#6d28d9">C</text><text x="210" y="43" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text><text x="177" y="124" font-size="10" font-weight="800" fill="#4f46e5">B'</text><text x="257" y="124" font-size="10" font-weight="800" fill="#4f46e5">C'</text><text x="140" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">AB/A'B'=AC/A'C'=k, ∠A=∠A'</text></svg>`},
svg:`<svg viewBox="0 0 280 145" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="100,20 30,130 200,130" fill="rgba(124,58,237,.10)" stroke="#7c3aed" stroke-width="2"/><polygon points="220,65 185,120 270,120" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="14" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text><text x="20" y="139" font-size="11" font-weight="800" fill="#6d28d9">B</text><text x="202" y="139" font-size="11" font-weight="800" fill="#6d28d9">C</text><text x="220" y="60" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A\'</text><text x="177" y="130" font-size="10" font-weight="800" fill="#4f46e5">B\'</text><text x="272" y="130" font-size="10" font-weight="800" fill="#4f46e5">C\'</text><text x="140" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">AB/A\'B\'=AC/A\'C\'=k=2, ∠A=∠A\'</text></svg>`},
{desc:'<b>Шаг 2.</b> На луче $A\'B\'$ откладываем точку $M$ так, что $A\'M = AB$. Через $M$ проводим прямую $MN \\parallel B\'C\'$, где $N$ на луче $A\'C\'$.',
svg:`<svg viewBox="0 0 280 140" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="140,15 30,130 250,130" fill="rgba(99,102,241,.10)" stroke="#6366f1" stroke-width="1.5"/><polygon points="140,15 80,78 200,78" fill="rgba(124,58,237,.22)" stroke="#7c3aed" stroke-width="2"/><line x1="80" y1="78" x2="200" y2="78" stroke="#7c3aed" stroke-width="2" stroke-dasharray="5,3"/><text x="140" y="10" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text><text x="20" y="138" font-size="10" font-weight="800" fill="#4f46e5">B'</text><text x="252" y="138" font-size="10" font-weight="800" fill="#4f46e5">C'</text><text x="74" y="88" font-size="10" font-weight="800" fill="#7c3aed">M</text><text x="202" y="88" font-size="10" font-weight="800" fill="#7c3aed">N</text><text x="140" y="110" text-anchor="middle" font-size="9" fill="#7c3aed">A'M=AB, MN∥B'C'</text></svg>`},
{desc:'<b>Шаг 3.</b> По теореме о прямой, параллельной стороне (§4): $\\dfrac{A\'M}{A\'B\'} = \\dfrac{A\'N}{A\'C\'}$. Так как $A\'M = AB$ и $\\dfrac{AB}{A\'B\'} = k$, получаем $A\'N = A\'C\' \\cdot \\dfrac{AB}{A\'B\'}= AC$.',
@@ -2699,7 +2749,7 @@ function buildP6(){
/* == INIT: Босс §6 == */
(function(){
const tasks=[
{q:'<svg viewBox="0 0 240 130" style="display:block;max-width:240px;margin:0 auto 8px;background:#ede9fe;border:1px solid #c4b5fd;border-radius:8px"><polygon points="100,15 25,120 205,120" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="2"/><polygon points="196,42 168,105 250,105" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="10" text-anchor="middle" font-size="10" fill="#6d28d9" font-weight="800">A</text><text x="16" y="128" font-size="10" fill="#6d28d9" font-weight="800">B</text><text x="207" y="128" font-size="10" fill="#6d28d9" font-weight="800">C</text><text x="196" y="37" text-anchor="middle" font-size="9" fill="#4f46e5" font-weight="800">A\'</text><text x="160" y="114" font-size="9" fill="#4f46e5" font-weight="800">B\'</text><text x="252" y="114" font-size="9" fill="#4f46e5" font-weight="800">C\'</text><text x="120" y="10" text-anchor="middle" font-size="8" fill="#7c3aed">AB=9, AC=12, A\'B\'=6, A\'C\'=8, ∠A=∠A\'</text></svg>$AB=9$, $AC=12$, $A\'B\'=6$, $A\'C\'=8$, $\\angle A=\\angle A\'$. Найди $k=AB/A\'B\'$.',ans:1.5,hint:'k=9/6=1.5. Проверь: 12/8=1.5. ✓ Признак СУС выполнен.'},
{q:'<svg viewBox="0 0 300 130" style="display:block;max-width:300px;margin:0 auto 8px;background:#ede9fe;border:1px solid #c4b5fd;border-radius:8px"><polygon points="85,15 20,110 160,110" fill="rgba(124,58,237,.12)" stroke="#7c3aed" stroke-width="2"/><polygon points="228,47 185,110 278,110" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><path d="M73,30 Q85,38 97,32" fill="none" stroke="#f59e0b" stroke-width="1.8"/><path d="M219,60 Q228,67 237,61" fill="none" stroke="#f59e0b" stroke-width="1.5"/><text x="85" y="10" text-anchor="middle" font-size="10" fill="#6d28d9" font-weight="800">A</text><text x="12" y="119" font-size="10" fill="#6d28d9" font-weight="800">B</text><text x="163" y="119" font-size="10" fill="#6d28d9" font-weight="800">C</text><text x="228" y="42" text-anchor="middle" font-size="9" fill="#4f46e5" font-weight="800">A\'</text><text x="177" y="119" font-size="9" fill="#4f46e5" font-weight="800">B\'</text><text x="280" y="119" font-size="9" fill="#4f46e5" font-weight="800">C\'</text><text x="150" y="10" text-anchor="middle" font-size="8" fill="#7c3aed">AB=9,AC=12,A\'B\'=6,A\'C\'=8,∠A=∠A\',k=1.5</text></svg>$AB=9$, $AC=12$, $A\'B\'=6$, $A\'C\'=8$, $\\angle A=\\angle A\'$. Найди $k=AB/A\'B\'$.',ans:1.5,hint:'k=9/6=1.5. Проверь: 12/8=1.5. ✓ Признак СУС выполнен.'},
{q:'$\\triangle ABC \\sim \\triangle A\'B\'C\'$ по СУС, $k=4$. Стороны второго: $A\'B\'=3$, $A\'C\'=5$. Чему равно $AB+AC$?',ans:32,hint:'AB=4·3=12, AC=4·5=20. Сумма 32.'},
{q:'$AB=10$, $AC=15$, $\\angle A=60°$. По признаку СУС треугольник подобен другому с $k=2.5$. Найди $A\'B\'$.',ans:4,hint:'A\'B\'=AB/k=10/2.5=4.'},
{q:'Даны два треугольника: $AB=18$, $AC=12$, $A\'B\'=6$, $A\'C\'=4$, $\\angle A=\\angle A\'=75°$. Найди $BC$, если $B\'C\'=5$.',ans:15,hint:'k=18/6=3. BC=k·B\'C\'=3·5=15.'},
@@ -2737,26 +2787,28 @@ function buildP7(){
<p style="margin-top:8px">Здесь $a=BC$, $b=AC$, $c=AB$ и аналогично для второго треугольника. Это самый сильный признак — он <b>не требует</b> проверки углов.</p>
<div style="display:flex;justify-content:center;margin-top:14px">
<svg viewBox="0 0 300 165" style="max-width:320px;background:#fafafa;border:1px solid var(--border);border-radius:10px">
<!-- Triangle 1: A=(100,18) B=(28,140) C=(205,140) -->
<!-- Triangle 1: A=(100,18), B=(28,140), C=(205,140) -->
<!-- BC=177, AB≈141.7, AC≈160.8 -->
<polygon points="100,18 28,140 205,140" fill="rgba(124,58,237,.11)" stroke="#7c3aed" stroke-width="2"/>
<text x="100" y="12" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text>
<text x="18" y="149" font-size="11" font-weight="800" fill="#6d28d9">B</text>
<text x="208" y="149" font-size="11" font-weight="800" fill="#6d28d9">C</text>
<!-- Side labels t1 -->
<text x="55" y="96" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">c=AB</text>
<text x="115" y="155" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">a=BC</text>
<text x="160" y="93" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">b=AC</text>
<!-- Triangle 2: A'=(238,42) B'=(212,122) C'=(278,122) -->
<polygon points="238,42 212,122 278,122" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/>
<text x="238" y="36" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text>
<text x="202" y="131" font-size="10" font-weight="800" fill="#4f46e5">B'</text>
<text x="280" y="131" font-size="10" font-weight="800" fill="#4f46e5">C'</text>
<text x="55" y="93" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">c=AB</text>
<text x="116" y="155" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">a=BC</text>
<text x="162" y="90" text-anchor="middle" font-size="10" fill="#7c3aed" font-style="italic">b=AC</text>
<!-- Triangle 2 (k=2.5): B'=(195,122), C'=(266,122), A'=(224,73) -->
<!-- Verify: B'C'=71≈177/2.5✓, A'B'≈56.9≈141.7/2.5✓, A'C'≈64.5≈160.8/2.5✓ -->
<polygon points="224,73 195,122 266,122" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/>
<text x="224" y="67" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text>
<text x="186" y="131" font-size="10" font-weight="800" fill="#4f46e5">B'</text>
<text x="268" y="131" font-size="10" font-weight="800" fill="#4f46e5">C'</text>
<!-- Side labels t2 -->
<text x="221" y="87" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">c'</text>
<text x="245" y="131" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">a'</text>
<text x="263" y="86" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">b'</text>
<text x="205" y="102" text-anchor="end" font-size="9" fill="#6366f1" font-style="italic">c'</text>
<text x="230" y="131" text-anchor="middle" font-size="9" fill="#6366f1" font-style="italic">a'</text>
<text x="252" y="100" font-size="9" fill="#6366f1" font-style="italic">b'</text>
<!-- Ratio text -->
<text x="150" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">a/a' = b/b' = c/c' = k → △ABC∼△A'B'C'</text>
<text x="150" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">a/a'=b/b'=c/c'=k≈2.5 → △ABC∼△A'B'C'</text>
</svg>
</div>`);
@@ -2975,7 +3027,7 @@ function buildP7(){
(function(){
const steps=[
{desc:'<b>Шаг 1.</b> Дано: $\\dfrac{a}{a\'}=\\dfrac{b}{b\'}=\\dfrac{c}{c\'}=k$. Нужно доказать: $\\triangle ABC \\sim \\triangle A\'B\'C\'$.',
svg:`<svg viewBox="0 0 280 140" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="100,18 28,132 210,132" fill="rgba(124,58,237,.10)" stroke="#7c3aed" stroke-width="2"/><polygon points="210,46 188,112 258,112" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="13" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text><text x="18" y="140" font-size="11" font-weight="800" fill="#6d28d9">B</text><text x="213" y="140" font-size="11" font-weight="800" fill="#6d28d9">C</text><text x="210" y="41" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text><text x="180" y="120" font-size="10" font-weight="800" fill="#4f46e5">B'</text><text x="260" y="120" font-size="10" font-weight="800" fill="#4f46e5">C'</text><text x="140" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">a/a'=b/b'=c/c'=k — условие</text></svg>`},
svg:`<svg viewBox="0 0 280 145" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="100,18 28,132 210,132" fill="rgba(124,58,237,.10)" stroke="#7c3aed" stroke-width="2"/><polygon points="221,65 185,122 276,122" fill="rgba(99,102,241,.18)" stroke="#6366f1" stroke-width="1.8"/><text x="100" y="13" text-anchor="middle" font-size="11" font-weight="800" fill="#6d28d9">A</text><text x="18" y="140" font-size="11" font-weight="800" fill="#6d28d9">B</text><text x="213" y="140" font-size="11" font-weight="800" fill="#6d28d9">C</text><text x="221" y="60" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A\'</text><text x="177" y="131" font-size="10" font-weight="800" fill="#4f46e5">B\'</text><text x="278" y="131" font-size="10" font-weight="800" fill="#4f46e5">C\'</text><text x="140" y="12" text-anchor="middle" font-size="9" fill="#f59e0b" font-weight="800">a/a\'=b/b\'=c/c\'=k (k≈2) — условие</text></svg>`},
{desc:'<b>Шаг 2.</b> На луче $A\'B\'$ откладываем $A\'M = AB = k \\cdot A\'B\'$. Через $M$ проводим $MN \\parallel B\'C\'$, $N$ на $A\'C\'$. По теореме §4: $\\triangle A\'MN \\sim \\triangle A\'B\'C\'$.',
svg:`<svg viewBox="0 0 280 140" style="max-width:280px;background:#fafafa;border:1px solid var(--border);border-radius:10px"><polygon points="140,14 30,126 250,126" fill="rgba(99,102,241,.10)" stroke="#6366f1" stroke-width="1.5"/><polygon points="140,14 82,70 198,70" fill="rgba(124,58,237,.22)" stroke="#7c3aed" stroke-width="2"/><line x1="82" y1="70" x2="198" y2="70" stroke="#7c3aed" stroke-width="2" stroke-dasharray="5,3"/><text x="140" y="9" text-anchor="middle" font-size="10" font-weight="800" fill="#4f46e5">A'</text><text x="20" y="134" font-size="10" font-weight="800" fill="#4f46e5">B'</text><text x="252" y="134" font-size="10" font-weight="800" fill="#4f46e5">C'</text><text x="76" y="80" font-size="10" font-weight="800" fill="#7c3aed">M</text><text x="200" y="80" font-size="10" font-weight="800" fill="#7c3aed">N</text><text x="140" y="110" text-anchor="middle" font-size="9" fill="#7c3aed">A'M=AB, MN∥B'C'</text></svg>`},
{desc:'<b>Шаг 3.</b> Поскольку $\\triangle A\'MN \\sim \\triangle A\'B\'C\'$ с коэффициентом $k$, все стороны $\\triangle A\'MN$ равны соответствующим сторонам $\\triangle ABC$: $A\'M=AB$, $MN=a$, $A\'N=b$.',