diff --git a/src/tools/Circle.ts b/src/tools/Circle.ts index 110037b..762fb21 100644 --- a/src/tools/Circle.ts +++ b/src/tools/Circle.ts @@ -15,7 +15,7 @@ export default class Circle implements Tool { this.circle = new Konva.Circle() this.line = new Konva.Line() this.text = new Konva.Text() - this.mapRatio = 1 // TODO: Inplement map ratio dynamicly + this.mapRatio = 1 // TODO: Implement map ratio dynamically } // eslint-disable-next-line @@ -32,25 +32,23 @@ export default class Circle implements Tool { // eslint-disable-next-line mouseMoveAction = throttle((e: Konva.KonvaPointerEvent, canvasElement: CanvasElement, layer: Konva.Layer, _socket: WebSocket): void => { - const x = e.evt.x - const y = e.evt.y - canvasElement.data = canvasElement.data.concat([x, y]) - this.circle.radius(this.calcRadius(x, y)) - this.line.points([canvasElement.data[0], canvasElement.data[1], x, y]) - this.text.setPosition(this.calcTextPosition(x, y)) - this.text.setText(Math.floor(this.calcRadius(x, y) * this.mapRatio) + ' m') + this.circle.radius(this.calcRadius(e.evt.x, e.evt.y, this.circle.getPosition().x, this.circle.getPosition().y)) + this.line.points([canvasElement.data[0], canvasElement.data[1], e.evt.x, e.evt.y]) + this.text.setPosition(this.calcTextPosition(e.evt.x, e.evt.y, this.circle.getPosition().x, this.circle.getPosition().y)) + this.text.setText(Math.floor(this.calcRadius(e.evt.x, e.evt.y, this.circle.getPosition().x, this.circle.getPosition().y) * this.mapRatio) + ' m') layer.batchDraw() }, 10) mouseUpAction = (e: Konva.KonvaPointerEvent, canvasElement: CanvasElement, layer: Konva.Layer, socket: WebSocket): void => { + canvasElement.data = canvasElement.data.concat([e.evt.x, e.evt.y]) this.sendToWebsockets(socket, canvasElement) } - createTextElement = (canvasElement: CanvasElement, colour?: string): Konva.Shape & Konva.Text => { + createTextElement = (canvasElement: CanvasElement, colour?: string, text?: string): Konva.Shape & Konva.Text => { return new Konva.Text({ x: canvasElement.data[0], y: canvasElement.data[1], - text: '0 m', + text: text || '0 m', fontSize: 20, fontFamily: 'Calibri', fill: colour || this.colour @@ -60,7 +58,7 @@ export default class Circle implements Tool { createLineElement = (canvasElement: CanvasElement, colour?: string): Konva.Shape & Konva.Line => { return new Konva.Line({ globalCompositeOperation: 'source-over', - points: [canvasElement.data[0], canvasElement.data[1]], + points: canvasElement.data, stroke: colour || this.colour, strokeWidth: 2, lineCap: 'mitter', @@ -68,38 +66,47 @@ export default class Circle implements Tool { }) } - createElement = (canvasElement: CanvasElement, colour?: string, stroke?: number): Konva.Shape & Konva.Circle => { + createElement = (canvasElement: CanvasElement, colour?: string, stroke?: number, radius?: number): Konva.Shape & Konva.Circle => { return new Konva.Circle({ id: canvasElement.id, globalCompositeOperation: 'source-over', stroke: colour || this.colour, strokeWidth: stroke || this.size, - radius: 5, + radius: radius || 0, x: canvasElement.data[0], y: canvasElement.data[1] }) } renderCanvas = (canvasElement: CanvasElement, layer: Konva.Layer): void => { - layer.add(this.createElement(canvasElement, canvasElement.tool.colour, canvasElement.tool.size)) + // Render circle + const radius = this.calcRadius(canvasElement.data[0], canvasElement.data[1], canvasElement.data[2], canvasElement.data[3]) + layer.add(this.createElement(canvasElement, canvasElement.tool.colour, canvasElement.tool.size, radius)) + // Render dashed line + layer.add(this.createLineElement(canvasElement, canvasElement.tool.colour)) + // Render text + this.text = this.createTextElement(canvasElement, canvasElement.tool.colour, Math.floor(radius * this.mapRatio) + ' m') + this.text.setPosition(this.calcTextPosition(canvasElement.data[2], canvasElement.data[3], canvasElement.data[0], canvasElement.data[1])) + layer.add(this.text) + // Batch draw layer.batchDraw() } - calcTextPosition = (x: number, y: number): object => { + calcTextPosition = (x1: number, y1: number, x2: number, y2: number): object => { const offset = 30 - const offsetX = (x - this.circle.getPosition().x) / 2 - const offsetY = (y - this.circle.getPosition().y) / 2 - const angleX = -(y - this.circle.getPosition().y) / (this.calcRadius(x, y)) - const angleY = (x - this.circle.getPosition().x) / (this.calcRadius(x, y)) + const offsetX = (x1 - x2) / 2 + const offsetY = (y1 - y2) / 2 + const angleX = -(y1 - y2) / (this.calcRadius(x1, y1, x2, y2)) + const angleY = (x1 - x2) / (this.calcRadius(x1, y1, x2, y2)) return { - x: this.circle.getPosition().x + offsetX + (angleX * offset) - (this.text.getWidth() / 2), - y: this.circle.getPosition().y + offsetY + (angleY * offset) - (this.text.getHeight() / 2) + x: x2 + offsetX + (angleX * offset) - (this.text.getWidth() / 2), + y: y2 + offsetY + (angleY * offset) - (this.text.getHeight() / 2) } } - calcRadius = (x: number, y: number): number => { - const a = Math.pow((x - this.circle.getPosition().x), 2) - const b = Math.pow((y - this.circle.getPosition().y), 2) + calcRadius = (x1: number, y1: number, x2: number, y2: number): number => { + const a = Math.pow((x1 - x2), 2) + const b = Math.pow((y1 - y2), 2) return Math.sqrt(a + b) } diff --git a/src/tools/FreeDraw.ts b/src/tools/FreeDraw.ts index 7c00f69..053bce6 100644 --- a/src/tools/FreeDraw.ts +++ b/src/tools/FreeDraw.ts @@ -28,7 +28,7 @@ export default class FreeDraw implements Tool { const newPoints: number[] = this.line.points().concat([x, y]) this.line.points(newPoints) layer.batchDraw() - }, 10) + }, 0) mouseUpAction = (e: Konva.KonvaPointerEvent, canvasElement: CanvasElement, _layer: Konva.Layer, socket: WebSocket): void => { this.sendToWebsockets(socket, canvasElement)