From b42142888e5773639f697593edb5a601179deeed Mon Sep 17 00:00:00 2001 From: yscha Date: Sat, 29 Nov 2025 22:37:44 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=A0=EB=8B=B92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/skeleton-utils.js | 61 +++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/src/util/skeleton-utils.js b/src/util/skeleton-utils.js index 52c1a8c6..956f2343 100644 --- a/src/util/skeleton-utils.js +++ b/src/util/skeleton-utils.js @@ -892,6 +892,7 @@ if(roof.moveUpDown??0 > 0) { //추가 수직 getAddLine({ x: wallBaseLine.x1, y: newPEnd.y }, { x: wallBaseLine.x1, y: wallBaseLine.y1 }, ) //추가 라인? + findPoints.push({ x: wallBaseLine.x1, y: wallBaseLine.y1 }); } else if (wallBaseLine.x2 <= newPEnd.x && newPEnd.x <= wallBaseLine.x1 && wallBaseLine.x1 <= newPStart.x) { //top right @@ -946,11 +947,16 @@ if(roof.moveUpDown??0 > 0) { newPStart = { x: roofLine.x1, y: roofLine.y1 } newPEnd = { x: roofLine.x2, y: (isCross) ? currentRoofLine.y1 : wallBaseLine.y1 } - }else if(newPEnd.y <= wallBaseLine.y2 && wallBaseLine.y2 <= newPStart.y && newPStart.y <= wallBaseLine.y1) { //상단 왼쪽v + }else if(newPEnd.y <= wallBaseLine.y2 && wallBaseLine.y2 <= newPStart.y && newPStart.y <= wallBaseLine.y1) { //top right newPStart = { x: roofLine.x1, y: (isCross) ? currentRoofLine.y1 : wallBaseLine.y1 } newPEnd ={ x: roofLine.x2, y: roofLine.y2 } + //대각선 라인을 보조라인으로 그린다. + if(isCross){ + getAddLine({ x: roofLine.x1, y: currentRoofLine.y1 }, { x: wallBaseLine.x1, y: wallBaseLine.y1 }, 'yellow') + } + }else if(newPStart.y <= wallBaseLine.y1 && wallBaseLine.y1 <= newPEnd.y && newPEnd.y <= wallBaseLine.y2) {//상단 오르쪽 newPStart = { x: roofLine.x1, y: roofLine.y1 } @@ -1017,7 +1023,7 @@ if(roof.moveUpDown??0 > 0) { } else if (movedEnd) { //start변경 - //반시계방향 + //반시계방향 오렌지 if (getOrientation(roofLine) === 'vertical') { @@ -1035,6 +1041,8 @@ if(roof.moveUpDown??0 > 0) { newPStart = { x: roofLine.x1, y: (isCross) ? currentRoofLine.y2 : wallBaseLine.y2 } newPEnd = { x: roofLine.x2, y: roofLine.y2 } + + }else if(newPEnd.y <= wallBaseLine.y2 && wallBaseLine.y2 <= newPStart.y && newPStart.y <= wallBaseLine.y1) { //top / left newPStart = { x: roofLine.x1, y: (isCross) ? currentRoofLine.y2 : wallBaseLine.y2 } @@ -1044,10 +1052,12 @@ if(roof.moveUpDown??0 > 0) { newPStart = { x: roofLine.x1, y: roofLine.y1 } newPEnd = { x: roofLine.x2, y: (isCross) ? currentRoofLine.y2 : wallBaseLine.y2 } + //대각선 라인을 보조라인으로 그린다. if(isCross){ - getAddLine({ x: roofLine.x2, y: currentRoofLine.y2 }, { x: roofLine.x2, y: roofLine.y2 }, 'red') + getAddLine({ x: roofLine.x2, y: currentRoofLine.y2 }, { x: wallBaseLine.x2, y: wallBaseLine.y2 }, 'yellow') } + }else if(wallBaseLine.y1 <= newPStart.y && newPStart.y <= wallBaseLine.y2 && wallBaseLine.y2 <= newPEnd.y) { //하단 오른쪽v newPStart = { x: roofLine.x1, y: (isCross) ? currentRoofLine.y1 : wallBaseLine.y1 } @@ -1128,9 +1138,10 @@ if(roof.moveUpDown??0 > 0) { // canvas.renderAll if (findPoints.length > 0) { // 모든 점에 대해 라인 업데이트를 누적 - return findPoints.reduce((lines, point) => { - return updateAndAddLine(lines, point); - }, [...innerLines]); + // return findPoints.reduce((lines, point) => { + // return updateAndAddLine(lines, point); + // }, [...innerLines]); + return updateAndAddLine(innerLines, findPoints[0]); } return innerLines; @@ -1842,7 +1853,11 @@ const isPointOnSegment = (point, segStart, segEnd) => { export { findAllIntersections, collectAllPoints, - createPolygonsFromSkeletonLines + createPolygonsFromSkeletonLines, + preprocessPolygonCoordinates, + findOppositeLine, + createOrderedBasePoints, + createInnerLinesFromSkeleton }; @@ -3845,23 +3860,29 @@ function updateAndAddLine(innerLines, targetPoint) { line.y2 === foundLine.y2) ); - const updatedLine = { - ...foundLine, - x1: targetPoint.x, - y1: targetPoint.y, - x2: foundLine.x2, - y2: foundLine.y2, - startPoint: { x: targetPoint.x, y: targetPoint.y }, - endPoint: foundLine.endPoint || { x: foundLine.x2, y: foundLine.y2 } - }; + let isCurrentLine = false; + if(foundLine.y1 <= targetPoint.y && targetPoint.y <= foundLine.y2){ + isCurrentLine = true; + } + const updatedLine = { + ...foundLine, + left: (isCurrentLine)?targetPoint.x:foundLine.left, + top: (isCurrentLine)?targetPoint.y:foundLine.top, + x1: (isCurrentLine)?targetPoint.x:foundLine.x1, + y1: (isCurrentLine)?targetPoint.y:foundLine.y1, + x2: (isCurrentLine)?foundLine.x2:targetPoint.x, + y2: (isCurrentLine)?foundLine.y2:targetPoint.y, + startPoint: (isCurrentLine)?{ x: targetPoint.x, y: targetPoint.y }:foundLine.startPoint, + endPoint: (isCurrentLine)?foundLine.endPoint : { x: targetPoint.x, y: targetPoint.y} + }; // 4. If it's a Fabric.js object, use set method if available if (typeof foundLine.set === 'function') { foundLine.set({ - x1: targetPoint.x, - y1: targetPoint.y, - x2: foundLine.x2, - y2: foundLine.y2 + x1: (isCurrentLine)?targetPoint.x:foundLine.x1, + y1: (isCurrentLine)?targetPoint.y:foundLine.y1, + x2: (isCurrentLine)?foundLine.x2:targetPoint.x, + y2: (isCurrentLine)?foundLine.y2:targetPoint.y, }); updatedLines.push(foundLine); } else {