mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-06 22:49:16 +00:00
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:
@@ -2,6 +2,13 @@
|
||||
|
||||
## Unreleased
|
||||
|
||||
- Sharp room corners are honest again: a very acute apex used to break into a
|
||||
«trident» of pikes and notches, and drawing now refuses the shapes that
|
||||
cause it — walls closer than 15°, more than six walls in one node, segments
|
||||
shorter than 20 cm or than their own thickness, nodes closer than 5 cm and
|
||||
rooms with no interior left
|
||||
([#329](https://github.com/Matysh/houseplan-card/issues/329)).
|
||||
|
||||
## v1.68.1 — 2026-08-27
|
||||
|
||||
- Creating a space no longer reports `v8+ space requires wall_segments` while
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
|
||||
## Не выпущено
|
||||
|
||||
- Острые углы комнат снова выглядят честно: очень острая вершина
|
||||
распадалась на «трезубец» из пиков и вырезов, а рисование теперь не
|
||||
разрешает саму причину — стены под углом меньше 15°, больше шести стен в
|
||||
узле, участки короче 20 см или собственной толщины, узлы ближе 5 см и
|
||||
комнаты без внутреннего просвета
|
||||
([#329](https://github.com/Matysh/houseplan-card/issues/329)).
|
||||
|
||||
## v1.68.1 — 2026-08-27
|
||||
|
||||
- Создание пространства больше не выдаёт ошибку
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"version": 1,
|
||||
"fixture": "synthetic-only",
|
||||
"chromium": "151.0.7922.34",
|
||||
"sourceFingerprint": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceFingerprint": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"captureScriptSha256": "ce2e9542fed9dade3085be87d16f69adb2ac8262893ad78ad966b1b9673f2983",
|
||||
"command": "npm run build && node demo/docs/capture.mjs",
|
||||
"scenarios": {
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "36223106c073f07d8cc3ecf8eaab37192ebb2687daba65c5c21047d0b7890de0"
|
||||
},
|
||||
"view-touch": {
|
||||
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "41e3ba67f8db0e98f26f484293af83ef937c369ca5ca6a59a3350d8954c906f4"
|
||||
},
|
||||
"space-create": {
|
||||
@@ -36,7 +36,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "0dc024726327f60f4a9ceaf3044381691f81f1090af81d1812e870f22d9343ba"
|
||||
},
|
||||
"room-contour-close": {
|
||||
@@ -47,7 +47,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "44cfaa95bd51e2cd628400e28db0ad8b2f0cd904385845bd402494f3f5c0d93c"
|
||||
},
|
||||
"plan-context-tray": {
|
||||
@@ -58,7 +58,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "e0662429b423fb74151b583dcc2c8635b001b637d03bbf7a6b16aec46399c3f8"
|
||||
},
|
||||
"device-editor": {
|
||||
@@ -69,7 +69,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "d0ffd31ce80bfde21ab75da356a5fc1af38246f2b301030880320620c228d89d"
|
||||
},
|
||||
"device-display-preview": {
|
||||
@@ -80,7 +80,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "2cdabae1f89c3286e4fac0ce30f757ee1690b707ab8a5488748b7cd420626160"
|
||||
},
|
||||
"background-editor": {
|
||||
@@ -91,7 +91,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "30147bb00a90eea7136b4cee30995f6e6a9217b5132f3e8d3ad7471413b1af8a"
|
||||
},
|
||||
"room-card": {
|
||||
@@ -102,7 +102,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "029a3e69ec647a8a370d99e6bb7f9225833c526739076022f6b52ba54bff30ea"
|
||||
},
|
||||
"device-info": {
|
||||
@@ -113,7 +113,7 @@
|
||||
},
|
||||
"theme": "dark",
|
||||
"language": "en",
|
||||
"sourceSha256": "bbdc8981e3d11029702a3e5b78a9026e6814bb2bdf8e3cb56d0c2e8f7c519b2c",
|
||||
"sourceSha256": "e3e2539c7a8a6a86120cad4dd041929b27e220eee60a5efe92cabe006353dbde",
|
||||
"imageSha256": "dd492f53150b7149085daada5cce9eeae9bde9e7ea1d86679a54b3041f72f517"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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/нажатие)
|
||||
|
||||
Reference in New Issue
Block a user