From 8c2edf05e78c5966711bd646f21f9d88186b058e Mon Sep 17 00:00:00 2001 From: ysCha Date: Fri, 5 Jun 2026 17:53:22 +0900 Subject: [PATCH] =?UTF-8?q?[2272]=20=ED=95=9C=EC=AA=BD=ED=9D=90=EB=A6=84?= =?UTF-8?q?=20=EC=B2=98=EB=A7=88=20offset=20=EB=B0=98=EC=A0=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=E2=80=94=20margin/padding=20=ED=8C=90=EC=A0=95?= =?UTF-8?q?=EC=9D=84=20=EB=A9=B4=EC=A0=81=EB=B9=84=EA=B5=90=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 골짜기(凹凸) 형상에서 offset=0 변(케라바·shed) 코너가 원본 경계에 남고 inPolygon 의 경계점 nudge 비대칭으로 inside 오판 → padding 오선택 → 처마 반전. winding·골짜기 수에 무관한 shoelace 면적 절대값 비교로 판정 교체. Co-Authored-By: Claude Opus 4 --- src/hooks/useMode.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/hooks/useMode.js b/src/hooks/useMode.js index df61fbe1..dc82c379 100644 --- a/src/hooks/useMode.js +++ b/src/hooks/useMode.js @@ -1921,16 +1921,19 @@ export function useMode() { }) const polygon = createRoofPolygon(wall.points) - const originPolygon = new QPolygon(wall.points, { fontSize: 0 }) - originPolygon.setViewLengthText(false) let offsetPolygon let result = createMarginPolygon(polygon, wall.lines).vertices - //margin polygon 의 point가 기준 polygon의 밖에 있는지 판단한다. - const allPointsOutside = result.every((point) => !originPolygon.inPolygon(point)) + // margin polygon 이 기준 polygon 보다 바깥인지(면적 증가) 판단한다. + // [한쪽흐름-OFFSET-FIX 2026-06-05] 기존 점-내부판정(inPolygon)은 offset=0 변(케라바·한쪽흐름)의 + // 코너가 원본 경계에 남고 inPolygon 의 경계점 nudge 비대칭으로 골짜기(凹凸) 형상에서 inside 오판 → + // padding 오선택 → 처마 offset 반전. 처마(offset>0)는 항상 바깥으로 나오므로 정답은 면적이 커지는 margin. + // winding·골짜기 수에 무관한 면적 절대값 비교로 판정한다. + const polygonArea = (pts) => Math.abs(pts.reduce((s, p, i) => { const q = pts[(i + 1) % pts.length]; return s + (p.x * q.y - q.x * p.y) }, 0)) + const isMarginOutside = polygonArea(result) >= polygonArea(polygon.vertices) - if (allPointsOutside) { + if (isMarginOutside) { offsetPolygon = createMarginPolygon(polygon, wall.lines).vertices } else { offsetPolygon = createPaddingPolygon(polygon, wall.lines).vertices -- 2.47.2