1830 모듈 설치영역 대각 있는 현상 수정

This commit is contained in:
hyojun.choi 2026-04-01 17:11:58 +09:00
parent f87bfb902e
commit 2101d30d98

View File

@ -1756,6 +1756,11 @@ export function useMode() {
offsetEdges.push(createOffsetEdge(edge, dx, dy))
})
// 폴리곤의 감김 방향(signed area)을 구한다
const signedArea = bevelJoin
? polygon.edges.reduce((sum, edge) => sum + (edge.vertex1.x * edge.vertex2.y - edge.vertex2.x * edge.vertex1.y), 0)
: 0
const vertices = []
offsetEdges.forEach((thisEdge, i) => {
@ -1765,9 +1770,22 @@ export function useMode() {
if (!vertex.isIntersectionOutside || !bevelJoin) {
vertices.push({ x: vertex.x, y: vertex.y })
} else {
// 둔각 + bevelJoin: offset edge 끝점 사용
vertices.push({ x: prevEdge.vertex2.x, y: prevEdge.vertex2.y })
vertices.push({ x: thisEdge.vertex1.x, y: thisEdge.vertex1.y })
// 꼭짓점의 볼록/오목 판별 (cross product와 signed area 비교)
const origPrev = polygon.edges[(i + polygon.edges.length - 1) % polygon.edges.length]
const origThis = polygon.edges[i]
const cross =
(origPrev.vertex2.x - origPrev.vertex1.x) * (origThis.vertex2.y - origThis.vertex1.y) -
(origPrev.vertex2.y - origPrev.vertex1.y) * (origThis.vertex2.x - origThis.vertex1.x)
const isConvex = cross * signedArea > 0
if (isConvex) {
// 볼록 꼭짓점: bevel 적용 (offset edge 끝점 사용)
vertices.push({ x: prevEdge.vertex2.x, y: prevEdge.vertex2.y })
vertices.push({ x: thisEdge.vertex1.x, y: thisEdge.vertex1.y })
} else {
// 오목 꼭짓점: 교차점 사용 (90도 유지)
vertices.push({ x: vertex.x, y: vertex.y })
}
}
}
})
@ -1795,6 +1813,11 @@ export function useMode() {
offsetEdges.push(createOffsetEdge(edge, dx, dy))
})
// 폴리곤의 감김 방향(signed area)을 구한다
const signedArea = bevelJoin
? polygon.edges.reduce((sum, edge) => sum + (edge.vertex1.x * edge.vertex2.y - edge.vertex2.x * edge.vertex1.y), 0)
: 0
const vertices = []
offsetEdges.forEach((thisEdge, i) => {
@ -1804,9 +1827,22 @@ export function useMode() {
if (!vertex.isIntersectionOutside || !bevelJoin) {
vertices.push({ x: vertex.x, y: vertex.y })
} else {
// 둔각 + bevelJoin: offset edge 끝점 사용
vertices.push({ x: prevEdge.vertex2.x, y: prevEdge.vertex2.y })
vertices.push({ x: thisEdge.vertex1.x, y: thisEdge.vertex1.y })
// 꼭짓점의 볼록/오목 판별 (cross product와 signed area 비교)
const origPrev = polygon.edges[(i + polygon.edges.length - 1) % polygon.edges.length]
const origThis = polygon.edges[i]
const cross =
(origPrev.vertex2.x - origPrev.vertex1.x) * (origThis.vertex2.y - origThis.vertex1.y) -
(origPrev.vertex2.y - origPrev.vertex1.y) * (origThis.vertex2.x - origThis.vertex1.x)
const isConvex = cross * signedArea > 0
if (isConvex) {
// 볼록 꼭짓점: bevel 적용 (offset edge 끝점 사용)
vertices.push({ x: prevEdge.vertex2.x, y: prevEdge.vertex2.y })
vertices.push({ x: thisEdge.vertex1.x, y: thisEdge.vertex1.y })
} else {
// 오목 꼭짓점: 교차점 사용 (90도 유지)
vertices.push({ x: vertex.x, y: vertex.y })
}
}
}
})