From 168e68d3f039efe36af03162b0cb5d0ca6269af9 Mon Sep 17 00:00:00 2001 From: ysCha Date: Thu, 12 Feb 2026 14:17:59 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A7=81=EC=84=A0=EB=9D=BC=EC=9D=B8=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/skeleton-utils.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/util/skeleton-utils.js b/src/util/skeleton-utils.js index 8a25ae80..8c41c9c7 100644 --- a/src/util/skeleton-utils.js +++ b/src/util/skeleton-utils.js @@ -473,6 +473,9 @@ export const skeletonBuilder = (roofId, canvas, textMode) => { roofLineContactPoints = movingLineFromSkeleton(roofId, canvas) } + // changRoofLinePoints 좌표를 roof.skeletonPoints에 저장 (원본 roof.points는 유지) + roof.skeletonPoints = changRoofLinePoints.map(p => ({ x: p.x, y: p.y })) + console.log('points:', changRoofLinePoints) const geoJSONPolygon = toGeoJSON(changRoofLinePoints) @@ -1766,10 +1769,28 @@ function processEavesEdge(roofId, canvas, skeleton, edgeResult, skeletonLines) { } let eavesLines = [] + // 확장된 외곽선 판별용 + const skPts = roof.skeletonPoints || [] + const isSkeletonOuterEdge = (p1, p2, tolerance = 0.5) => { + for (let si = 0; si < skPts.length; si++) { + const sp1 = skPts[si] + const sp2 = skPts[(si + 1) % skPts.length] + if ((Math.abs(p1.x - sp1.x) < tolerance && Math.abs(p1.y - sp1.y) < tolerance && + Math.abs(p2.x - sp2.x) < tolerance && Math.abs(p2.y - sp2.y) < tolerance) || + (Math.abs(p1.x - sp2.x) < tolerance && Math.abs(p1.y - sp2.y) < tolerance && + Math.abs(p2.x - sp1.x) < tolerance && Math.abs(p2.y - sp1.y) < tolerance)) { + return true + } + } + return false + } + for (let i = 0; i < polygonPoints.length; i++) { const p1 = polygonPoints[i]; const p2 = polygonPoints[(i + 1) % polygonPoints.length]; + // 확장된 외곽선에 해당하는 edge는 스킵 + if (skPts.length > 0 && isSkeletonOuterEdge(p1, p2)) continue // 지붕 경계선과 교차 확인 및 클리핑 const clippedLine = clipLineToRoofBoundary(p1, p2, roof.lines, roof.moveSelectLine);