首页 > 其他分享 >canvas 鼠标与点之间连线

canvas 鼠标与点之间连线

时间:2024-06-02 19:10:41浏览次数:23  
标签:function canvas const 鼠标 连线 color ctx Math


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .canvas {
        width: 100%;
        height: calc(100vh - 24px);
        border: 1px solid black;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <canvas class="canvas"></canvas>

    <script>
      /** @type {HTMLCanvasElement} */
      const canvas = document.querySelector('.canvas');
      const ctx = canvas.getContext('2d');

      const pointMap = new Map();

      canvas.width = canvas.clientWidth * window.devicePixelRatio;
      canvas.height = canvas.clientHeight * window.devicePixelRatio;

      canvas.addEventListener('mousemove', (e) => {
        const rect = canvas.getBoundingClientRect();
        let x = e.clientX - rect.left,
          y = e.clientY - rect.top;
        x = (x * window.devicePixelRatio).toFixed(2);
        y = (y * window.devicePixelRatio).toFixed(2);

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        renderPoints();
        computedPosition(x, y);
      });

      randomPoints(canvas.clientWidth, canvas.clientHeight, 20);
      renderPoints();

      // 计算鼠标与每个点(圆)的距离
      function computedPosition(x, y) {
        // console.log('x, y => ', x, y);
        for (const [key, { x: pointX, y: pointY, color }] of pointMap) {
          const distance = Math.sqrt((x - pointX) ** 2 + (y - pointY) ** 2);
          if (distance < 200) {
            // 点与鼠标的距离小于200,则连线
            ctx.beginPath();
            ctx.moveTo(x, y);
            ctx.lineTo(pointX, pointY);
            ctx.strokeStyle = color;
            ctx.stroke();
          }
        }
      }

      // 渲染点
      function renderPoints() {
        for (const { x, y, color } of pointMap.values()) {
          // console.log("point => ", point)
          drawCircle(x, y, color);
        }
      }

      // 生成随机点
      function randomPoints(boundWidth, boundHeight, count = 0) {
        if (!count) return;

        count = parseInt(count);

        const minWidth = 0,
          minHeight = 0,
          maxWidth = boundWidth,
          maxHeight = boundHeight;

        for (let i = 0; i < count; i++) {
          let x = randomPoint(minWidth, maxWidth),
            y = randomPoint(minHeight, maxHeight);

          x = Math.floor(x / 10) * 10;
          y = Math.floor(y / 10) * 10;

          pointMap.set(i, { x, y, color: randomColor() });
        }
      }

      // 生成随机点的坐标
      function randomPoint(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
      }

      // 生成随机颜色
      function randomColor() {
        const letters = '0123456789ABCDEF';
        let color = '#';
        for (let i = 0; i < 6; i++) {
          color += letters[Math.floor(Math.random() * 16)];
        }
        return color;
      }

      // 绘制点(圆)
      function drawCircle(x, y, color = 'black') {
        ctx.beginPath();
        ctx.arc(x, y, 10, 0, 2 * Math.PI);
        ctx.fillStyle = color;
        ctx.fill();
      }
    </script>
  </body>
</html>

标签:function,canvas,const,鼠标,连线,color,ctx,Math
From: https://www.cnblogs.com/chlai/p/18227478

相关文章

  • canvas 合并图片和文字
    代码asyncgetImgInfo(img,text){returnnewPromise((resolve,reject)=>{constcanvas=document.createElement("canvas");canvas.width=52;canvas.height=68;constctx=canvas.getContext("2d");......
  • CSS实现鼠标悬停图片放大的方法
    CSS中实现鼠标悬停时图片放大的效果,可以通过使用:hover伪类选择器和transform属性来完成。以下是一个简单的示例代码:/*初始状态下的图片样式*/.img{width:100px;/*初始宽度*/transition:transform0.5sease;/*平滑过渡效果*/}/*鼠标悬停时的图片样式*/......
  • 如何使用 CSS 在鼠标悬停时显示和隐藏下拉菜单
    答案:使用CSS :hover 伪类如果您只想在鼠标悬停时显示和隐藏下拉菜单,则不需要任何JavaScript。您可以简单地使用CSS display 属性和 :hover pseudo-class 来做到这一点。以下示例将向您展示如何使用CSS实现简单的下拉菜单。示例<!DOCTYPEhtml><htmllang="......
  • mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版
    ShareMouse是一款跨平台的键盘和鼠标共享软件,它允许用户在多台计算机之间共享同一组键盘和鼠标,实现无缝的操作和控制。该软件适用于Windows和macOS系统,并且支持多种连接方式,包括局域网连接和无线连接。使用ShareMouse,用户可以轻松地在多台计算机之间切换和操作,而无......
  • 通过画布(Canvas)实现 ZLMRTCClient 同一视频流多次显示时只拉取一次
    效果预览视频画面网络请求代码实现ZLMRTCClient.js首先需要修改ZLMRTCClient.js的代码,解决由于网络导致播放失败时无法触发WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED事件的问题。修改前:修改后:修改内容://添加catch()axios({}).then(()=>{}).catch(()=>{......
  • CSS3 超实用属性:pointer-events (可穿透图层的鼠标事件)
    1、是什么pointer-events 直译为指针事件,该属性指定在什么情况下某个DOM可以成为鼠标事件的target。简而言之,就是允许/禁止DOM的鼠标事件(click事件、hover事件、mouse事件等鼠标事件)2、具体属性分析用法分析:pointer-events:auto|none|visiblePainted|visibleFill|......
  • win11通过注册表禁用鼠标右键
    本经验分为5个步骤,详情如下。工具/原料华硕K5win11专业版21H2注册表22000.556方法/步骤 同时按下“win”+"R"键,打开运行弹窗。 在运行框的输入框中输入“regedit”,然后点击"确定"按钮进入注册表。  接着依次打开以下的文件......
  • 功能实现:canvas图片缩放与移动
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>canvas图片缩放与移动</ti......
  • MarkdownFile新建添加到鼠标右键
    第一种方法:手动配置WIN+R进入运行窗口输入:regedit进入注册表1、找到【计算机\HKEY_CLASSES_ROOT\.md】这个目录。2、然后在此目录下修改“默认”,双击或右键修改,添加值:Typora.md。3、新建字符串值,修改名字ContentType,值为text/markdown。4、再次新建字符串值,修改名字......
  • uniapp_07_文本截取和canvas
    uniapp_07_文本截取和canvasuniapp的canvas文本截取获取图片颜色renderjs参考uniapp的canvasuniappcancas组件和api请看uniapp的官方文档,咕就不在这里写了,哎早知道当年就好好读书了,现在写个随笔都写不好,标点符号都不会用,果然没救了canvas组件和canvasApi与html......