집추가작업4
This commit is contained in:
parent
b6f6fd7128
commit
3967581b99
@ -596,9 +596,10 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//wall.lines 는 기본 벽 라인
|
//wall.lines 는 기본 벽 라인
|
||||||
//wall.baseLine은 움직인라인
|
//wall.baseLine은 움직인라인
|
||||||
|
const movedLines = []
|
||||||
wall.lines.forEach((wallLine, index) => {
|
wall.lines.forEach((wallLine, index) => {
|
||||||
console.log("wallLine:::::", wallLine, index)
|
console.log("wallLine:::::", wallLine, index)
|
||||||
let p1,p2,p3, p4
|
let p1,p2,p3, p4
|
||||||
@ -616,6 +617,29 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// // 사용자가 라인을 드래그하기 시작할 때
|
||||||
|
// baseLine.on('moving', () => {
|
||||||
|
// baseLine.attributes.isUserMoved = true
|
||||||
|
// })
|
||||||
|
|
||||||
|
// 판별할 때
|
||||||
|
// const movedLines = wall.baseLines
|
||||||
|
// .map((line, index) => ({ index, line }))
|
||||||
|
// .filter(({ line }) => line.attributes.isUserMoved)
|
||||||
|
|
||||||
|
|
||||||
|
// Then in your code:
|
||||||
|
|
||||||
|
if (!moveLine?.attributes?.originPoint) return
|
||||||
|
|
||||||
|
const { originPoint } = moveLine.attributes
|
||||||
|
const moved =
|
||||||
|
(Math.abs(moveLine.x1 - originPoint.x1) > 0.1 ||
|
||||||
|
Math.abs(moveLine.y1 - originPoint.y1) > 0.1 )||(
|
||||||
|
Math.abs(moveLine.x2 - originPoint.x2) > 0.1 ||
|
||||||
|
Math.abs(moveLine.y2 - originPoint.y2) > 0.1)
|
||||||
|
|
||||||
|
if (moved) {
|
||||||
|
|
||||||
let testLine = new QLine([moveLine.x1, moveLine.y1, moveLine.x2, moveLine.y2], {
|
let testLine = new QLine([moveLine.x1, moveLine.y1, moveLine.x2, moveLine.y2], {
|
||||||
stroke: 'yellow',
|
stroke: 'yellow',
|
||||||
@ -623,22 +647,104 @@ const createInnerLinesFromSkeleton = (roofId, canvas, skeleton, textMode) => {
|
|||||||
property: 'normal',
|
property: 'normal',
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
});
|
});
|
||||||
// Then in your code:
|
canvas.add(testLine)
|
||||||
if (doLinesIntersect(moveLine, wallLine)) {
|
canvas.renderAll()
|
||||||
// Lines intersect, don't add the test line
|
|
||||||
if (testLine) {
|
const getPolygonOrientation = baseLines => {
|
||||||
canvas.remove(testLine);
|
if (!baseLines?.length) return 0
|
||||||
canvas.renderAll();
|
|
||||||
|
const area2 = baseLines.reduce((sum, line) => {
|
||||||
|
const x1 = line.get('x1')
|
||||||
|
const y1 = line.get('y1')
|
||||||
|
const x2 = line.get('x2')
|
||||||
|
const y2 = line.get('y2')
|
||||||
|
return sum + (x2 - x1) * (y2 + y1) // shoelace 변형
|
||||||
|
}, 0)
|
||||||
|
|
||||||
|
return Math.sign(area2) // +1: CCW, -1: CW, 0: 불명
|
||||||
}
|
}
|
||||||
} else {
|
const lineOrientation = (line, polygonOrientation) => {
|
||||||
// Lines don't intersect, safe to add test line
|
const x1 = line.get('x1')
|
||||||
if (testLine) {
|
const y1 = line.get('y1')
|
||||||
canvas.remove(testLine);
|
const x2 = line.get('x2')
|
||||||
|
const y2 = line.get('y2')
|
||||||
|
const cross = (x2 - x1) * (y2 + y1) // shoelace 기여
|
||||||
|
const sameDirection = Math.sign(cross) === polygonOrientation
|
||||||
|
return sameDirection ? 'up' : 'down'
|
||||||
|
}
|
||||||
|
|
||||||
|
const polygonOrientation = getPolygonOrientation(wall.baseLines)
|
||||||
|
|
||||||
|
|
||||||
|
movedLines.push({
|
||||||
|
index,
|
||||||
|
wallLine,
|
||||||
|
moveLine,
|
||||||
|
coords: {
|
||||||
|
x1: moveLine.get('x1'),
|
||||||
|
y1: moveLine.get('y1'),
|
||||||
|
x2: moveLine.get('x2'),
|
||||||
|
y2: moveLine.get('y2'),
|
||||||
|
},
|
||||||
|
orientation: getOrientation(moveLine), // 'vertical' / 'horizontal' / ...
|
||||||
|
direction: lineOrientation(moveLine, polygonOrientation), // 'up = right' or 'down = left'
|
||||||
|
})
|
||||||
|
// 기존 로직도 이어서 실행
|
||||||
|
console.log("moveLine", movedLines)
|
||||||
|
|
||||||
|
|
||||||
|
movedLines.forEach(({ index, moveLine, wallLine }) => {
|
||||||
|
console.log(`사용자가 움직인 선 index: ${index}, wallLineId: ${wallLine.id}`)
|
||||||
|
// 여기에서만 보조선, 텍스트, highlight 등 수행
|
||||||
|
})
|
||||||
|
|
||||||
|
const EPS = 0.1
|
||||||
|
|
||||||
|
const shareEndpoint = (a, b, eps = 0.1) => {
|
||||||
|
const same = (ax, ay, bx, by) => Math.hypot(ax - bx, ay - by) < eps
|
||||||
|
return (
|
||||||
|
same(a.x1, a.y1, b.x1, b.y1) ||
|
||||||
|
same(a.x1, a.y1, b.x2, b.y2) ||
|
||||||
|
same(a.x2, a.y2, b.x1, b.y1) ||
|
||||||
|
same(a.x2, a.y2, b.x2, b.y2)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const angleBetween = a => b => {
|
||||||
|
const va = { x: a.x2 - a.x1, y: a.y2 - a.y1 }
|
||||||
|
const vb = { x: b.x2 - b.x1, y: b.y2 - b.y1 }
|
||||||
|
const dot = va.x * vb.x + va.y * vb.y
|
||||||
|
const mag = Math.hypot(va.x, va.y) * Math.hypot(vb.x, vb.y)
|
||||||
|
return Math.acos(Math.min(Math.max(dot / mag, -1), 1)) * 180 / Math.PI
|
||||||
|
}
|
||||||
|
|
||||||
|
const rightAngles = []
|
||||||
|
movedLines.forEach((a, i) => {
|
||||||
|
movedLines.slice(i + 1).forEach(b => {
|
||||||
|
if (!shareEndpoint(a.coords, b.coords)) return
|
||||||
|
const angle = angleBetween(a.coords)(b.coords)
|
||||||
|
if (Math.abs(angle - 90) < 2) rightAngles.push({ a, b, angle })
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
if(rightAngles.length > 0){
|
||||||
|
let testLine = new QLine([rightAngles[0].x1, rightAngles[0].y1, rightAngles[0].x2, rightAngles[0].y2], {
|
||||||
|
stroke: 'yellow',
|
||||||
|
strokeWidth: 10,
|
||||||
|
property: 'normal',
|
||||||
|
fontSize: 14,
|
||||||
|
});
|
||||||
|
canvas.add(testLine)
|
||||||
|
canvas.renderAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
canvas.add(testLine);
|
|
||||||
canvas.renderAll();
|
}
|
||||||
|
// movedLines => [{ line: moveLineObj, index }, ...] : 이동된 것만 담김
|
||||||
|
|
||||||
|
if (moved) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3465,3 +3571,17 @@ function doLinesIntersect(line1, line2) {
|
|||||||
// If uA and uB are between 0-1, lines are colliding
|
// If uA and uB are between 0-1, lines are colliding
|
||||||
return (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1);
|
return (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getOrientation = (line, eps = 0.1) => {
|
||||||
|
const x1 = line.get('x1')
|
||||||
|
const y1 = line.get('y1')
|
||||||
|
const x2 = line.get('x2')
|
||||||
|
const y2 = line.get('y2')
|
||||||
|
const dx = Math.abs(x2 - x1)
|
||||||
|
const dy = Math.abs(y2 - y1)
|
||||||
|
|
||||||
|
if (dx < eps && dy >= eps) return 'vertical'
|
||||||
|
if (dy < eps && dx >= eps) return 'horizontal'
|
||||||
|
if (dx < eps && dy < eps) return 'point'
|
||||||
|
return 'diagonal'
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user