fix: a degenerate sharp corner renders as a normal sharp apex (#329 §4)

Owner correction (chat, 2026-08-27): no flat chamfer at the tip — a plain
sharp apex. Proven by execution on the issue fixture: the outset contour fell
back to a two-point bevel (the 4·h mitre limit against an 87 cm reach) while
the inset contour folded into a bow-tie, and subtracting that fold carved the
V-notches — together they made the trident. Now a degenerate corner (below 15
degrees, inner faces meeting inside both walls) contributes ONE outset point
at the plan's own vertex — no bevel, no metres-long mitre needle — and its
inset is clipped at the convergence line so no fold is subtracted. Plain and
merely sharp pairs keep the full mitre of #310. The write-side limits of
П1-П5 stop new plans from creating such corners at all.

Issue: #329
User-Visible: yes
This commit is contained in:
Codex
2026-08-27 23:30:26 +03:00
parent 6fc57f2ae8
commit 214355f424
11 changed files with 2906 additions and 2567 deletions
+20 -14
View File
@@ -1,6 +1,6 @@
# Issue #329 — ограничения стыков стен и честная острая вершина
Статус: ревизия 3 (r1: M1/M2/L1; r2: M1 — AC7 доказывает каналы §2). Решения владельца (чат, 2026-08-27, зафиксированы в issue):
Статус: ревизия 4 (r1: M1/M2/L1; r2: M1 — AC7; поправка владельца 2026-08-27: §4 — острая вершина, не фаска). Решения владельца (чат, 2026-08-27, зафиксированы в issue):
пять ограничений приняты; проверки действуют на записи, легаси читается как
есть; для остаточных острых вершин легаси-планов рендер закрывает остриё
честной фаской вместо «трезубца».
@@ -65,17 +65,23 @@
## 4. Рендер остаточных острых вершин (легаси)
Для пары стен вершины, чьи внутренние грани смыкаются на расстоянии `d` от
вершины, меньшем длины обеих стен (эквивалентно: угол мал настолько, что
существует зона полного перекрытия тел):
**Поправка владельца (чат, 2026-08-27):** плоского среза вершины быть не
должно — у остриё обычная нормальная острая вершина.
- остриё обрезается **одной плоской фаской**, перпендикулярной биссектрисе,
проходящей через точку смыкания внутренних граней;
- выше фаски тел нет вовсе (никаких пиков), ниже — обычная кладка; V-вырезы
запрещены; штриховка непрерывна;
- правило дополняет #309/#310 и включается только в вырожденной зоне
(`d` внутри длины стен); обычные острые пары (#310, остриё вне зоны
перекрытия) не меняются.
Для корня «трезубца» доказано исполнением: у вершины ≈9.85° внешний контур
падал на плоскую фаску (лимит mitre 4·h против выноса 87 см), а внутренний
контур складывался «бабочкой» — вырезы рождались вычитанием этой складки.
Контракт:
- вырожденная вершина (угол < 15° и точка смыкания внутренних граней внутри
обеих стен) даёт **одну точку внешнего контура ровно в вершине плана**:
ни двухточечной фаски, ни иглы mitre, уходящей на десятки сантиметров за
стены, которые её образуют;
- внутренний контур в этой зоне обрезается по линии смыкания внутренних
граней, поэтому складка не вычитается и V-вырезов не возникает; кладка
выше линии сплошная, штриховка непрерывна;
- обычные и просто острые пары (#310, вершина вне зоны перекрытия) не
меняются: их полный mitre сохраняется.
## 5. Бэкенд
@@ -136,9 +142,9 @@ margin): правила П1–П5 применяются к элементам,
полутолщины 16.5 см плюс минимального просвета — внутренняя область после
вычета тел < 25 см², запись отклоняется по П5. Тот же треугольник со
стороной 120 см (inradius ≈ 34.6 см) проходит. Юнит с этими числами.
- **AC6 (§4).** Легаси-фикстура issue рендерится без «трезубца»: одна фаска,
ноль V-вырезов; golden-сцена + пиксельная проверка смоком (нет разрывов
тела выше фаски).
- **AC6 (§4).** Легаси-фикстура issue рендерится без «трезубца»: у вершины
ровно одна точка внешнего контура, стоящая в вершине плана; ноль V-вырезов;
golden-сцена + юнит на контуре.
- **AC7a (Resize, канал §2).** Resize, приводящий к нарушению любого из
П1–П5, упирается в последнюю допустимую позицию; при отсутствии
безопасного шага ручка приглушена, и её объяснение (hover/focus/нажатие)