From aa0bfac88faa4da6bc817c8f5f349a68d81be11b Mon Sep 17 00:00:00 2001 From: Jaeyoung Lee Date: Wed, 7 Aug 2024 17:27:30 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=B9=EC=B3=90=EC=A7=80=EB=8A=94=20?= =?UTF-8?q?=EB=A7=88=EB=A3=A8=EB=A5=BC=20=ED=95=98=EB=82=98=EC=9D=98=20?= =?UTF-8?q?=EC=84=A0=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/qpolygon-utils.js | 58 +++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 0999660c..0e8029eb 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1349,8 +1349,64 @@ const drawRoofRidge = (polygon) => { }) //중복 제거 polygon.ridges = polygon.ridges.filter((ridge, index, self) => index === self.findIndex((t) => t.x1 === ridge.x1 && t.y1 === ridge.y1)) - // console.log('polygon.ridges', polygon.ridges) + polygon.innerLines = polygon.innerLines.filter((line, index, self) => index === self.findIndex((t) => t.x1 === line.x1 && t.y1 === line.y1)) + //겹쳐지는 마루는 하나로 합침 + polygon.ridges.forEach((ridge, index) => { + polygon.ridges + .filter((ridge2) => !(ridge.x1 === ridge2.x1 && ridge.y1 === ridge2.y1 && ridge.x2 === ridge2.x2 && ridge.y2 === ridge2.y2)) + .forEach((ridge2) => { + let overlap = segmentsOverlap(ridge, ridge2) + if (overlap) { + let x1 = Math.min(ridge.x1, ridge2.x1, ridge.x2, ridge2.x2) + let x2 = Math.max(ridge.x1, ridge2.x1, ridge.x2, ridge2.x2) + let y1 = Math.min(ridge.y1, ridge2.y1, ridge.y2, ridge2.y2) + let y2 = Math.max(ridge.y1, ridge2.y1, ridge.y2, ridge2.y2) + const newRidge = new QLine([x1, y1, x2, y2], { + fontSize: polygon.fontSize, + stroke: 'blue', + strokeWidth: 1, + }) + polygon.canvas.remove(ridge) + polygon.canvas.remove(ridge2) + polygon.ridges = polygon.ridges.filter((r) => !(ridge.x1 === r.x1 && ridge.y1 === r.y1 && ridge.x2 === r.x2 && ridge.y2 === r.y2)) + polygon.ridges = polygon.ridges.filter((r) => !(ridge2.x1 === r.x1 && ridge2.y1 === r.y1 && ridge2.x2 === r.x2 && ridge2.y2 === r.y2)) + polygon.innerLines = polygon.innerLines.filter((r) => !(ridge.x1 === r.x1 && ridge.y1 === r.y1 && ridge.x2 === r.x2 && ridge.y2 === r.y2)) + polygon.innerLines = polygon.innerLines.filter( + (r) => !(ridge2.x1 === r.x1 && ridge2.y1 === r.y1 && ridge2.x2 === r.x2 && ridge2.y2 === r.y2), + ) + + polygon.canvas.add(newRidge) + polygon.ridges.push(newRidge) + polygon.innerLines.push(newRidge) + } + }) + }) } + +/** + * 두 선분이 겹치는지 확인 + * @param line1 + * @param line2 + * @returns {boolean} + */ +const segmentsOverlap = (line1, line2) => { + if (line1.y1 === line1.y2 && line2.y1 === line2.y2 && line1.y1 === line2.y1) { + // console.log('가로방향 겹침 확인 ') + if ((line1.x1 <= line2.x1 && line1.x2 >= line2.x1) || (line1.x1 <= line2.x2 && line1.x2 >= line2.x2)) { + // console.log('가로방향 겹침') + return true + } + } + if (line1.x1 === line1.x2 && line2.x1 === line2.x2 && line1.x1 === line2.x1) { + // console.log('세로방향 겹침 확인') + if ((line1.y1 <= line2.y1 && line1.y2 >= line2.y1) || (line1.y1 <= line2.y2 && line1.y2 >= line2.y2)) { + // console.log('세로방향 겹침') + return true + } + } + return false +} + const drawHips = (polygon) => { /* 마루에서 시작되는 hip을 먼저 그립니다.