지붕 형상 로직 변경 및 시계방향 외벽선 작도에 대한 대응
This commit is contained in:
parent
213b020a3d
commit
6397de0e76
@ -68,6 +68,8 @@ export function useRoofShapeSetting(id) {
|
|||||||
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
||||||
const { post } = useAxios(globalLocaleState)
|
const { post } = useAxios(globalLocaleState)
|
||||||
|
|
||||||
|
const { addLine, removeLine } = useLine()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
pitchRef.current = currentAngleType === ANGLE_TYPE.SLOPE ? pitch : getChonByDegree(pitch)
|
pitchRef.current = currentAngleType === ANGLE_TYPE.SLOPE ? pitch : getChonByDegree(pitch)
|
||||||
}, [pitch])
|
}, [pitch])
|
||||||
@ -182,6 +184,41 @@ export function useRoofShapeSetting(id) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 외벽선이 시계방향인지 시계반대 방향인지 확인
|
||||||
|
*/
|
||||||
|
const outerLinePoints = outerLines.map((line) => ({ x: line.x1, y: line.y1 }))
|
||||||
|
let counterClockwise = true
|
||||||
|
let signedArea = 0
|
||||||
|
|
||||||
|
outerLinePoints.forEach((point, index) => {
|
||||||
|
const nextPoint = outerLinePoints[(index + 1) % outerLinePoints.length]
|
||||||
|
signedArea += point.x * nextPoint.y - point.y * nextPoint.x
|
||||||
|
})
|
||||||
|
|
||||||
|
if (signedArea > 0) {
|
||||||
|
counterClockwise = false
|
||||||
|
}
|
||||||
|
/** 시계 방향일 경우 외벽선 reverse*/
|
||||||
|
if (!counterClockwise) {
|
||||||
|
outerLines.reverse().forEach((line, index) => {
|
||||||
|
addLine([line.x2, line.y2, line.x1, line.y1], {
|
||||||
|
stroke: line.stroke,
|
||||||
|
strokeWidth: line.strokeWidth,
|
||||||
|
idx: index,
|
||||||
|
selectable: line.selectable,
|
||||||
|
name: 'outerLine',
|
||||||
|
x1: line.x2,
|
||||||
|
y1: line.y2,
|
||||||
|
x2: line.x1,
|
||||||
|
y2: line.y1,
|
||||||
|
visible: line.visible,
|
||||||
|
})
|
||||||
|
canvas.remove(line)
|
||||||
|
})
|
||||||
|
canvas.renderAll()
|
||||||
|
}
|
||||||
|
|
||||||
if ([1, 2, 3, 5, 6, 7, 8].includes(shapeNum)) {
|
if ([1, 2, 3, 5, 6, 7, 8].includes(shapeNum)) {
|
||||||
// 변별로 설정이 아닌 경우 경사를 지붕재에 적용해주어야함
|
// 변별로 설정이 아닌 경우 경사를 지붕재에 적용해주어야함
|
||||||
setRoofPitch()
|
setRoofPitch()
|
||||||
|
|||||||
@ -2555,7 +2555,7 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
|
|||||||
{ x: currentRoof.x2, y: currentRoof.y2 },
|
{ x: currentRoof.x2, y: currentRoof.y2 },
|
||||||
]
|
]
|
||||||
const prevHipLines = []
|
const prevHipLines = []
|
||||||
const nextHipLine = []
|
const nextHipLines = []
|
||||||
let prevLineRidge, nextLineRidge
|
let prevLineRidge, nextLineRidge
|
||||||
|
|
||||||
baseHipLines.forEach((current) => {
|
baseHipLines.forEach((current) => {
|
||||||
@ -2584,7 +2584,7 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
|
|||||||
y: line.y1,
|
y: line.y1,
|
||||||
}))
|
}))
|
||||||
) {
|
) {
|
||||||
nextHipLine.push(current)
|
nextHipLines.push(current)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
prevHipLines.forEach((current) => {
|
prevHipLines.forEach((current) => {
|
||||||
@ -2633,7 +2633,7 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
nextHipLine.forEach((current) => {
|
nextHipLines.forEach((current) => {
|
||||||
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
||||||
let findPoint
|
let findPoint
|
||||||
if (Math.abs(current.x1 - currentRoof.x2) <= 1 && Math.abs(current.y1 - currentRoof.y2) <= 1) {
|
if (Math.abs(current.x1 - currentRoof.x2) <= 1 && Math.abs(current.y1 - currentRoof.y2) <= 1) {
|
||||||
@ -2740,235 +2740,236 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
|
|||||||
/** 4각*/
|
/** 4각*/
|
||||||
if (prevLineRidge === nextLineRidge) {
|
if (prevLineRidge === nextLineRidge) {
|
||||||
polygonPoints.push({ x: ridgeLine.x1, y: ridgeLine.y1 }, { x: ridgeLine.x2, y: ridgeLine.y2 })
|
polygonPoints.push({ x: ridgeLine.x1, y: ridgeLine.y1 }, { x: ridgeLine.x2, y: ridgeLine.y2 })
|
||||||
}
|
|
||||||
/** 6각이상*/
|
|
||||||
let isOverLap =
|
|
||||||
currentVectorX === 0
|
|
||||||
? (prevLineRidge.y1 <= nextLineRidge.y1 && prevLineRidge.y2 >= nextLineRidge.y1) ||
|
|
||||||
(prevLineRidge.y1 >= nextLineRidge.y1 && prevLineRidge.y2 <= nextLineRidge.y1) ||
|
|
||||||
(prevLineRidge.y1 <= nextLineRidge.y2 && prevLineRidge.y2 >= nextLineRidge.y2) ||
|
|
||||||
(prevLineRidge.y1 >= nextLineRidge.y2 && prevLineRidge.y2 <= nextLineRidge.y2)
|
|
||||||
: (prevLineRidge.x1 <= nextLineRidge.x1 && prevLineRidge.x2 >= nextLineRidge.x1) ||
|
|
||||||
(prevLineRidge.x1 >= nextLineRidge.x1 && prevLineRidge.x2 <= nextLineRidge.x1) ||
|
|
||||||
(prevLineRidge.x1 <= nextLineRidge.x2 && prevLineRidge.x2 >= nextLineRidge.x2) ||
|
|
||||||
(prevLineRidge.x1 >= nextLineRidge.x2 && prevLineRidge.x2 <= nextLineRidge.x2)
|
|
||||||
if (isOverLap) {
|
|
||||||
const prevDistance = currentVectorX === 0 ? Math.abs(prevLineRidge.x1 - currentRoof.x1) : Math.abs(prevLineRidge.y1 - currentRoof.y1)
|
|
||||||
const nextDistance = currentVectorX === 0 ? Math.abs(nextLineRidge.x1 - currentRoof.x1) : Math.abs(nextLineRidge.y1 - currentRoof.y1)
|
|
||||||
|
|
||||||
/** 현재 지붕 라인과 먼 라인의 포인트를 온전히 사용한다. */
|
|
||||||
if (Math.abs(prevDistance - nextDistance) < 1) {
|
|
||||||
const minX = Math.min(currentRoof.x1, currentRoof.x2, currentLine.x1, currentLine.x2)
|
|
||||||
const maxX = Math.max(currentRoof.x1, currentRoof.x2, currentLine.x1, currentLine.x2)
|
|
||||||
const minY = Math.min(currentRoof.y1, currentRoof.y2, currentLine.y1, currentLine.y2)
|
|
||||||
const maxY = Math.max(currentRoof.y1, currentRoof.y2, currentLine.y1, currentLine.y2)
|
|
||||||
if (currentVectorX === 0) {
|
|
||||||
polygonPoints.push({ x: prevLineRidge.x1, y: minY }, { x: prevLineRidge.x1, y: maxY })
|
|
||||||
} else {
|
|
||||||
polygonPoints.push({ x: minX, y: prevLineRidge.y1 }, { x: maxX, y: prevLineRidge.y1 })
|
|
||||||
}
|
|
||||||
} else if (prevDistance < nextDistance) {
|
|
||||||
polygonPoints.push({ x: nextLineRidge.x1, y: nextLineRidge.y1 }, { x: nextLineRidge.x2, y: nextLineRidge.y2 })
|
|
||||||
|
|
||||||
/** 이전라인과 교차한 마루의 포인트*/
|
|
||||||
let prevRidgePoint1
|
|
||||||
if (prevLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
|
||||||
prevRidgePoint1 = polygonPoints.find(
|
|
||||||
(point) =>
|
|
||||||
(point.x === prevLineRidge.x1 && point.y === prevLineRidge.y1) || (point.x === prevLineRidge.x2 && point.y === prevLineRidge.y2),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
prevRidgePoint1 =
|
|
||||||
currentVectorX === 0
|
|
||||||
? currentRoof.y1 === prevLineRidge.y1
|
|
||||||
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
|
||||||
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
|
||||||
: currentRoof.x1 === prevLineRidge.x1
|
|
||||||
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
|
||||||
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
|
||||||
|
|
||||||
polygonPoints.push(prevRidgePoint1)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 다음 라인과 교차한 마루의 포인트 중 라인과 접하지 않은 포인트*/
|
|
||||||
let checkRidgePoint
|
|
||||||
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
|
||||||
const ridgePoint1 = polygonPoints.filter((point) => point.x === nextLineRidge.x1 && point.y === nextLineRidge.y1)
|
|
||||||
checkRidgePoint = ridgePoint1.length > 0 ? { x: nextLineRidge.x2, y: nextLineRidge.y2 } : { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
|
||||||
} else {
|
|
||||||
checkRidgePoint =
|
|
||||||
currentVectorX === 0
|
|
||||||
? currentRoof.y2 !== nextLineRidge.y1
|
|
||||||
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
|
||||||
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
|
||||||
: currentRoof.x2 !== nextLineRidge.x1
|
|
||||||
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
|
||||||
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
|
||||||
}
|
|
||||||
|
|
||||||
const prevRidgePoint2 =
|
|
||||||
currentVectorX === 0 ? { x: prevRidgePoint1.x, y: checkRidgePoint.y } : { x: checkRidgePoint.x, y: prevRidgePoint1.y }
|
|
||||||
polygonPoints.push(prevRidgePoint2)
|
|
||||||
} else {
|
|
||||||
polygonPoints.push({ x: prevLineRidge.x1, y: prevLineRidge.y1 }, { x: prevLineRidge.x2, y: prevLineRidge.y2 })
|
|
||||||
|
|
||||||
/** 다음라인과 교차한 마루의 포인트*/
|
|
||||||
let nextRidgePoint1
|
|
||||||
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
|
||||||
nextRidgePoint1 = polygonPoints.find(
|
|
||||||
(point) =>
|
|
||||||
(point.x === nextLineRidge.x1 && point.y === nextLineRidge.y1) || (point.x === nextLineRidge.x2 && point.y === nextLineRidge.y2),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
nextRidgePoint1 =
|
|
||||||
currentVectorX === 0
|
|
||||||
? currentRoof.y2 === nextLineRidge.y1
|
|
||||||
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
|
||||||
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
|
||||||
: currentRoof.x2 === nextLineRidge.x1
|
|
||||||
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
|
||||||
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
|
||||||
polygonPoints.push(nextRidgePoint1)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 이전 라인과 교차한 마루의 포인트 중 라인과 접하지 않은 포인트*/
|
|
||||||
let checkRidgePoint
|
|
||||||
if (prevLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
|
||||||
const ridgePoint1 = polygonPoints.filter((point) => point.x === prevLineRidge.x1 && point.y === prevLineRidge.y1)
|
|
||||||
checkRidgePoint = ridgePoint1.length > 0 ? { x: prevLineRidge.x2, y: prevLineRidge.y2 } : { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
|
||||||
} else {
|
|
||||||
checkRidgePoint =
|
|
||||||
currentVectorX === 0
|
|
||||||
? currentRoof.y1 !== prevLineRidge.y1
|
|
||||||
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
|
||||||
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
|
||||||
: currentRoof.x1 !== prevLineRidge.x1
|
|
||||||
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
|
||||||
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
|
||||||
}
|
|
||||||
|
|
||||||
const nextRidgePoint2 =
|
|
||||||
currentVectorX === 0 ? { x: nextRidgePoint1.x, y: checkRidgePoint.y } : { x: checkRidgePoint.x, y: nextRidgePoint1.y }
|
|
||||||
polygonPoints.push(nextRidgePoint2)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/** 마루가 겹치지 않을때 */
|
/** 6각이상*/
|
||||||
const otherRidgeLines = []
|
let isOverLap =
|
||||||
|
currentVectorX === 0
|
||||||
|
? (prevLineRidge.y1 <= nextLineRidge.y1 && prevLineRidge.y2 >= nextLineRidge.y1) ||
|
||||||
|
(prevLineRidge.y1 >= nextLineRidge.y1 && prevLineRidge.y2 <= nextLineRidge.y1) ||
|
||||||
|
(prevLineRidge.y1 <= nextLineRidge.y2 && prevLineRidge.y2 >= nextLineRidge.y2) ||
|
||||||
|
(prevLineRidge.y1 >= nextLineRidge.y2 && prevLineRidge.y2 <= nextLineRidge.y2)
|
||||||
|
: (prevLineRidge.x1 <= nextLineRidge.x1 && prevLineRidge.x2 >= nextLineRidge.x1) ||
|
||||||
|
(prevLineRidge.x1 >= nextLineRidge.x1 && prevLineRidge.x2 <= nextLineRidge.x1) ||
|
||||||
|
(prevLineRidge.x1 <= nextLineRidge.x2 && prevLineRidge.x2 >= nextLineRidge.x2) ||
|
||||||
|
(prevLineRidge.x1 >= nextLineRidge.x2 && prevLineRidge.x2 <= nextLineRidge.x2)
|
||||||
|
if (isOverLap) {
|
||||||
|
const prevDistance = currentVectorX === 0 ? Math.abs(prevLineRidge.x1 - currentRoof.x1) : Math.abs(prevLineRidge.y1 - currentRoof.y1)
|
||||||
|
const nextDistance = currentVectorX === 0 ? Math.abs(nextLineRidge.x1 - currentRoof.x1) : Math.abs(nextLineRidge.y1 - currentRoof.y1)
|
||||||
|
|
||||||
baseGableRidgeLines
|
/** 현재 지붕 라인과 먼 라인의 포인트를 온전히 사용한다. */
|
||||||
.filter((ridge) => ridge !== prevLineRidge && ridge !== nextLineRidge)
|
if (Math.abs(prevDistance - nextDistance) < 1) {
|
||||||
.filter((ridge) => (currentVectorX === 0 ? ridge.x1 === ridge.x2 : ridge.y1 === ridge.y2))
|
const minX = Math.min(currentRoof.x1, currentRoof.x2, currentLine.x1, currentLine.x2)
|
||||||
.filter((ridge) =>
|
const maxX = Math.max(currentRoof.x1, currentRoof.x2, currentLine.x1, currentLine.x2)
|
||||||
currentVectorX === 0 ? nextVectorX === Math.sign(nextLine.x1 - ridge.x1) : nextVectorY === Math.sign(nextLine.y1 - ridge.y1),
|
const minY = Math.min(currentRoof.y1, currentRoof.y2, currentLine.y1, currentLine.y2)
|
||||||
)
|
const maxY = Math.max(currentRoof.y1, currentRoof.y2, currentLine.y1, currentLine.y2)
|
||||||
.forEach((ridge) => {
|
if (currentVectorX === 0) {
|
||||||
const size = currentVectorX === 0 ? Math.abs(nextLine.x1 - ridge.x1) : Math.abs(nextLine.y1 - ridge.y1)
|
polygonPoints.push({ x: prevLineRidge.x1, y: minY }, { x: prevLineRidge.x1, y: maxY })
|
||||||
otherRidgeLines.push({ ridge, size })
|
|
||||||
})
|
|
||||||
if (otherRidgeLines.length > 0) {
|
|
||||||
const otherRidge = otherRidgeLines.sort((a, b) => a.size - b.size)[0].ridge
|
|
||||||
/**
|
|
||||||
* otherRidge이 prevRidgeLine, nextRidgeLine 과 currentLine의 사이에 있는지 확인해서 분할하여 작업
|
|
||||||
* 지붕의 덮힘이 다르기 때문
|
|
||||||
*/
|
|
||||||
const isInside =
|
|
||||||
currentVectorX === 0
|
|
||||||
? Math.abs(currentLine.x1 - otherRidge.x1) < Math.abs(currentLine.x1 - prevLineRidge.x1) &&
|
|
||||||
Math.abs(currentLine.x1 - otherRidge.x1) < Math.abs(currentLine.x1 - nextLineRidge.x1)
|
|
||||||
: Math.abs(currentLine.y1 - otherRidge.y1) < Math.abs(currentLine.y1 - prevLineRidge.y1) &&
|
|
||||||
Math.abs(currentLine.y1 - otherRidge.y1) < Math.abs(currentLine.y1 - nextLineRidge.y1)
|
|
||||||
|
|
||||||
if (isInside) {
|
|
||||||
polygonPoints.push(
|
|
||||||
{ x: prevLineRidge.x1, y: prevLineRidge.y1 },
|
|
||||||
{ x: prevLineRidge.x2, y: prevLineRidge.y2 },
|
|
||||||
{ x: nextLineRidge.x1, y: nextLineRidge.y1 },
|
|
||||||
{ x: nextLineRidge.x2, y: nextLineRidge.y2 },
|
|
||||||
)
|
|
||||||
|
|
||||||
let ridgeAllPoints = [
|
|
||||||
{ x: prevLineRidge.x1, y: prevLineRidge.y1 },
|
|
||||||
{ x: prevLineRidge.x2, y: prevLineRidge.y2 },
|
|
||||||
{ x: nextLineRidge.x1, y: nextLineRidge.y1 },
|
|
||||||
{ x: nextLineRidge.x2, y: nextLineRidge.y2 },
|
|
||||||
]
|
|
||||||
let ridgePoints = []
|
|
||||||
ridgeAllPoints.forEach((point) => {
|
|
||||||
let isOnLine = false
|
|
||||||
roof.lines.forEach((line) => {
|
|
||||||
if (isPointOnLine({ x1: line.x1, y1: line.y1, x2: line.x2, y2: line.y2 }, point)) {
|
|
||||||
isOnLine = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (!isOnLine) {
|
|
||||||
ridgePoints.push(point)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (ridgePoints.length === 2) {
|
|
||||||
if (Math.sign(otherRidge.x1 - otherRidge.x2) === 0) {
|
|
||||||
polygonPoints.push(
|
|
||||||
{ x: otherRidge.x1, y: ridgePoints[0].y },
|
|
||||||
{
|
|
||||||
x: otherRidge.x1,
|
|
||||||
y: ridgePoints[1].y,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
polygonPoints.push(
|
|
||||||
{ x: ridgePoints[0].x, y: otherRidge.y1 },
|
|
||||||
{
|
|
||||||
x: ridgePoints[1].x,
|
|
||||||
y: otherRidge.y1,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
polygonPoints.push({ x: otherRidge.x1, y: otherRidge.y1 }, { x: otherRidge.x2, y: otherRidge.y2 })
|
|
||||||
|
|
||||||
let ridgePoints = [
|
|
||||||
{ x: prevLineRidge.x1, y: prevLineRidge.y1 },
|
|
||||||
{ x: prevLineRidge.x2, y: prevLineRidge.y2 },
|
|
||||||
{ x: nextLineRidge.x1, y: nextLineRidge.y1 },
|
|
||||||
{ x: nextLineRidge.x2, y: nextLineRidge.y2 },
|
|
||||||
]
|
|
||||||
|
|
||||||
ridgePoints.forEach((point) => {
|
|
||||||
let isOnLine = false
|
|
||||||
roof.lines.forEach((line) => {
|
|
||||||
if (isPointOnLine({ x1: line.x1, y1: line.y1, x2: line.x2, y2: line.y2 }, point)) {
|
|
||||||
isOnLine = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (isOnLine) {
|
|
||||||
polygonPoints.push(point)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (Math.sign(otherRidge.x1 - otherRidge.x2) === 0) {
|
|
||||||
const prevY =
|
|
||||||
(prevLineRidge.y1 <= otherRidge.y1 && otherRidge.y1 <= prevLineRidge.y2) ||
|
|
||||||
(prevLineRidge.y1 >= otherRidge.y1 && otherRidge.y1 >= prevLineRidge.y2)
|
|
||||||
? otherRidge.y1
|
|
||||||
: otherRidge.y2
|
|
||||||
const nextY =
|
|
||||||
(nextLineRidge.y1 <= otherRidge.y1 && otherRidge.y1 <= nextLineRidge.y2) ||
|
|
||||||
(nextLineRidge.y1 >= otherRidge.y1 && otherRidge.y1 >= nextLineRidge.y2)
|
|
||||||
? otherRidge.y1
|
|
||||||
: otherRidge.y2
|
|
||||||
polygonPoints.push({ x: prevLineRidge.x1, y: prevY }, { x: nextLineRidge.x1, y: nextY })
|
|
||||||
} else {
|
} else {
|
||||||
const prevX =
|
polygonPoints.push({ x: minX, y: prevLineRidge.y1 }, { x: maxX, y: prevLineRidge.y1 })
|
||||||
(prevLineRidge.x1 <= otherRidge.x1 && otherRidge.x1 <= prevLineRidge.x2) ||
|
}
|
||||||
(prevLineRidge.x1 >= otherRidge.x1 && otherRidge.x1 >= prevLineRidge.x2)
|
} else if (prevDistance < nextDistance) {
|
||||||
? otherRidge.x1
|
polygonPoints.push({ x: nextLineRidge.x1, y: nextLineRidge.y1 }, { x: nextLineRidge.x2, y: nextLineRidge.y2 })
|
||||||
: otherRidge.x2
|
|
||||||
const nextX =
|
/** 이전라인과 교차한 마루의 포인트*/
|
||||||
(nextLineRidge.x1 <= otherRidge.x1 && otherRidge.x1 <= nextLineRidge.x2) ||
|
let prevRidgePoint1
|
||||||
(nextLineRidge.x1 >= otherRidge.x1 && otherRidge.x1 >= nextLineRidge.x2)
|
if (prevLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
||||||
? otherRidge.x1
|
prevRidgePoint1 = polygonPoints.find(
|
||||||
: otherRidge.x2
|
(point) =>
|
||||||
polygonPoints.push({ x: prevX, y: prevLineRidge.y1 }, { x: nextX, y: nextLineRidge.y1 })
|
(point.x === prevLineRidge.x1 && point.y === prevLineRidge.y1) || (point.x === prevLineRidge.x2 && point.y === prevLineRidge.y2),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
prevRidgePoint1 =
|
||||||
|
currentVectorX === 0
|
||||||
|
? currentRoof.y1 === prevLineRidge.y1
|
||||||
|
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
||||||
|
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
||||||
|
: currentRoof.x1 === prevLineRidge.x1
|
||||||
|
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
||||||
|
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
||||||
|
|
||||||
|
polygonPoints.push(prevRidgePoint1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 다음 라인과 교차한 마루의 포인트 중 라인과 접하지 않은 포인트*/
|
||||||
|
let checkRidgePoint
|
||||||
|
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
||||||
|
const ridgePoint1 = polygonPoints.filter((point) => point.x === nextLineRidge.x1 && point.y === nextLineRidge.y1)
|
||||||
|
checkRidgePoint = ridgePoint1.length > 0 ? { x: nextLineRidge.x2, y: nextLineRidge.y2 } : { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
||||||
|
} else {
|
||||||
|
checkRidgePoint =
|
||||||
|
currentVectorX === 0
|
||||||
|
? currentRoof.y2 !== nextLineRidge.y1
|
||||||
|
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
||||||
|
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
||||||
|
: currentRoof.x2 !== nextLineRidge.x1
|
||||||
|
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
||||||
|
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
||||||
|
}
|
||||||
|
|
||||||
|
const prevRidgePoint2 =
|
||||||
|
currentVectorX === 0 ? { x: prevRidgePoint1.x, y: checkRidgePoint.y } : { x: checkRidgePoint.x, y: prevRidgePoint1.y }
|
||||||
|
polygonPoints.push(prevRidgePoint2)
|
||||||
|
} else {
|
||||||
|
polygonPoints.push({ x: prevLineRidge.x1, y: prevLineRidge.y1 }, { x: prevLineRidge.x2, y: prevLineRidge.y2 })
|
||||||
|
|
||||||
|
/** 다음라인과 교차한 마루의 포인트*/
|
||||||
|
let nextRidgePoint1
|
||||||
|
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
||||||
|
nextRidgePoint1 = polygonPoints.find(
|
||||||
|
(point) =>
|
||||||
|
(point.x === nextLineRidge.x1 && point.y === nextLineRidge.y1) || (point.x === nextLineRidge.x2 && point.y === nextLineRidge.y2),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
nextRidgePoint1 =
|
||||||
|
currentVectorX === 0
|
||||||
|
? currentRoof.y2 === nextLineRidge.y1
|
||||||
|
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
||||||
|
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
||||||
|
: currentRoof.x2 === nextLineRidge.x1
|
||||||
|
? { x: nextLineRidge.x1, y: nextLineRidge.y1 }
|
||||||
|
: { x: nextLineRidge.x2, y: nextLineRidge.y2 }
|
||||||
|
polygonPoints.push(nextRidgePoint1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 이전 라인과 교차한 마루의 포인트 중 라인과 접하지 않은 포인트*/
|
||||||
|
let checkRidgePoint
|
||||||
|
if (prevLine.attributes.type === LINE_TYPE.WALLLINE.JERKINHEAD) {
|
||||||
|
const ridgePoint1 = polygonPoints.filter((point) => point.x === prevLineRidge.x1 && point.y === prevLineRidge.y1)
|
||||||
|
checkRidgePoint = ridgePoint1.length > 0 ? { x: prevLineRidge.x2, y: prevLineRidge.y2 } : { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
||||||
|
} else {
|
||||||
|
checkRidgePoint =
|
||||||
|
currentVectorX === 0
|
||||||
|
? currentRoof.y1 !== prevLineRidge.y1
|
||||||
|
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
||||||
|
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
||||||
|
: currentRoof.x1 !== prevLineRidge.x1
|
||||||
|
? { x: prevLineRidge.x1, y: prevLineRidge.y1 }
|
||||||
|
: { x: prevLineRidge.x2, y: prevLineRidge.y2 }
|
||||||
|
}
|
||||||
|
|
||||||
|
const nextRidgePoint2 =
|
||||||
|
currentVectorX === 0 ? { x: nextRidgePoint1.x, y: checkRidgePoint.y } : { x: checkRidgePoint.x, y: nextRidgePoint1.y }
|
||||||
|
polygonPoints.push(nextRidgePoint2)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/** 마루가 겹치지 않을때 */
|
||||||
|
const otherRidgeLines = []
|
||||||
|
|
||||||
|
baseGableRidgeLines
|
||||||
|
.filter((ridge) => ridge !== prevLineRidge && ridge !== nextLineRidge)
|
||||||
|
.filter((ridge) => (currentVectorX === 0 ? ridge.x1 === ridge.x2 : ridge.y1 === ridge.y2))
|
||||||
|
.filter((ridge) =>
|
||||||
|
currentVectorX === 0 ? nextVectorX === Math.sign(nextLine.x1 - ridge.x1) : nextVectorY === Math.sign(nextLine.y1 - ridge.y1),
|
||||||
|
)
|
||||||
|
.forEach((ridge) => {
|
||||||
|
const size = currentVectorX === 0 ? Math.abs(nextLine.x1 - ridge.x1) : Math.abs(nextLine.y1 - ridge.y1)
|
||||||
|
otherRidgeLines.push({ ridge, size })
|
||||||
|
})
|
||||||
|
if (otherRidgeLines.length > 0) {
|
||||||
|
const otherRidge = otherRidgeLines.sort((a, b) => a.size - b.size)[0].ridge
|
||||||
|
/**
|
||||||
|
* otherRidge이 prevRidgeLine, nextRidgeLine 과 currentLine의 사이에 있는지 확인해서 분할하여 작업
|
||||||
|
* 지붕의 덮힘이 다르기 때문
|
||||||
|
*/
|
||||||
|
const isInside =
|
||||||
|
currentVectorX === 0
|
||||||
|
? Math.abs(currentLine.x1 - otherRidge.x1) < Math.abs(currentLine.x1 - prevLineRidge.x1) &&
|
||||||
|
Math.abs(currentLine.x1 - otherRidge.x1) < Math.abs(currentLine.x1 - nextLineRidge.x1)
|
||||||
|
: Math.abs(currentLine.y1 - otherRidge.y1) < Math.abs(currentLine.y1 - prevLineRidge.y1) &&
|
||||||
|
Math.abs(currentLine.y1 - otherRidge.y1) < Math.abs(currentLine.y1 - nextLineRidge.y1)
|
||||||
|
|
||||||
|
if (isInside) {
|
||||||
|
polygonPoints.push(
|
||||||
|
{ x: prevLineRidge.x1, y: prevLineRidge.y1 },
|
||||||
|
{ x: prevLineRidge.x2, y: prevLineRidge.y2 },
|
||||||
|
{ x: nextLineRidge.x1, y: nextLineRidge.y1 },
|
||||||
|
{ x: nextLineRidge.x2, y: nextLineRidge.y2 },
|
||||||
|
)
|
||||||
|
|
||||||
|
let ridgeAllPoints = [
|
||||||
|
{ x: prevLineRidge.x1, y: prevLineRidge.y1 },
|
||||||
|
{ x: prevLineRidge.x2, y: prevLineRidge.y2 },
|
||||||
|
{ x: nextLineRidge.x1, y: nextLineRidge.y1 },
|
||||||
|
{ x: nextLineRidge.x2, y: nextLineRidge.y2 },
|
||||||
|
]
|
||||||
|
let ridgePoints = []
|
||||||
|
ridgeAllPoints.forEach((point) => {
|
||||||
|
let isOnLine = false
|
||||||
|
roof.lines.forEach((line) => {
|
||||||
|
if (isPointOnLine({ x1: line.x1, y1: line.y1, x2: line.x2, y2: line.y2 }, point)) {
|
||||||
|
isOnLine = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (!isOnLine) {
|
||||||
|
ridgePoints.push(point)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (ridgePoints.length === 2) {
|
||||||
|
if (Math.sign(otherRidge.x1 - otherRidge.x2) === 0) {
|
||||||
|
polygonPoints.push(
|
||||||
|
{ x: otherRidge.x1, y: ridgePoints[0].y },
|
||||||
|
{
|
||||||
|
x: otherRidge.x1,
|
||||||
|
y: ridgePoints[1].y,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
polygonPoints.push(
|
||||||
|
{ x: ridgePoints[0].x, y: otherRidge.y1 },
|
||||||
|
{
|
||||||
|
x: ridgePoints[1].x,
|
||||||
|
y: otherRidge.y1,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
polygonPoints.push({ x: otherRidge.x1, y: otherRidge.y1 }, { x: otherRidge.x2, y: otherRidge.y2 })
|
||||||
|
|
||||||
|
let ridgePoints = [
|
||||||
|
{ x: prevLineRidge.x1, y: prevLineRidge.y1 },
|
||||||
|
{ x: prevLineRidge.x2, y: prevLineRidge.y2 },
|
||||||
|
{ x: nextLineRidge.x1, y: nextLineRidge.y1 },
|
||||||
|
{ x: nextLineRidge.x2, y: nextLineRidge.y2 },
|
||||||
|
]
|
||||||
|
|
||||||
|
ridgePoints.forEach((point) => {
|
||||||
|
let isOnLine = false
|
||||||
|
roof.lines.forEach((line) => {
|
||||||
|
if (isPointOnLine({ x1: line.x1, y1: line.y1, x2: line.x2, y2: line.y2 }, point)) {
|
||||||
|
isOnLine = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (isOnLine) {
|
||||||
|
polygonPoints.push(point)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (Math.sign(otherRidge.x1 - otherRidge.x2) === 0) {
|
||||||
|
const prevY =
|
||||||
|
(prevLineRidge.y1 <= otherRidge.y1 && otherRidge.y1 <= prevLineRidge.y2) ||
|
||||||
|
(prevLineRidge.y1 >= otherRidge.y1 && otherRidge.y1 >= prevLineRidge.y2)
|
||||||
|
? otherRidge.y1
|
||||||
|
: otherRidge.y2
|
||||||
|
const nextY =
|
||||||
|
(nextLineRidge.y1 <= otherRidge.y1 && otherRidge.y1 <= nextLineRidge.y2) ||
|
||||||
|
(nextLineRidge.y1 >= otherRidge.y1 && otherRidge.y1 >= nextLineRidge.y2)
|
||||||
|
? otherRidge.y1
|
||||||
|
: otherRidge.y2
|
||||||
|
polygonPoints.push({ x: prevLineRidge.x1, y: prevY }, { x: nextLineRidge.x1, y: nextY })
|
||||||
|
} else {
|
||||||
|
const prevX =
|
||||||
|
(prevLineRidge.x1 <= otherRidge.x1 && otherRidge.x1 <= prevLineRidge.x2) ||
|
||||||
|
(prevLineRidge.x1 >= otherRidge.x1 && otherRidge.x1 >= prevLineRidge.x2)
|
||||||
|
? otherRidge.x1
|
||||||
|
: otherRidge.x2
|
||||||
|
const nextX =
|
||||||
|
(nextLineRidge.x1 <= otherRidge.x1 && otherRidge.x1 <= nextLineRidge.x2) ||
|
||||||
|
(nextLineRidge.x1 >= otherRidge.x1 && otherRidge.x1 >= nextLineRidge.x2)
|
||||||
|
? otherRidge.x1
|
||||||
|
: otherRidge.x2
|
||||||
|
polygonPoints.push({ x: prevX, y: prevLineRidge.y1 }, { x: nextX, y: nextLineRidge.y1 })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3043,13 +3044,11 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
|
|||||||
const lineEdge = { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }
|
const lineEdge = { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }
|
||||||
const intersection = edgesIntersection(checkEdge, lineEdge)
|
const intersection = edgesIntersection(checkEdge, lineEdge)
|
||||||
if (intersection) {
|
if (intersection) {
|
||||||
if (isPointOnLine(line, intersection)) {
|
intersectionRoofs.push({
|
||||||
intersectionRoofs.push({
|
line,
|
||||||
line,
|
intersection,
|
||||||
intersection,
|
size: Big(intersection.x).minus(currentMidX).abs().pow(2).plus(Big(intersection.y).minus(currentMidY).abs().pow(2)).sqrt(),
|
||||||
size: Big(intersection.x).minus(currentMidX).abs().pow(2).plus(Big(intersection.y).minus(currentMidY).abs().pow(2)).sqrt(),
|
})
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
@ -3063,13 +3062,11 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
|
|||||||
const lineEdge = { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }
|
const lineEdge = { vertex1: { x: line.x1, y: line.y1 }, vertex2: { x: line.x2, y: line.y2 } }
|
||||||
const intersection = edgesIntersection(checkEdge, lineEdge)
|
const intersection = edgesIntersection(checkEdge, lineEdge)
|
||||||
if (intersection) {
|
if (intersection) {
|
||||||
if (isPointOnLine(line, intersection)) {
|
intersectionRoofs.push({
|
||||||
intersectionRoofs.push({
|
line,
|
||||||
line,
|
intersection,
|
||||||
intersection,
|
size: Big(intersection.x).minus(currentMidX).abs().pow(2).plus(Big(intersection.y).minus(currentMidY).abs().pow(2)).sqrt(),
|
||||||
size: Big(intersection.x).minus(currentMidX).abs().pow(2).plus(Big(intersection.y).minus(currentMidY).abs().pow(2)).sqrt(),
|
})
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user