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>

效果

canvas正交坐标旋转文章来源地址https://www.toymoban.com/news/detail-603347.html

到了这里,关于canvas正交坐标系旋转--监听滚轮的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

    1. 平移 (Translation) 在2D空间中,我们经常需要将一个点平移到另一个位置。假设空间中的一点 P ( x , y ) P(x,y) P ( x , y ) ;将其向 x , y x, y x , y 方向分别平移 t x t_x t x ​ , t y t_y t y ​ , 假设平移后点的坐标为 ( x ′ , y ′ ) (x\\\',y\\\') ( x ′ , y ′ ) ,则上述点的平移操作可以归纳为

    2024年02月15日
    浏览(38)
  • 无人机中的坐标系、旋转矩阵与相机姿态计算

    球坐标系 球坐标系是三维坐标系中的一种,在无人机中一般使用球坐标系来表示相机姿态,相机姿态的坐标是相对于无人机的,而无人机的飞行姿态则是相对于大地坐标系的。这里我们使用的相机是2自由度的相机,即可以水平 ϕ phi ϕ 和垂直 θ theta θ 两个方向转动,其中

    2024年02月12日
    浏览(38)
  • 3Dslicer医学图像三维坐标系(xyz,RAS,IJK)差异,转换,旋转,平面角

    目录 World coordinate system世界坐标系xyz Anatomical coordinate system解剖学坐标系(LPS/RAS/RAI) Image coordinate system图像坐标系ijk Image transformation图像转换 三维坐标变换 A.旋转矩阵和旋转向量 B.欧拉角 C.四元数​编辑 计算平面角Angle Planes插件 参考链接 处理医学图像和应用程序时的问题之一

    2024年01月17日
    浏览(151)
  • arcgis javascript api4.x加载天地图wgs84(wkid:4326)坐标系

    使用arcgis javascript api4.x以basetilelayer方式加载天地图wgs84(wkid:4326)坐标系 效果: 提示:(下述三个文件放同一个文件夹下) 4326.js MyCustomTileLayer.js loadtdt4326.html https://www.cnblogs.com/hjyjack9563-bk/p/16067633.html

    2024年01月17日
    浏览(46)
  • arcgis javascript api4.x加载天地图web墨卡托(wkid:3857)坐标系

    效果: 示例代码:

    2024年01月17日
    浏览(39)
  • arcgis javascript api4.x以basetilelayer方式加载天地图web墨卡托(wkid:3857)坐标系

    arcgis javascript api4.x以basetilelayer方式加载天地图web墨卡托(wkid:3857)坐标系 提示: 2个文件放同一个文件夹下 MyCustomTileLayer.js loadtdt3857.html https://www.cnblogs.com/hjyjack9563-bk/p/16067633.html

    2024年01月19日
    浏览(46)
  • 世界坐标系、相机坐标系、图像坐标系、像素坐标系

    四个坐标系都是什么? 1.世界坐标系-相机坐标系-图像坐标系-像素坐标系 2.像素坐标系-图像坐标系-相机坐标系-世界坐标系 图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系                     构建世界坐标系只是

    2024年01月21日
    浏览(67)
  • 坐标转换(相机坐标系、世界坐标系、图像物理坐标系、图像像素坐标系)

    一般情况下我们所涉及到的坐标包括四个,即相机坐标系、世界坐标系、图像物理坐标系、图像像素坐标系。我们本文的讲解思路是在讲解每个坐标转换之前先讲清楚每个坐标系所表示的含义。本文主要参考由高翔主编的视觉SLAM十四讲第五章相机模型。 相机将三维世界的坐

    2024年02月09日
    浏览(71)
  • 关于世界坐标系,相机坐标系,图像坐标系,像素坐标系的一些理解

    在项目中,研究标定时,像素坐标与轴位置的关系时,需要用到关于坐标系的转换。在此也就是找到世界坐标系与像素坐标系的转换关系。想理清楚故做如下记录。 四坐标关系图如下: 图中: 世界坐标系(O W —X W Y W Z W ): 一个三维直角坐标系,以其为基准可以描述相机

    2024年02月09日
    浏览(70)
  • 对于SLAM定位中各类坐标系的理解(坐标系,里程计坐标系,基座坐标系与雷达坐标系)

    最近系统性学习了一遍LIO-SAM,开始的时候一直搞不懂里程计坐标系,经过不断学习才有了一点自己的拙见。 引言 :首先我们搞清楚SLAM算法主要是解决建图与定位问题,其更 侧重定位 ,即让机器人知道自己在全局地图的哪个位置,只有这样才能继续后续的预测、感知、控制

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包