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