[1514]sk수정 #685
@ -404,9 +404,15 @@ export const skeletonBuilder = (roofId, canvas, textMode) => {
|
||||
}, { x: 0, y: 0 })
|
||||
|
||||
// baseLine을 offset만큼 바깥으로 평행이동
|
||||
const offsetLine = (line) => {
|
||||
const offsetLine = (line, index) => {
|
||||
const sp = line.startPoint, ep = line.endPoint
|
||||
const offset = line.attributes?.offset ?? 0
|
||||
let offset = line.attributes?.offset ?? 0
|
||||
|
||||
// 모든 offset이 동일할 때 수치적 안정성을 위해 약간의 변화 추가
|
||||
if (baseLines.every(l => (l.attributes?.offset ?? 0) === offset)) {
|
||||
offset += index * 0.01 // 각 라인에 약간의 차이 추가
|
||||
}
|
||||
|
||||
const edx = ep.x - sp.x, edy = ep.y - sp.y
|
||||
const len = Math.hypot(edx, edy)
|
||||
if (len === 0) return { sp: { ...sp }, ep: { ...ep } }
|
||||
@ -433,29 +439,39 @@ export const skeletonBuilder = (roofId, canvas, textMode) => {
|
||||
isSamePoint(point, line.startPoint) || isSamePoint(point, line.endPoint)
|
||||
)
|
||||
if (adjLines.length < 2) return { ...point }
|
||||
const oL1 = offsetLine(adjLines[0]), oL2 = offsetLine(adjLines[1])
|
||||
const idx1 = baseLines.indexOf(adjLines[0])
|
||||
const idx2 = baseLines.indexOf(adjLines[1])
|
||||
const oL1 = offsetLine(adjLines[0], idx1), oL2 = offsetLine(adjLines[1], idx2)
|
||||
return lineIntersect(oL1.sp, oL1.ep, oL2.sp, oL2.ep) || { ...point }
|
||||
})
|
||||
|
||||
// 중복 좌표 및 일직선 위의 불필요한 점 제거 (L자 확장 시 사각형으로 단순화)
|
||||
const simplifyPolygon = (pts) => {
|
||||
let result = [...pts]
|
||||
|
||||
// L자형 보호를 위해 최소 4개 점 유지
|
||||
if (result.length <= 4) return result
|
||||
|
||||
let changed = true
|
||||
while (changed) {
|
||||
changed = false
|
||||
for (let i = result.length - 1; i >= 0; i--) {
|
||||
const next = result[(i + 1) % result.length]
|
||||
if (Math.abs(result[i].x - next.x) < 0.5 && Math.abs(result[i].y - next.y) < 0.5) {
|
||||
if (Math.abs(result[i].x - next.x) < 1.0 && Math.abs(result[i].y - next.y) < 1.0) {
|
||||
result.splice(i, 1)
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
// 최소 4개 점 유지 확인
|
||||
if (result.length <= 4) break
|
||||
|
||||
for (let i = result.length - 1; i >= 0 && result.length > 3; i--) {
|
||||
const prev = result[(i - 1 + result.length) % result.length]
|
||||
const curr = result[i]
|
||||
const next = result[(i + 1) % result.length]
|
||||
const cross = (curr.x - prev.x) * (next.y - prev.y) - (curr.y - prev.y) * (next.x - prev.x)
|
||||
if (Math.abs(cross) < 1) {
|
||||
// 임계값 증가로 과도한 단순화 방지
|
||||
if (Math.abs(cross) < 20) {
|
||||
result.splice(i, 1)
|
||||
changed = true
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user