From d5b24265961cf73fedb7b4aa21819787a6b5e23e Mon Sep 17 00:00:00 2001 From: ysCha Date: Tue, 23 Jun 2026 15:54:22 +0900 Subject: [PATCH] =?UTF-8?q?[A=ED=83=80=EC=9E=85]=20=EC=A7=80=EB=B6=95?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=85=B8=EC=B9=98=20=EA=B2=B0=ED=95=A9?= =?UTF-8?q?=EB=A9=B4=20=EC=A4=91=EB=B3=B5=20roofLine=20=EC=8A=A4=ED=82=B5?= =?UTF-8?q?=20=EA=B0=80=EB=93=9C=20=EC=B6=94=EA=B0=80=20=E2=80=94=20H-8=20?= =?UTF-8?q?=EA=B3=BC=EA=B8=B8=EC=9D=B4(=EB=A7=88=EB=A3=A8=20=EC=9C=84=20?= =?UTF-8?q?=EA=B2=B9=EC=B9=A8)=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/qpolygon-utils.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 7a8ddda7..789acdb8 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1598,6 +1598,29 @@ export const drawGableRoof = (roofId, canvas, textMode) => { } else if (Math.abs(normalizedAngle - 90) <= tolerance) { isVertical = true } + // [GABLE-H8 2026-06-23] 노치 결합면에서 직교정렬이 만든 same-direction roofLine 이 기존 마루 + // 구간 안에 완전히 포함되면(= 마루 위 중복선, isAlready 는 끝점 정확매칭이라 못 거름) 그리지 않는다. + // 마루가 이미 그 경계를 닫고 있으므로 중복 roofLine(H-8 과길이 원인)만 제거. cross-direction(hip)· + // 부분겹침은 건드리지 않아 정상 A타입 회귀 없음. + const _segSameDir = (analyze.isHorizontal && isHorizontal) || (analyze.isVertical && isVertical) + if (_segSameDir) { + const segV = Math.abs(points[0] - points[2]) < 1 + const sMin = segV ? Math.min(points[1], points[3]) : Math.min(points[0], points[2]) + const sMax = segV ? Math.max(points[1], points[3]) : Math.max(points[0], points[2]) + const coveredByRidge = ridgeLines.find((rg) => { + const rgV = Math.abs(rg.x1 - rg.x2) < 1 + if (rgV !== segV) return false + if (segV) { + if (Math.abs(rg.x1 - points[0]) >= 1) return false + return Math.min(rg.y1, rg.y2) - 1 <= sMin && sMax <= Math.max(rg.y1, rg.y2) + 1 + } + if (Math.abs(rg.y1 - points[1]) >= 1) return false + return Math.min(rg.x1, rg.x2) - 1 <= sMin && sMax <= Math.max(rg.x1, rg.x2) + 1 + }) + if (coveredByRidge) { + return true + } + } if (analyze.isHorizontal) { //현재라인이 수평선일때 if (isHorizontal) {