Compare commits

..

No commits in common. "a124f8dafbcaa4082c59fac7cb490bc91088f85c" and "2b15dfb80130521c577f560ad03e67c3451d6aca" have entirely different histories.

View File

@ -608,53 +608,39 @@ export const drawGableRoof = (roofId, canvas, textMode) => {
} }
} }
let currentRoof const findEdge = { vertex1: { x: midX, y: midY }, vertex2: { x: midX + roofVector.x * offset, y: midY + roofVector.y * offset } }
if (line.attributes.offset === 0) { const edgeDx =
checkRoofLines.forEach((roofLine) => { Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1
const isVerticalSame = line.y1 === roofLine.y1 && line.y2 === roofLine.y2 ? 0
const isHorizontalSame = line.x1 === roofLine.x1 && line.x2 === roofLine.x2 : Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).toNumber()
if ( const edgeDy =
(isVerticalSame || isHorizontalSame) && Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1
(isPointOnLineNew(roofLine, { x: line.x1, y: line.y1 }) || isPointOnLineNew(roofLine, { x: line.x2, y: line.y2 })) ? 0
) { : Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).toNumber()
currentRoof = { roofLine } const edgeLength = Math.sqrt(edgeDx * edgeDx + edgeDy * edgeDy)
} const edgeVector = { x: edgeDx / edgeLength, y: edgeDy / edgeLength }
})
} else {
const findEdge = { vertex1: { x: midX, y: midY }, vertex2: { x: midX + roofVector.x * offset, y: midY + roofVector.y * offset } }
const edgeDx =
Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1
? 0
: Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).toNumber()
const edgeDy =
Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1
? 0
: Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).toNumber()
const edgeLength = Math.sqrt(edgeDx * edgeDx + edgeDy * edgeDy)
const edgeVector = { x: edgeDx / edgeLength, y: edgeDy / edgeLength }
const intersectRoofLines = [] const intersectRoofLines = []
checkRoofLines.forEach((roofLine) => { checkRoofLines.forEach((roofLine) => {
const lineEdge = { vertex1: { x: roofLine.x1, y: roofLine.y1 }, vertex2: { x: roofLine.x2, y: roofLine.y2 } } const lineEdge = { vertex1: { x: roofLine.x1, y: roofLine.y1 }, vertex2: { x: roofLine.x2, y: roofLine.y2 } }
const intersect = edgesIntersection(lineEdge, findEdge) const intersect = edgesIntersection(lineEdge, findEdge)
if (intersect) { if (intersect) {
const intersectDx = const intersectDx =
Big(intersect.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1 ? 0 : Big(intersect.x).minus(Big(findEdge.vertex1.x)).toNumber() Big(intersect.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1 ? 0 : Big(intersect.x).minus(Big(findEdge.vertex1.x)).toNumber()
const intersectDy = const intersectDy =
Big(intersect.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1 ? 0 : Big(intersect.y).minus(Big(findEdge.vertex1.y)).toNumber() Big(intersect.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1 ? 0 : Big(intersect.y).minus(Big(findEdge.vertex1.y)).toNumber()
const intersectLength = Math.sqrt(intersectDx * intersectDx + intersectDy * intersectDy) const intersectLength = Math.sqrt(intersectDx * intersectDx + intersectDy * intersectDy)
const intersectVector = { x: intersectDx / intersectLength, y: intersectDy / intersectLength } const intersectVector = { x: intersectDx / intersectLength, y: intersectDy / intersectLength }
if (edgeVector.x === intersectVector.x && edgeVector.y === intersectVector.y) { if (edgeVector.x === intersectVector.x && edgeVector.y === intersectVector.y) {
intersectRoofLines.push({ roofLine, intersect, length: intersectLength }) intersectRoofLines.push({ roofLine, intersect, length: intersectLength })
}
} }
})
intersectRoofLines.sort((a, b) => a.length - b.length)
currentRoof = intersectRoofLines.find((roof) => isPointOnLineNew(roof.roofLine, roof.intersect) && roof.length - offset < 0.1)
if (!currentRoof) {
currentRoof = intersectRoofLines[0]
} }
})
intersectRoofLines.sort((a, b) => a.length - b.length)
let currentRoof = intersectRoofLines.find((roof) => isPointOnLineNew(roof.roofLine, roof.intersect) && roof.length - offset < 0.1)
if (!currentRoof) {
currentRoof = intersectRoofLines[0]
} }
let startPoint, endPoint let startPoint, endPoint
@ -938,16 +924,11 @@ export const drawGableRoof = (roofId, canvas, textMode) => {
const y2 = analyze.endPoint.y const y2 = analyze.endPoint.y
const lineVector = { x: 0, y: 0 } const lineVector = { x: 0, y: 0 }
if (currentLine.attributes.offset === 0) { if (analyze.isHorizontal) {
lineVector.x = analyze.roofVector.y lineVector.x = Math.sign(analyze.roofLine.y1 - currentLine.attributes.originPoint.y1)
lineVector.y = analyze.roofVector.x }
} else { if (analyze.isVertical) {
if (analyze.isHorizontal) { lineVector.y = Math.sign(analyze.roofLine.x1 - currentLine.attributes.originPoint.x1)
lineVector.x = Math.sign(analyze.roofLine.y1 - currentLine.attributes.originPoint.y1)
}
if (analyze.isVertical) {
lineVector.y = Math.sign(analyze.roofLine.x1 - currentLine.attributes.originPoint.x1)
}
} }
const overlapLines = [] const overlapLines = []
@ -1923,53 +1904,40 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
roofVector = { x: 1, y: 0 } roofVector = { x: 1, y: 0 }
} }
} }
let currentRoof
if (line.attributes.offset === 0) {
checkRoofLines.forEach((roofLine) => {
const isVerticalSame = line.y1 === roofLine.y1 && line.y2 === roofLine.y2
const isHorizontalSame = line.x1 === roofLine.x1 && line.x2 === roofLine.x2
if (
(isVerticalSame || isHorizontalSame) &&
(isPointOnLineNew(roofLine, { x: line.x1, y: line.y1 }) || isPointOnLineNew(roofLine, { x: line.x2, y: line.y2 }))
) {
currentRoof = { roofLine }
}
})
} else {
const findEdge = { vertex1: { x: midX, y: midY }, vertex2: { x: midX + roofVector.x * offset, y: midY + roofVector.y * offset } }
const edgeDx =
Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1
? 0
: Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).toNumber()
const edgeDy =
Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1
? 0
: Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).toNumber()
const edgeLength = Math.sqrt(edgeDx * edgeDx + edgeDy * edgeDy)
const edgeVector = { x: edgeDx / edgeLength, y: edgeDy / edgeLength }
const intersectRoofLines = [] const findEdge = { vertex1: { x: midX, y: midY }, vertex2: { x: midX + roofVector.x * offset, y: midY + roofVector.y * offset } }
checkRoofLines.forEach((roofLine) => { const edgeDx =
const lineEdge = { vertex1: { x: roofLine.x1, y: roofLine.y1 }, vertex2: { x: roofLine.x2, y: roofLine.y2 } } Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1
const intersect = edgesIntersection(lineEdge, findEdge) ? 0
if (intersect) { : Big(findEdge.vertex2.x).minus(Big(findEdge.vertex1.x)).toNumber()
const intersectDx = const edgeDy =
Big(intersect.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1 ? 0 : Big(intersect.x).minus(Big(findEdge.vertex1.x)).toNumber() Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1
const intersectDy = ? 0
Big(intersect.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1 ? 0 : Big(intersect.y).minus(Big(findEdge.vertex1.y)).toNumber() : Big(findEdge.vertex2.y).minus(Big(findEdge.vertex1.y)).toNumber()
const intersectLength = Math.sqrt(intersectDx * intersectDx + intersectDy * intersectDy) const edgeLength = Math.sqrt(edgeDx * edgeDx + edgeDy * edgeDy)
const intersectVector = { x: intersectDx / intersectLength, y: intersectDy / intersectLength } const edgeVector = { x: edgeDx / edgeLength, y: edgeDy / edgeLength }
if (edgeVector.x === intersectVector.x && edgeVector.y === intersectVector.y) {
intersectRoofLines.push({ roofLine, intersect, length: intersectLength })
}
}
})
intersectRoofLines.sort((a, b) => a.length - b.length) const intersectRoofLines = []
currentRoof = intersectRoofLines.find((roof) => isPointOnLineNew(roof.roofLine, roof.intersect) && roof.length - offset < 0.1) checkRoofLines.forEach((roofLine) => {
if (!currentRoof) { const lineEdge = { vertex1: { x: roofLine.x1, y: roofLine.y1 }, vertex2: { x: roofLine.x2, y: roofLine.y2 } }
currentRoof = intersectRoofLines[0] const intersect = edgesIntersection(lineEdge, findEdge)
if (intersect) {
const intersectDx =
Big(intersect.x).minus(Big(findEdge.vertex1.x)).abs().toNumber() < 0.1 ? 0 : Big(intersect.x).minus(Big(findEdge.vertex1.x)).toNumber()
const intersectDy =
Big(intersect.y).minus(Big(findEdge.vertex1.y)).abs().toNumber() < 0.1 ? 0 : Big(intersect.y).minus(Big(findEdge.vertex1.y)).toNumber()
const intersectLength = Math.sqrt(intersectDx * intersectDx + intersectDy * intersectDy)
const intersectVector = { x: intersectDx / intersectLength, y: intersectDy / intersectLength }
if (edgeVector.x === intersectVector.x && edgeVector.y === intersectVector.y) {
intersectRoofLines.push({ roofLine, intersect, length: intersectLength })
}
} }
})
intersectRoofLines.sort((a, b) => a.length - b.length)
let currentRoof = intersectRoofLines.find((roof) => isPointOnLineNew(roof.roofLine, roof.intersect) && roof.length - offset < 0.1)
if (!currentRoof) {
currentRoof = intersectRoofLines[0]
} }
let startPoint, endPoint let startPoint, endPoint
@ -3321,8 +3289,6 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
prevLine = baseLines[(index - 1 + baseLines.length) % baseLines.length] prevLine = baseLines[(index - 1 + baseLines.length) % baseLines.length]
} }
}) })
const prevIndex = baseLines.findIndex((line) => line === prevLine)
const nextIndex = baseLines.findIndex((line) => line === nextLine)
//양옆이 처마가 아닐때 패스 //양옆이 처마가 아닐때 패스
if (prevLine.attributes.type !== LINE_TYPE.WALLLINE.EAVES || nextLine.attributes.type !== LINE_TYPE.WALLLINE.EAVES) { if (prevLine.attributes.type !== LINE_TYPE.WALLLINE.EAVES || nextLine.attributes.type !== LINE_TYPE.WALLLINE.EAVES) {
@ -3411,24 +3377,14 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
ridgePoint[2] += ridgeVector.x * offset ridgePoint[2] += ridgeVector.x * offset
ridgePoint[3] += ridgeVector.y * offset ridgePoint[3] += ridgeVector.y * offset
const alreadyRidge = linesAnalysis.find( linesAnalysis.push({
(line) => start: { x: ridgePoint[0], y: ridgePoint[1] },
line.type === TYPES.RIDGE && end: { x: ridgePoint[2], y: ridgePoint[3] },
line.start.x === ridgePoint[0] && left: baseLines.findIndex((line) => line === prevLine),
line.start.y === ridgePoint[1] && right: baseLines.findIndex((line) => line === nextLine),
line.end.x === ridgePoint[2] && type: TYPES.RIDGE,
line.end.y === ridgePoint[3], degree: 0,
) })
if (!alreadyRidge) {
linesAnalysis.push({
start: { x: ridgePoint[0], y: ridgePoint[1] },
end: { x: ridgePoint[2], y: ridgePoint[3] },
left: prevIndex,
right: nextIndex,
type: TYPES.RIDGE,
degree: 0,
})
}
} else { } else {
if (beforePrevLine.attributes.type === LINE_TYPE.WALLLINE.GABLE) { if (beforePrevLine.attributes.type === LINE_TYPE.WALLLINE.GABLE) {
const beforeVector = { const beforeVector = {
@ -4027,24 +3983,14 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
endPoint = { x: point[0], y: point[1] } endPoint = { x: point[0], y: point[1] }
} }
} }
const alreadyRidge = linesAnalysis.find( linesAnalysis.push({
(line) => start: startPoint,
line.type === TYPES.RIDGE && end: endPoint,
line.start.x === startPoint.x && left: baseLines.findIndex((line) => line === r.left),
line.start.y === startPoint.y && right: baseLines.findIndex((line) => line === r.right),
line.end.x === endPoint.x && type: TYPES.RIDGE,
line.end.y === endPoint.y, degree: 0,
) })
if (!alreadyRidge) {
linesAnalysis.push({
start: startPoint,
end: endPoint,
left: prevIndex,
right: nextIndex,
type: TYPES.RIDGE,
degree: 0,
})
}
} }
}) })
} }
@ -4090,8 +4036,8 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
linesAnalysis.push({ linesAnalysis.push({
start: startPoint, start: startPoint,
end: { x: correctPoint.x, y: correctPoint.y }, end: { x: correctPoint.x, y: correctPoint.y },
left: prevIndex, left: baseLines.findIndex((line) => line === prevLine),
right: nextIndex, right: baseLines.findIndex((line) => line === nextLine),
type: TYPES.GABLE_LINE, type: TYPES.GABLE_LINE,
degree: getDegreeByChon(prevLine.attributes.pitch), degree: getDegreeByChon(prevLine.attributes.pitch),
gableId: baseLines.findIndex((line) => line === currentLine), gableId: baseLines.findIndex((line) => line === currentLine),
@ -4518,13 +4464,14 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
if (isOpposite) { if (isOpposite) {
const points = [currentLine.start.x, currentLine.start.y, partnerLine.start.x, partnerLine.start.y] const points = [currentLine.start.x, currentLine.start.y, partnerLine.start.x, partnerLine.start.y]
const length = Math.sqrt((points[0] - points[2]) ** 2 + (points[1] - points[3]) ** 2) const length = Math.sqrt((points[0] - points[2]) ** 2 + (points[1] - points[3]) ** 2)
const isDiagonal = Math.abs(points[0] - points[2]) >= 1 && Math.abs(points[1] - points[3]) >= 1
if (length > EPSILON) { if (length > 0) {
if (currentLine.type === TYPES.HIP) { if (currentLine.type === TYPES.HIP) {
innerLines.push(drawHipLine(points, canvas, roof, textMode, currentDegree, currentDegree)) innerLines.push(drawHipLine(points, canvas, roof, textMode, currentDegree, currentDegree))
} else if (currentLine.type === TYPES.RIDGE && !isDiagonal) { } else if (currentLine.type === TYPES.RIDGE) {
innerLines.push(drawRidgeLine(points, canvas, roof, textMode)) innerLines.push(drawRidgeLine(points, canvas, roof, textMode))
} else if (currentLine.type === TYPES.NEW) { } else if (currentLine.type === TYPES.NEW) {
const isDiagonal = Math.abs(points[0] - points[2]) >= 1 && Math.abs(points[1] - points[3]) >= 1
if (isDiagonal && almostEqual(Math.abs(points[0] - points[2]), Math.abs(points[1] - points[3]))) { if (isDiagonal && almostEqual(Math.abs(points[0] - points[2]), Math.abs(points[1] - points[3]))) {
innerLines.push(drawHipLine(points, canvas, roof, textMode, currentDegree, currentDegree)) innerLines.push(drawHipLine(points, canvas, roof, textMode, currentDegree, currentDegree))
} }
@ -4549,12 +4496,11 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
const length = Math.sqrt((points[0].x - points[1].x) ** 2 + (points[0].y - points[1].y) ** 2) const length = Math.sqrt((points[0].x - points[1].x) ** 2 + (points[0].y - points[1].y) ** 2)
if (length < EPSILON) return if (length < EPSILON) return
const isDiagonal = Math.abs(points[0].x - points[1].x) >= 1 && Math.abs(points[0].y - points[1].y) >= 1 const isDiagonal = Math.abs(points[0].x - points[1].x) >= 1 && Math.abs(points[0].y - points[1].y) >= 1
if (isDiagonal && almostEqual(Math.abs(points[0] - points[2]), Math.abs(points[1] - points[3]))) { if (isDiagonal) {
innerLines.push( innerLines.push(
drawHipLine([points[0].x, points[0].y, points[1].x, points[1].y], canvas, roof, textMode, currentDegree, currentDegree), drawHipLine([points[0].x, points[0].y, points[1].x, points[1].y], canvas, roof, textMode, currentDegree, currentDegree),
) )
} } else {
if (!isDiagonal) {
innerLines.push(drawRidgeLine([points[0].x, points[0].y, points[1].x, points[1].y], canvas, roof, textMode)) innerLines.push(drawRidgeLine([points[0].x, points[0].y, points[1].x, points[1].y], canvas, roof, textMode))
} }
proceedAnalysis.push(currentLine, partnerLine) proceedAnalysis.push(currentLine, partnerLine)
@ -4599,6 +4545,7 @@ export const drawRoofByAttribute = (roofId, canvas, textMode) => {
} }
}) })
} }
//케라바에서 파생된 하단 지붕 라인처리 //케라바에서 파생된 하단 지붕 라인처리
const downRoofGable = [] const downRoofGable = []
//처마에서 파생된 하단 지붕 라인 처리 //처마에서 파생된 하단 지붕 라인 처리