canvas正交坐标系旋转--监听滚轮

简介: canvas正交坐标系旋转--监听滚轮

简单学习canvas

<canvas id=“myCanvas” width=200 height=100 ></canvas>
  • id 是canvas元素的标识;
  • height,width规定画布大小

直线

beginPath()方法,指示开始绘图路径: ctx.beginPath();

moveTo()方法将坐标移至直线起点: ctx.moveTo(x,y);

lineTo()方法绘制直线: ctx.lineTo(x,y);

stroke()方法,绘制图形的边界轮廓: ctx.stroke();

closePath()方法,指示闭合绘图路径: ctx.closePath()

    var mycanvas=document.getElementById("canvas");
    var ctx=mycanvas.getContext("2d");
  ctx.beginPath();
  ctx.moveTo(100,100);//移动到绘制点
  ctx.lineTo(200,200);
  ctx.strokeStyle="#000000"; //指定描边颜色
  ctx.stroke();

三角形

  var mycanvas=document.getElementById("canvas");
    var ctx=mycanvas.getContext("2d");
  ctx.beginPath();
  ctx.moveTo(100,200);
  ctx.lineTo(400,200);
  ctx.lineTo(250,400);
  ctx.closePath();//闭合绘图
  ctx.strokeStyle="#000000";
  ctx.stroke();

矩形:

绘制矩形:rect(x,y,width,height);

绘制矩形边框:strokeRect(x, y, width, height);

绘制填充矩形:fillRect(x, y, width, height);

擦除指定矩形区域:clearRect(x, y, width, height);

  var mycanvas=document.getElementById("canvas");
  var ctx=mycanvas.getContext("2d");
  //rect()函数调用
  ctx.beginPath();
  ctx.rect(20,20,100,50);
  ctx.stroke();

圆形arc(centerx,centery,radius,startAngle,endAngle,antiClockwise);

  • centerx,centery 圆弧中心点坐标
  • Radius 半径
  • startAngle 起始弧度
  • endAngle 终止弧度
  • antiClockwise 是否按逆时针方向绘图, 是一个可选参数,默认为false(即顺时针方向绘图)
    弧度 = 角度* ( Math.PI / 180 )
  var mycanvas=document.getElementById("canvas");
  var ctx=mycanvas.getContext("2d");
  //arc()函数调用
  ctx.beginPath();
  ctx.arc(100,150,70,0,90*Math.PI/180,true);
  ctx.stroke();

功能实现

<!DOCTYPE html>
<html>
<head>
  <title>Canvas 监听鼠标滚动开启旋转</title>
  <style>
    canvas {
      border: 1px solid #000;
    }
  </style>
</head>
<body>
  <canvas id="myCanvas" width="400" height="200"></canvas>
  <script>
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    var isRotating = false; // 是否正在进行旋转
    var isEnter = false; // 鼠标按下允许旋转
    var rotationDirection = 0; // 旋转方向:-1表示逆时针,1表示顺时针
    var rotationAngle = 0; // 旋转角度
    // 绘制y轴
    ctx.beginPath();
    ctx.moveTo(100, 100);
    ctx.lineTo(100, 150);
    ctx.stroke();
    // 绘制x轴
    ctx.beginPath();
    ctx.moveTo(100, 150);
    ctx.lineTo(150, 150);
    ctx.stroke();
    // 鼠标按下事件监听器
    canvas.addEventListener("mousedown", function (event) {
      alert('开启旋转功能')
      isEnter = true;
    });
    // 鼠标移动超出画布移除事件监听器
    canvas.addEventListener("mousemove", function (event) {
      if (isEnter) {
        let content = canvas.getBoundingClientRect()
        let x = event.clientX
        let y = event.clientY
        if (x >= content.right - 10 || x <= content.left + 10 || y >= content.bottom - 10 || y <= content.top + 10) {
          isEnter = false
          alert('关闭旋转功能')
        };
      }
    });
    // 鼠标滚动事件监听器
    canvas.addEventListener("wheel", function (event) {
      event.preventDefault(); // 阻止滚动页面
      if (isEnter) {
        isRotating = true;
        rotationDirection = event.deltaY > 0 ? -1 : 1; // deltaY > 0 表示向下滚动,逆时针旋转;deltaY < 0 表示向上滚动,顺时针旋转
      }
    });
    // 鼠标滚动停止事件监听器
    var timeoutId;
    canvas.addEventListener("wheel", function () {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(function () {
        isRotating = false;
      }, 100); // 停止滚动后100毫秒内不再进行旋转
    });
    // 动画循环函数
    function animate() {
      if (isRotating) {
        rotationAngle += rotationDirection * 1; // 每次增加/减少旋转角度
        rotateLine(rotationAngle);
      }
      requestAnimationFrame(animate);
    }
    function rotateLine(angle) {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      // 绘制原始直线
      // ctx.beginPath();
      // ctx.moveTo(50, 100); // 起点
      // ctx.lineTo(350, 100); // 终点
      // ctx.stroke();
      // 保存当前画布状态
      ctx.save();
      // 平移画布到直线中心点
      var centerX = 100;
      var centerY = 150;
      ctx.translate(centerX, centerY);
      // 旋转画布
      ctx.rotate((angle * Math.PI) / 180);
      // 绘制y轴
      ctx.beginPath();
      ctx.moveTo(0, 0);
      ctx.lineTo(0, -50);
      ctx.stroke();
      // 绘制x轴
      ctx.beginPath();
      ctx.moveTo(0, 0);
      ctx.lineTo(50, 0);
      ctx.stroke();
      // 恢复画布状态
      ctx.restore();
    }
    animate(); // 启动动画循环
  </script>
</body>
</html>

效果

image.png

canvas正交坐标旋转

目录
相关文章
|
前端开发
若依(ruoyi)前端Vue3 Element Plus Vite版样式修改
若依(ruoyi)前端Vue3 Element Plus Vite版样式修改
2591 0
|
存储 安全 文件存储
什么是NAS?探索无限存储的可能性
【4月更文挑战第21天】
5860 0
什么是NAS?探索无限存储的可能性
|
XML 域名解析 JSON
【RESTful】RESTful API 接口设计规范 | 示例
【RESTful】RESTful API 接口设计规范 | 示例
12952 0
【RESTful】RESTful API 接口设计规范 | 示例
|
7月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
2342 5
|
Web App开发 存储 网络安全
Charles抓包神器的使用,完美解决抓取HTTPS请求unknown问题
本文介绍了在 Mac 上使用的 HTTP 和 HTTPS 抓包工具 Charles 的配置方法。首先,强调了安装证书对于抓取 HTTPS 请求的重要性,涉及 PC 和手机端。在 PC 端,需通过 Charles 软件安装证书,然后在钥匙串访问中设置为始终信任。对于 iOS 设备,需设置 HTTP 代理,通过电脑上的 IP 和端口访问特定网址下载并安装证书,同时在设置中信任该证书。配置 Charles 包括设置代理端口和启用 SSL 代理。完成这些步骤后,即可开始抓包。文章还提及 Android 7.0 以上版本可能存在不信任用户添加 CA 证书的问题,但未提供解决办法。
4843 0
Charles抓包神器的使用,完美解决抓取HTTPS请求unknown问题
|
XML 数据格式 Python
【Python】已解决:AttributeError: ‘function’ object has no attribute ‘ELement’
【Python】已解决:AttributeError: ‘function’ object has no attribute ‘ELement’
616 0
|
存储 小程序 API
oss防盗链设置(Referer Configuration)
oss防盗链设置(Referer Configuration)
2785 5
|
小程序 安全 前端开发
从零玩转系列之微信支付开篇
从零玩转系列之微信支付开篇
168 0
从零玩转系列之微信支付开篇
|
SQL 数据可视化 前端开发
简单好用的ElasticSearch可视化工具:es-client和Head
使用 ElasticSearch(简称 es) 的过程中,经常有一些临时查询(如 排查问题、验证效果),一个趁手的可视化工具 可以提高工作效率。个人倾向于 免费(最好开源)、易于安装(如 浏览器插件),`es-client` 就是 比较简单好用的一个,尤其是 查询
12751 0