使用Canvas绘制形状,并能拖拽形状

本文介绍了如何在Canvas上绘制矩形并实现矩形的拖拽功能。通过记录鼠标按下时的位置和移动过程中的坐标,计算矩形的起点和终点,实现矩形的绘制与拖动。提供了一个GitHub上的demo链接,展示具体实现效果。
摘要由CSDN通过智能技术生成

一个项目需要对图片上的动物、车等进行标注,用于算法训练。本文基于项目实践,总结了下使用Canvas怎么做到绘制一个矩形,并能拖动此矩形。


绘制实现思路:
1、鼠标按下,记住鼠标起始位置,矩形起点(x1,y1)
2、鼠标移动过程中,鼠标最后的点作为矩形的终点(x2,y2)
3、移动过程中重绘矩形

拖拽实现思路:
1、鼠标按下,判断是否按在矩形区域
2、按在矩形区域,记住鼠标坐标(x1,y1)
3、鼠标移动过程中,鼠标坐标(x2,y2)
4、鼠标偏移量(x2-x1,y2-y1)
5、矩形的起点和终点都加上相应的偏移量
6、重绘矩形


demo实现效果如下:
在这里插入图片描述


源码github路径:
https://github.com/lesliefish/WebDevelopment/blob/master/Demos/Canvas/DrawRectAndDrag.html

源码

<!--
 * @Author: lesliefish
 * @Date: 2021-06-07 20:35:56
 * @LastEditTime: 2021-06-07 20:40:25
 * @LastEditors: Please set LastEditors
 * @Description: using canvas draw a rect and drag it
 * @FilePath: \WebDevelopment\Demos\Canvas\DrawRectAndDrag.html
-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas 绘制形状,绘图拖拽</title>
</head>

<body>
    <div class="main">
        <canvas id="myCanvas" width="500px" height="300px"></canvas>
        <canvas id="myCanvas2" width="500px" height="300px"></canvas>
    </div>

    <script>

        class CavansDemo {
   
            /**
             * @description: 构造函数 
             * @param {*} canvasId 要操作的canvasid
             * @param {*} drawColor 绘制颜色
             * @param {*} imageUrl  背景图片url
             * @return {*}
             */
            constructor(canvasId, drawColor, imageUrl) {
   
                this.oCanvas = document.getElementById(canvasId);
                this.ctx = this.oCanvas.getContext("2d");
                this.imageUrl = imageUrl;
                this.drawColor = drawColor;
                this.oShape = null;
                this.bDrawState = false; // 绘制状态默认false
                this.bDragState = false; // 拖拽状态默认true
                // 初始化图片对象
                this<
抱歉,我作为AI语言模型无法提供图形化界面,但我可以给你提供绘制多边形的代码,您可以在您的项目中使用它: ```html <canvas id="myCanvas" width="500" height="500"></canvas> ``` ```javascript const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); let isDragging = false; let dragIndex = -1; let mouseX = 0; let mouseY = 0; const polygon = { points: [ { x: 100, y: 100 }, { x: 200, y: 100 }, { x: 200, y: 200 }, { x: 100, y: 200 } ], strokeColor: '#000', fillColor: '#f00' }; function drawPolygon() { ctx.beginPath(); ctx.moveTo(polygon.points[0].x, polygon.points[0].y); for (let i = 1; i < polygon.points.length; i++) { ctx.lineTo(polygon.points[i].x, polygon.points[i].y); } ctx.closePath(); ctx.strokeStyle = polygon.strokeColor; ctx.stroke(); ctx.fillStyle = polygon.fillColor; ctx.fill(); } function isInsidePolygon() { let inside = false; for (let i = 0, j = polygon.points.length - 1; i < polygon.points.length; j = i++) { const xi = polygon.points[i].x; const yi = polygon.points[i].y; const xj = polygon.points[j].x; const yj = polygon.points[j].y; const intersect = ((yi > mouseY) !== (yj > mouseY)) && (mouseX < (xj - xi) * (mouseY - yi) / (yj - yi) + xi); if (intersect) inside = !inside; } return inside; } function onMouseDown(event) { mouseX = event.clientX - canvas.offsetLeft; mouseY = event.clientY - canvas.offsetTop; for (let i = 0; i < polygon.points.length; i++) { const point = polygon.points[i]; const distance = Math.sqrt((point.x - mouseX) ** 2 + (point.y - mouseY) ** 2); if (distance < 10) { isDragging = true; dragIndex = i; break; } } } function onMouseMove(event) { if (isDragging) { mouseX = event.clientX - canvas.offsetLeft; mouseY = event.clientY - canvas.offsetTop; polygon.points[dragIndex].x = mouseX; polygon.points[dragIndex].y = mouseY; ctx.clearRect(0, 0, canvas.width, canvas.height); drawPolygon(); } } function onMouseUp(event) { isDragging = false; dragIndex = -1; } canvas.addEventListener('mousedown', onMouseDown); canvas.addEventListener('mousemove', onMouseMove); canvas.addEventListener('mouseup', onMouseUp); drawPolygon(); ``` 这是一个绘制一个四边形的多边形的代码,并且可以拖动顶点。您可以通过修改 `polygon.points` 数组来绘制不同形状的多边形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值