[2272] 한쪽흐름 처마 offset 반전 수정 — margin/padding 판정을 면적비교로 교체 #889

Merged
ysCha merged 1 commits from dev into dev-deploy 2026-06-05 18:02:57 +09:00

View File

@ -1921,16 +1921,19 @@ export function useMode() {
}) })
const polygon = createRoofPolygon(wall.points) const polygon = createRoofPolygon(wall.points)
const originPolygon = new QPolygon(wall.points, { fontSize: 0 })
originPolygon.setViewLengthText(false)
let offsetPolygon let offsetPolygon
let result = createMarginPolygon(polygon, wall.lines).vertices let result = createMarginPolygon(polygon, wall.lines).vertices
//margin polygon 의 point가 기준 polygon의 밖에 있는지 판단한다. // margin polygon 이 기준 polygon 보다 바깥인지(면적 증가) 판단한다.
const allPointsOutside = result.every((point) => !originPolygon.inPolygon(point)) // [한쪽흐름-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 offsetPolygon = createMarginPolygon(polygon, wall.lines).vertices
} else { } else {
offsetPolygon = createPaddingPolygon(polygon, wall.lines).vertices offsetPolygon = createPaddingPolygon(polygon, wall.lines).vertices