외곽선 그리기 테스트

This commit is contained in:
yjnoh 2024-07-08 15:05:52 +09:00
parent bbff6ca4b2
commit 6fedf95383

View File

@ -206,7 +206,8 @@ export function useMode() {
points.current = [] points.current = []
historyPoints.current = [] historyPoints.current = []
handleOuterlines() // handleOuterlines()
handleOuterlinesTest() //외곽선 그리기 테스트
makePolygon() makePolygon()
} }
@ -355,6 +356,7 @@ export function useMode() {
const makePolygon = (otherLines) => { const makePolygon = (otherLines) => {
// 캔버스에서 모든 라인 객체를 찾습니다. // 캔버스에서 모든 라인 객체를 찾습니다.
const lines = otherLines || historyLines.current const lines = otherLines || historyLines.current
if (!otherLines) { if (!otherLines) {
//외각선 기준 //외각선 기준
const sortedIndex = getStartIndex(lines) const sortedIndex = getStartIndex(lines)
@ -373,21 +375,17 @@ export function useMode() {
if (topIndex[1] === 5) { if (topIndex[1] === 5) {
//1번 //1번
setShape(1) setShape(1)
console.log('shape :: ', 1)
} }
} else if (topIndex[0] === 1) { } else if (topIndex[0] === 1) {
//4번 //4번
if (topIndex[1] === 2) { if (topIndex[1] === 2) {
console.log('shape :: ', 4)
setShape(4) setShape(4)
} }
} else if (topIndex[0] === 0) { } else if (topIndex[0] === 0) {
if (topIndex[1] === 1) { if (topIndex[1] === 1) {
//2번 //2번
console.log('shape :: ', 2)
setShape(2) setShape(2)
} else if (topIndex[1] === 5) { } else if (topIndex[1] === 5) {
console.log('shape :: ', 3)
setShape(3) setShape(3)
} }
} }
@ -741,6 +739,66 @@ export function useMode() {
makePolygon(newOuterlines) makePolygon(newOuterlines)
} }
const handleOuterlinesTest = () => {
var offsetPoints = []
let offset = -35.5 // == 100 - 29
const points = historyLines.current.map((line) => ({
x: line.x1,
y: line.y1,
}))
for (var i = 0; i < points.length; i++) {
var prev = points[(i - 1 + points.length) % points.length]
var current = points[i]
var next = points[(i + 1) % points.length]
// 두 벡터 계산 (prev -> current, current -> next)
var vector1 = { x: current.x - prev.x, y: current.y - prev.y }
var vector2 = { x: next.x - current.x, y: next.y - current.y }
// 벡터의 길이 계산
var length1 = Math.sqrt(vector1.x * vector1.x + vector1.y * vector1.y)
var length2 = Math.sqrt(vector2.x * vector2.x + vector2.y * vector2.y)
// 벡터를 단위 벡터로 정규화
var unitVector1 = { x: vector1.x / length1, y: vector1.y / length1 }
var unitVector2 = { x: vector2.x / length2, y: vector2.y / length2 }
// 법선 벡터 계산 (왼쪽 방향)
var normal1 = { x: -unitVector1.y, y: unitVector1.x }
var normal2 = { x: -unitVector2.y, y: unitVector2.x }
// 법선 벡터 평균 계산
var averageNormal = {
x: (normal1.x + normal2.x) / 2,
y: (normal1.y + normal2.y) / 2,
}
// 평균 법선 벡터를 단위 벡터로 정규화
var lengthNormal = Math.sqrt(
averageNormal.x * averageNormal.x + averageNormal.y * averageNormal.y,
)
var unitNormal = {
x: averageNormal.x / lengthNormal,
y: averageNormal.y / lengthNormal,
}
console.log('current', current)
console.log('unitNormal', unitNormal)
// 오프셋 적용
var offsetPoint = {
x1: current.x + unitNormal.x * offset,
y1: current.y + unitNormal.y * offset,
}
offsetPoints.push(offsetPoint)
}
makePolygon(offsetPoints)
}
return { return {
mode, mode,
changeMode, changeMode,