From 633f417548d46474a790a192700ce170d3000c44 Mon Sep 17 00:00:00 2001 From: Cha Date: Thu, 25 Sep 2025 23:06:26 +0900 Subject: [PATCH] =?UTF-8?q?skeleton=20-=20=EB=AA=A8=EB=93=A0=20=EC=84=A0?= =?UTF-8?q?=EB=B6=84=EA=B3=BC=EC=9D=98=20=EA=B8=B0=ED=95=98=ED=95=99?= =?UTF-8?q?=EC=A0=81=20=EA=B5=90=EC=B0=A8=EC=A0=90=EC=9D=84=20=ED=83=90?= =?UTF-8?q?=EC=83=89=ED=95=98=EC=97=AC=20=EA=B0=80=EC=9E=A5=20=EA=B0=80?= =?UTF-8?q?=EA=B9=8C=EC=9A=B4=20=EC=9C=A0=ED=9A=A8=ED=95=9C=20=EC=A0=90?= =?UTF-8?q?=EC=9D=84=20=EC=B0=BE=EB=8A=942?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/skeleton-utils.js | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/util/skeleton-utils.js b/src/util/skeleton-utils.js index 7017943f..fde9444a 100644 --- a/src/util/skeleton-utils.js +++ b/src/util/skeleton-utils.js @@ -143,6 +143,11 @@ const createInnerLinesFromSkeleton = (skeleton, baseLines, roof, canvas, textMod } }); + //2-1 확장된 스켈레톤 선이 연장되다가 서로 만나면 만난점(접점)에서 멈추어야 된다. + trimIntersectingExtendedLines(skeletonLines, disconnectedLines); + + + // 3. 최종적으로 정리된 스켈레톤 선들을 QLine 객체로 변환하여 캔버스에 추가합니다. const innerLines = []; skeletonLines.forEach(line => { @@ -553,6 +558,45 @@ export const findDisconnectedSkeletonLines = (skeletonLines, baseLines) => { return { disconnectedLines }; }; +/** + * 연장된 스켈레톤 라인들이 서로 교차하는 경우, 교차점에서 잘라냅니다. + * @param {Array} skeletonLines - (수정될) 전체 스켈레톤 라인 배열 + * @param {Array} disconnectedLines - 연장 정보가 담긴 배열 + */ +const trimIntersectingExtendedLines = (skeletonLines, disconnectedLines) => { + // disconnectedLines에는 연장된 선들의 정보가 들어있음 + for (let i = 0; i < disconnectedLines.length; i++) { + for (let j = i + 1; j < disconnectedLines.length; j++) { + const dLine1 = disconnectedLines[i]; + const dLine2 = disconnectedLines[j]; + + // 연장된 후의 선분 객체를 가져옴 + const line1 = skeletonLines[dLine1.index]; + const line2 = skeletonLines[dLine2.index]; + + if(!line1 || !line2) continue; + + // 두 연장된 선분이 교차하는지 확인 + const intersection = getLineIntersection(line1.p1, line1.p2, line2.p1, line2.p2); + + if (intersection) { + // 교차점이 있다면, 각 선의 연장된 끝점을 교차점으로 업데이트 + if (!dLine1.p1Connected) { // p1이 연장된 점이었으면 + line1.p1 = intersection; + } else { // p2가 연장된 점이었으면 + line1.p2 = intersection; + } + + if (!dLine2.p1Connected) { // p1이 연장된 점이었으면 + line2.p1 = intersection; + } else { // p2가 연장된 점이었으면 + line2.p2 = intersection; + } + } + } + } +} + /** * skeletonLines와 selectBaseLine을 이용하여 다각형이 되는 좌표를 구합니다. * selectBaseLine의 좌표는 제외합니다. @@ -738,3 +782,4 @@ export { collectAllPoints, createPolygonsFromSkeletonLines }; +