diff --git a/src/app/roof2/page.jsx b/src/app/roof2/page.jsx
new file mode 100644
index 00000000..03ab033c
--- /dev/null
+++ b/src/app/roof2/page.jsx
@@ -0,0 +1,16 @@
+'use client'
+
+import Hero from '@/components/Hero'
+import Roof from '@/components/Roof'
+import Roof2 from '@/components/Roof2'
+
+export default function RoofPage() {
+ return (
+ <>
+
+
+
+
+ >
+ )
+}
diff --git a/src/components/Headers.jsx b/src/components/Headers.jsx
index c16bd077..c5161f0a 100644
--- a/src/components/Headers.jsx
+++ b/src/components/Headers.jsx
@@ -10,6 +10,7 @@ export default function Headers() {
Intro
Roof
+ Roof2
diff --git a/src/components/Roof2.jsx b/src/components/Roof2.jsx
new file mode 100644
index 00000000..11dfa127
--- /dev/null
+++ b/src/components/Roof2.jsx
@@ -0,0 +1,139 @@
+import { useCanvas } from '@/hooks/useCanvas'
+import { useEffect, useRef } from 'react'
+
+export default function Roof2() {
+ const { canvas } = useCanvas('canvas')
+ const points = useRef([])
+ useEffect(() => {
+ canvas?.on('mouse:down', function (options) {
+ const pointer = canvas?.getPointer(options.e)
+ const circle = new fabric.Circle({
+ radius: 5,
+ fill: 'transparent', // 원 안을 비웁니다.
+ stroke: 'black', // 원 테두리 색상을 검은색으로 설정합니다.
+ left: pointer.x,
+ top: pointer.y,
+ originX: 'center',
+ originY: 'center',
+ selectable: false,
+ })
+
+ points.current.push(circle)
+ canvas?.add(circle)
+
+ if (points.current.length === 2) {
+ const length = Number(prompt('길이를 입력하세요:'))
+ // length 값이 숫자가 아닌 경우
+ if (isNaN(length) || length === 0) {
+ // 기존에 추가된 circle과 pointer를 제거합니다.
+ points.current.forEach((point) => {
+ canvas?.remove(point)
+ })
+ points.current = []
+ return
+ }
+
+ if (length) {
+ const vector = {
+ x: points.current[1].left - points.current[0].left,
+ y: points.current[1].top - points.current[0].top,
+ }
+ const slope = Math.abs(vector.y / vector.x) // 기울기 계산
+
+ let scaledVector
+ if (slope >= 1) {
+ // 기울기가 1 이상이면 x축 방향으로 그림
+ scaledVector = {
+ x: 0,
+ y: vector.y >= 0 ? Number(length) : -Number(length),
+ }
+ } else {
+ // 기울기가 1 미만이면 y축 방향으로 그림
+ scaledVector = {
+ x: vector.x >= 0 ? Number(length) : -Number(length),
+ y: 0,
+ }
+ }
+
+ let direction
+ if (Math.abs(vector.x) > Math.abs(vector.y)) {
+ // x축 방향으로 더 많이 이동
+ direction = vector.x > 0 ? 'right' : 'left'
+ } else {
+ // y축 방향으로 더 많이 이동
+ direction = vector.y > 0 ? 'bottom' : 'top'
+ }
+
+ const line = new fabric.Line(
+ [
+ points.current[0].left,
+ points.current[0].top,
+ points.current[0].left + scaledVector.x,
+ points.current[0].top + scaledVector.y,
+ ],
+ {
+ stroke: 'black',
+ strokeWidth: 2,
+ selectable: false,
+ direction: direction,
+ },
+ )
+
+ const text = new fabric.Text(length.toString(), {
+ left:
+ (points.current[0].left +
+ points.current[0].left +
+ scaledVector.x) /
+ 2,
+ top:
+ (points.current[0].top + points.current[0].top + scaledVector.y) /
+ 2,
+ fontSize: 15,
+ originX: 'center',
+ originY: 'center',
+ selectable: false,
+ })
+
+ // 라인의 끝에 점을 추가합니다.
+ const endPointCircle = new fabric.Circle({
+ radius: 5,
+ fill: 'transparent', // 원 안을 비웁니다.
+ stroke: 'black', // 원 테두리 색상을 검은색으로 설정합니다.
+ left: points.current[0].left + scaledVector.x,
+ top: points.current[0].top + scaledVector.y,
+ originX: 'center',
+ originY: 'center',
+ selectable: false,
+ })
+
+ canvas?.add(line)
+ canvas?.add(text)
+ canvas?.add(endPointCircle)
+ points.current.forEach((point) => {
+ canvas?.remove(point)
+ })
+ points.current = [endPointCircle]
+ }
+ }
+
+ canvas?.renderAll()
+ })
+ }, [canvas])
+ return (
+ <>
+
+
+
+
+
+ >
+ )
+}
diff --git a/src/hooks/useCanvas.js b/src/hooks/useCanvas.js
index 9a188e58..aaeb0c7a 100644
--- a/src/hooks/useCanvas.js
+++ b/src/hooks/useCanvas.js
@@ -26,6 +26,7 @@ export function useCanvas(id) {
height: CANVAS.HEIGHT,
width: CANVAS.WIDTH,
backgroundColor: 'white',
+ selection: false,
})
// settings for all canvas in the app
@@ -47,6 +48,8 @@ export function useCanvas(id) {
useEffect(() => {
if (canvas) {
initialize()
+ canvas?.on('mouse:move', drawMouseLines)
+ canvas?.on('mouse:out', removeMouseLines)
}
}, [canvas])
const addEventOnCanvas = () => {
@@ -91,7 +94,7 @@ export function useCanvas(id) {
canvas?.clear()
// 기존 이벤트가 있을 경우 제거한다.
- removeEventOnCanvas()
+ // removeEventOnCanvas()
// 작업 후에 event를 추가해준다.