鼠标点击动态绘制直线 canvas

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>鼠标点击绘制直线</title>
    <style>
        #canvas {
            border: 1px solid black;
            margin: 0 auto;
        }
    </style>
</head>

<body onload="init()">
    <canvas id="canvas" width="500" height="300"></canvas>

    <script src="drawLine.js"></script> <!-- 引入自定义的 JavaScript 文件 -->
</body>

</html>

<script>




    var canvas = document.getElementById("canvas"); // 获取 canvas 元素
    var context = canvas.getContext('2d'); // 创建绘图上下文对象
    function init() {

        canvas.addEventListener('mousedown', function (event) {
            let startX = event.clientX - canvas.offsetLeft + window.pageXOffset; // 计算起始点 x 坐标
            let startY = event.clientY - canvas.offsetTop + window.pageYOffset; // 计算起始点 y 坐标
            canvas.addEventListener('mousemove', event => {
                if (event.buttons !== 1) return false; // 如果不按下左键则返回

                let endX = event.clientX - canvas.offsetLeft + window.pageXOffset; // 更新结束点 x 坐标
                let endY = event.clientY - canvas.offsetTop + window.pageYOffset; // 更新结束点 y 坐标

                context.clearRect(0, 0, canvas.width, canvas.height); // 清空画布内容
                drawArrow(context, startX, startY, endX, endY)
            }); // 添加 mousemove 事件处理函数
        });
    }

    function drawArrow(ctx, fromX, fromY, toX, toY, theta = 30, headlen = 10, width = 2, color = '#f36') {
        // 计算箭头相对于直线的角度
        let angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI,
            angle1 = (angle + theta) * Math.PI / 180,
            angle2 = (angle - theta) * Math.PI / 180,
            topX = headlen * Math.cos(angle1),
            topY = headlen * Math.sin(angle1),
            botX = headlen * Math.cos(angle2),
            botY = headlen * Math.sin(angle2);
        // ctx.save();
        ctx.beginPath(); //重新开始路径
        let arrowX = fromX - topX,
            arrowY = fromY - topY;
        ctx.moveTo(fromX, fromY); // 将路径移到起始点位置
        ctx.lineTo(toX, toY); // 从起始点向结束点绘制直线
        arrowX = toX + topX;
        arrowY = toY + topY;
        ctx.moveTo(arrowX, arrowY);
        ctx.lineTo(toX, toY);
        arrowX = toX + botX;
        arrowY = toY + botY;
        ctx.lineTo(arrowX, arrowY);
        ctx.strokeStyle = color;
        ctx.lineWidth = width;
        ctx.stroke();
        ctx.restore();
    }






</script>

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
canvas中使用鼠标绘制直线的过程如下所示: 1. 首先,通过鼠标事件监听器获取鼠标在画布上移动时的坐标。这可以通过添加mousemove事件监听器来实现。在事件处理函数中,可以使用event对象的offsetX和offsetY属性来获取鼠标的坐标。\[3\] 2. 接下来,当鼠标点击画布时,可以通过添加mousedown事件监听器来触发绘制直线的操作。在事件处理函数中,可以获取鼠标点击时的坐标,并将其赋值给线段的起始点坐标。然后,调用主绘制类中的绘制方法来执行绘制操作。\[1\] 3. 在主绘制类中,可以定义一个绘制直线的方法Rae。该方法通过监听器连续执行,将鼠标左键点击时的位置坐标赋值给线段的起始点坐标,将鼠标移动后的位置坐标赋值给线段的末端点坐标。然后,创建一个线段对象,并调用其方法来更新线段的坐标和绘制直线。当鼠标左键弹起时,停止绘制直线。\[2\] 4. 最后,创建一个线段类,用于表示线段对象。该类包含构造方法用于设置线段的起始点坐标,以及更新方法和绘制方法用于更新线段的坐标和绘制直线。\[3\] 综上所述,通过监听鼠标事件和调用相应的方法,可以在canvas中实现鼠标绘制直线的功能。 #### 引用[.reference_title] - *1* *2* *3* [原生js使用canvas实现鼠标绘制直线](https://blog.csdn.net/weixin_72388638/article/details/130034235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值