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正交坐标旋转

目录
相关文章
|
28天前
ThreeJs的场景实现鼠标拖动旋转控制
这篇文章介绍了如何在Three.js中实现通过鼠标拖动来旋转场景中的模型,并提供了实现这一功能的代码示例。
47 0
|
5月前
|
前端开发
canvas图形操作(缩放、旋转、位移)
canvas图形操作(缩放、旋转、位移)
|
6月前
|
前端开发 JavaScript 搜索推荐
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
142 1
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
|
JavaScript
js获取屏幕上圆和椭圆的点坐标
js获取屏幕上圆和椭圆的点坐标
js获取屏幕上圆和椭圆的点坐标
cesium中绘制立方体、设置材质、操作相机及获取鼠标经纬度和高度的方法
cesium中绘制立方体、设置材质、操作相机及获取鼠标经纬度和高度的方法
231 0
|
C语言
旋转的沙漏-[ Qt绘制旋转图像]
旋转的沙漏-[ Qt绘制旋转图像]
146 0
|
前端开发 JavaScript
canvas中的拖拽、缩放、旋转 (上) —— 数学知识准备
canvas中的拖拽、缩放、旋转 (上) —— 数学知识准备
883 0
canvas中的拖拽、缩放、旋转 (上) —— 数学知识准备
|
前端开发 开发者
Canvas中的拖拽、缩放、旋转 (下)——代码实现
Canvas中的拖拽、缩放、旋转 (下)——代码实现
574 0
Canvas中的拖拽、缩放、旋转 (下)——代码实现
|
前端开发 算法 API
用canvas 实现矩形的移动(点、线、面)
前言 在canvas中实现图片移动、实现矩形移动,大家可能看的很多了。但是我为什么还要去写这样的一篇文章呢,因为笔者曾经做到3维图形下的移动。包括移动一个立方体上的一条边线、一个面、移动多边形的一个点。最近一直在写canvas的相关的文章,想着复习下,读完本篇文章你可以学到,通过移动矩形的一个点, 一个条边线,以及整个面的移动。本篇文章从浅到深,希望你耐心读下去。
用canvas 实现矩形的移动(点、线、面)
鼠标控制物体旋转、移动、缩放(Unity3D)
Unity3D对于鼠标操作物体的旋转、移动、缩放的功能点使用的比较多。 今天就分享如何使用Unity实现鼠标对于物体的旋转、移动、缩放。