From e9fe4dabb9579de876739221b70146e592dcafdc Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 17 Jun 2026 18:20:09 +0300 Subject: [PATCH] =?UTF-8?q?fix(stereo):=20=D0=BF=D1=80=D1=8F=D0=BC=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=83=D0=B3=D0=BE=D0=BB=20(90=C2=B0)=20=D1=80=D0=B8?= =?UTF-8?q?=D1=81=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=B2=D0=B0=D0=B4?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=B8=D0=BA=D0=BE=D0=BC,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B4=D1=83=D0=B3=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В инструменте «∠ рёбер» общий рисовальщик _drawAngleArc всегда чертил дугу, включая случай 90° — должен быть квадратный маркер прямого угла. - _drawAngleArc: при |angle−90|<0.5° рисует угловой «квадратик» (p1=center+ n1·r, p3=center+(n1+n2)·r, p2=center+n2·r, r=radius·0.7) вместо дуги. Подпись «∠ABC = 90.0°» и лучи угла рисуются отдельно в обработчике — не затронуты. Для не-прямых углов поведение прежнее (дуга). Верификация: node --check OK; headless-смоук 10/10 (90° → 3-точечный квадрат с верной геометрией в любой плоскости; 89.6° в допуске → квадрат; 60/88/130° → дуга; полный поток _onEdgeAngleClick на угле куба → квадрат); эмодзи/eval/ new Function — 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/labs/stereo.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/js/labs/stereo.js b/frontend/js/labs/stereo.js index 0c7f9ba..c401ef9 100644 --- a/frontend/js/labs/stereo.js +++ b/frontend/js/labs/stereo.js @@ -3361,6 +3361,19 @@ class StereoSim { _drawAngleArc(center, dir1, dir2, angleDeg, radius, color) { const n1 = dir1.clone().normalize(); const n2 = dir2.clone().normalize(); + + // Right angle → draw the conventional square corner marker, not an arc. + if (Math.abs(angleDeg - 90) < 0.5) { + const r = radius * 0.7; + const p1 = center.clone().addScaledVector(n1, r); + const p2 = center.clone().addScaledVector(n2, r); + const p3 = p1.clone().addScaledVector(n2, r); // outer corner + const geo = new THREE.BufferGeometry().setFromPoints([p1, p3, p2]); + const mat = new THREE.LineBasicMaterial({ color: new THREE.Color(color), transparent: true, opacity: 0.85 }); + this._angleGroup.add(new THREE.Line(geo, mat)); + return; + } + const angleRad = angleDeg * Math.PI / 180; const steps = Math.max(8, Math.round(angleDeg / 5)); const pts = [];