diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index d4417f9c..365fa119 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -5404,6 +5404,80 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => { .toNumber(), ] + const oppositeHipPoints = [] + const ridgeEdge = { vertex1: { x: points[0], y: points[1] }, vertex2: { x: points[2], y: points[3] } } + if (prevLine.attributes.type === LINE_TYPE.WALLLINE.EAVES && beforePrevLine.line.attributes.type === LINE_TYPE.WALLLINE.EAVES) { + let hipVector = getHalfAngleVector(prevLine, beforePrevLine.line) + /** 이전 라인과의 사이 추녀마루의 각도를 확인한다, 각도가 지붕안쪽으로 향하지 않을때 반대로 처리한다.*/ + const checkPoint = { + x: Big(prevLine.x1).plus(Big(hipVector.x).times(10)), + y: Big(prevLine.y1).plus(Big(hipVector.y).times(10)), + } + if (!checkWallPolygon.inPolygon(checkPoint)) { + hipVector = { x: -hipVector.x, y: -hipVector.y } + } + + const hipEdge = { + vertex1: { x: prevLine.x1, y: prevLine.y1 }, + vertex2: { + x: Big(prevLine.x1).plus(Big(hipVector.x).times(prevLine.attributes.planeSize)).toNumber(), + y: Big(prevLine.y1).plus(Big(hipVector.y).times(prevLine.attributes.planeSize)).toNumber(), + }, + } + const intersection = edgesIntersection(ridgeEdge, hipEdge) + if (intersection) { + const size = Big(points[0] - intersection.x) + .abs() + .pow(2) + .plus( + Big(points[1] - intersection.y) + .abs() + .pow(2), + ) + .sqrt() + .toNumber() + oppositeHipPoints.push({ x: intersection.x, y: intersection.y, size }) + } + } + if (nextLine.attributes.type === LINE_TYPE.WALLLINE.EAVES && afterNextLine.line.attributes.type === LINE_TYPE.WALLLINE.EAVES) { + let hipVector = getHalfAngleVector(nextLine, afterNextLine.line) + /** 이전 라인과의 사이 추녀마루의 각도를 확인한다, 각도가 지붕안쪽으로 향하지 않을때 반대로 처리한다.*/ + const checkPoint = { + x: Big(nextLine.x1).plus(Big(hipVector.x).times(10)), + y: Big(nextLine.y1).plus(Big(hipVector.y).times(10)), + } + if (!checkWallPolygon.inPolygon(checkPoint)) { + hipVector = { x: -hipVector.x, y: -hipVector.y } + } + + const hipEdge = { + vertex1: { x: nextLine.x2, y: nextLine.y2 }, + vertex2: { + x: Big(nextLine.x2).plus(Big(hipVector.x).times(nextLine.attributes.planeSize)).toNumber(), + y: Big(nextLine.y2).plus(Big(hipVector.y).times(nextLine.attributes.planeSize)).toNumber(), + }, + } + const intersection = edgesIntersection(ridgeEdge, hipEdge) + if (intersection) { + const size = Big(points[0] - intersection.x) + .abs() + .pow(2) + .plus( + Big(points[1] - intersection.y) + .abs() + .pow(2), + ) + .sqrt() + .toNumber() + oppositeHipPoints.push({ x: intersection.x, y: intersection.y, size }) + } + } + if (oppositeHipPoints.length > 0) { + const oppositeHipPoint = oppositeHipPoints.sort((a, b) => a.size - b.size)[0] + points[2] = oppositeHipPoint.x + points[3] = oppositeHipPoint.y + } + /** 동일 라인이 있는지 확인. */ if ( baseRidgeLines.filter((line) => { @@ -5423,7 +5497,10 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => { } const ridgeLine = drawRidgeLine(points, canvas, roof, textMode) - if (gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type)) { + if ( + oppositeHipPoints.length === 0 && + (gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type)) + ) { baseGableRidgeLines.push(ridgeLine) } else { baseRidgeLines.push(ridgeLine) @@ -5453,7 +5530,10 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => { nextHipLine.fire('modified') canvas.renderAll() - if (gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type)) { + if ( + oppositeHipPoints.length === 0 && + (gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type)) + ) { const oppositeLine = gableType.includes(beforePrevLine.line.attributes.type) ? beforePrevLine.line : afterNextLine.line if (Math.sign(ridgeLine.x1 - ridgeLine.x2) === 0) { const gableVector = Math.sign(ridgeLine.x1 - oppositeLine.x1) @@ -6072,22 +6152,12 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => { }) intersectRidgePoints.sort((prev, current) => prev.size.minus(current.size).toNumber()) if (intersectRidgePoints.length > 0) { - const oldPlaneSize = hipLine.line.attributes.planeSize - const oldActualSize = hipLine.line.attributes.actualSize - const theta = Big(Math.acos(Big(oldPlaneSize).div(oldActualSize))) - .times(180) - .div(Math.PI) - const planeSize = calcLinePlaneSize({ - x1: hipLine.line.x1, - y1: hipLine.line.y1, - x2: hipLine.line.x2, - y2: hipLine.line.y2, - }) hipLine.x2 = intersectRidgePoints[0].x hipLine.y2 = intersectRidgePoints[0].y hipLine.line.set({ x2: intersectRidgePoints[0].x, y2: intersectRidgePoints[0].y }) - hipLine.line.attributes.planeSize = planeSize - hipLine.line.attributes.actualSize = planeSize === oldActualSize ? 0 : Big(planeSize).div(theta).round(1).toNumber() + const hipSize = reCalculateSize(hipLine.line) + hipLine.line.attributes.planeSize = hipSize.planeSize + hipLine.line.attributes.actualSize = hipSize.actualSize hipLine.line.fire('modified') } }