#1526 보조선 이용해서 할당 시 길이 계산 안되는 현상 수정

This commit is contained in:
hyojun.choi 2026-03-09 10:05:39 +09:00
parent 69f0c5a8b2
commit 516d3b32a1

View File

@ -1023,6 +1023,9 @@ export const usePolygon = () => {
const line = divideLines[i] const line = divideLines[i]
const { intersections, startPoint, endPoint } = line const { intersections, startPoint, endPoint } = line
// 원본 라인의 기하학적 길이 (비율 계산용)
const originalGeomLength = Math.round(Math.hypot(line.x2 - line.x1, line.y2 - line.y1)) * 10
if (intersections.length === 1) { if (intersections.length === 1) {
const newLinePoint1 = [line.x1, line.y1, intersections[0].x, intersections[0].y] const newLinePoint1 = [line.x1, line.y1, intersections[0].x, intersections[0].y]
const newLinePoint2 = [intersections[0].x, intersections[0].y, line.x2, line.y2] const newLinePoint2 = [intersections[0].x, intersections[0].y, line.x2, line.y2]
@ -1042,25 +1045,43 @@ export const usePolygon = () => {
name: 'newLine', name: 'newLine',
}) })
// 두 라인 중 큰 길이로 통일 // 분할된 각 세그먼트의 기하학적 길이
const length1 = Math.round(Math.hypot(newLine1.x1 - newLine1.x2, newLine1.y1 - newLine1.y2)) * 10 const length1 = Math.round(Math.hypot(newLine1.x1 - newLine1.x2, newLine1.y1 - newLine1.y2)) * 10
const length2 = Math.round(Math.hypot(newLine2.x1 - newLine2.x2, newLine2.y1 - newLine2.y2)) * 10 const length2 = Math.round(Math.hypot(newLine2.x1 - newLine2.x2, newLine2.y1 - newLine2.y2)) * 10
const maxLength = Math.max(length1, length2)
const unifiedPlaneSize = line.attributes.planeSize ?? maxLength // 원본에 planeSize/actualSize가 있으면 비율로 분배, 없으면 기하학적 길이 사용
const unifiedActualSize = line.attributes.actualSize ?? maxLength let planeSize1, planeSize2, actualSize1, actualSize2
if (line.attributes.planeSize && originalGeomLength > 0) {
const ratio1 = length1 / originalGeomLength
const ratio2 = length2 / originalGeomLength
planeSize1 = Math.round(line.attributes.planeSize * ratio1)
planeSize2 = Math.round(line.attributes.planeSize * ratio2)
} else {
planeSize1 = length1
planeSize2 = length2
}
if (line.attributes.actualSize && originalGeomLength > 0) {
const ratio1 = length1 / originalGeomLength
const ratio2 = length2 / originalGeomLength
actualSize1 = Math.round(line.attributes.actualSize * ratio1)
actualSize2 = Math.round(line.attributes.actualSize * ratio2)
} else {
actualSize1 = length1
actualSize2 = length2
}
newLine1.attributes = { newLine1.attributes = {
...line.attributes, ...line.attributes,
planeSize: unifiedPlaneSize, planeSize: planeSize1,
actualSize: unifiedActualSize, actualSize: actualSize1,
} }
newLine1.length = maxLength newLine1.length = length1
newLine2.attributes = { newLine2.attributes = {
...line.attributes, ...line.attributes,
planeSize: unifiedPlaneSize, planeSize: planeSize2,
actualSize: unifiedActualSize, actualSize: actualSize2,
} }
newLine2.length = maxLength newLine2.length = length2
newLines.push(newLine1, newLine2) newLines.push(newLine1, newLine2)
divideLines.splice(i, 1) // 기존 line 제거 divideLines.splice(i, 1) // 기존 line 제거
@ -1080,12 +1101,25 @@ export const usePolygon = () => {
}) })
const calcLength = Math.round(Math.hypot(newLine.x1 - newLine.x2, newLine.y1 - newLine.y2)) * 10 const calcLength = Math.round(Math.hypot(newLine.x1 - newLine.x2, newLine.y1 - newLine.y2)) * 10
let segPlaneSize, segActualSize
if (line.attributes.planeSize && originalGeomLength > 0) {
segPlaneSize = Math.round(line.attributes.planeSize * (calcLength / originalGeomLength))
} else {
segPlaneSize = calcLength
}
if (line.attributes.actualSize && originalGeomLength > 0) {
segActualSize = Math.round(line.attributes.actualSize * (calcLength / originalGeomLength))
} else {
segActualSize = calcLength
}
newLine.attributes = { newLine.attributes = {
...line.attributes, ...line.attributes,
planeSize: line.attributes.planeSize ?? calcLength, planeSize: segPlaneSize,
actualSize: line.attributes.actualSize ?? calcLength, actualSize: segActualSize,
} }
newLine.length = line.attributes.planeSize ?? calcLength newLine.length = calcLength
newLines.push(newLine) newLines.push(newLine)
currentPoint = minDistancePoint currentPoint = minDistancePoint
@ -1100,12 +1134,25 @@ export const usePolygon = () => {
name: 'newLine', name: 'newLine',
}) })
const lastCalcLength = Math.round(Math.hypot(newLine.x1 - newLine.x2, newLine.y1 - newLine.y2)) * 10 const lastCalcLength = Math.round(Math.hypot(newLine.x1 - newLine.x2, newLine.y1 - newLine.y2)) * 10
let lastPlaneSize, lastActualSize
if (line.attributes.planeSize && originalGeomLength > 0) {
lastPlaneSize = Math.round(line.attributes.planeSize * (lastCalcLength / originalGeomLength))
} else {
lastPlaneSize = lastCalcLength
}
if (line.attributes.actualSize && originalGeomLength > 0) {
lastActualSize = Math.round(line.attributes.actualSize * (lastCalcLength / originalGeomLength))
} else {
lastActualSize = lastCalcLength
}
newLine.attributes = { newLine.attributes = {
...line.attributes, ...line.attributes,
planeSize: line.attributes.planeSize ?? lastCalcLength, planeSize: lastPlaneSize,
actualSize: line.attributes.actualSize ?? lastCalcLength, actualSize: lastActualSize,
} }
newLine.length = line.attributes.planeSize ?? lastCalcLength newLine.length = lastCalcLength
newLines.push(newLine) newLines.push(newLine)
divideLines.splice(i, 1) // 기존 line 제거 divideLines.splice(i, 1) // 기존 line 제거