fix(stereo): прямой угол (90°) рисуется квадратиком, а не дугой

В инструменте «∠ рёбер» общий рисовальщик _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) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-17 18:20:09 +03:00
parent ce99c15895
commit e9fe4dabb9
+13
View File
@@ -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 = [];