canvas 简单直线轨迹运动与线性插值计算

news2024/11/21 1:37:09

canvas 简单直线轨迹运动与线性插值计算

一、canvas 直线轨迹运行

添加 canvas 语法提示

通过/** @type {HTMLCanvasElement} */代码块 来添加canvas的语法提示

<body>
  <canvas id="canvas"></canvas>
</body>
<script>
  /** @type {HTMLCanvasElement} */ 
</script>
获取 canvas,模拟demo数据
/** @type {HTMLCanvasElement} */
const canvas = document.getElementById("canvas");
// 建议设置宽高的方式
canvas.width = 600;
canvas.height = 600;
const coords = [
  [100, 100],
  [200, 200],
  [400, 200],
  [500, 300],
  [500, 500],
];
const img = new Image();
img.src = "img/arrow2.png";
let t = 0; // 图片移动步进
let index = 0; // 图片轨迹分段索引
const imgW = 242 / 10;
const imgH = 166 / 10;
// 图片运动轨迹分段
const animationCoords = [
  [coords[0], coords[1]],
  [coords[1], coords[2]],
  [coords[2], coords[3]],
  [coords[3], coords[4]],
];

// 获取canvas 的上下文
const ctx = canvas.getContext("2d");
根据模拟点位数据 coords,画轨迹
// 轨迹
function drawLine() {
  ctx.beginPath();
  ctx.moveTo(coords[0][0], coords[0][1]);
  ctx.lineTo(coords[1][0], coords[1][1]);
  ctx.lineTo(coords[2][0], coords[2][1]);
  ctx.lineTo(coords[3][0], coords[3][1]);
  ctx.lineTo(coords[4][0], coords[4][1]);
  ctx.strokeStyle = "gray";
  ctx.stroke();
}
drawLine();

在这里插入图片描述

运动中计算图片当前所在位置坐标与角度
/**
 * @desc 根据t切割line坐标,计算当前点的角度值,用于动画
 * @parmas start 轨迹线段开始坐标
 * @parmas end 轨迹线段结束坐标
 */
function computed(start, end, t) {
  const dx = end[0] - start[0];
  const dy = end[1] - start[1];
  const angle = Math.atan2(dy, dx);

  if (t > 1) return {};

  const x = start[0] + (end[0] - start[0]) * t;
  const y = start[1] + (end[1] - start[1]) * t;
  return {
    x,
    y,
    angle,
  };
}
绘制图片
function drawImage() {
  if (t >= 1) {
    t = 0; // 重置
    index++; // 进行下一分段的轨迹运动
    if (index === animationCoords.length) {
      index = 0; // 反复运动
    }
  }
  t += 0.01; // 控制动画速度
  const start = animationCoords[index][0];
  const end = animationCoords[index][1];
  const { x, y, angle } = computed(start, end, t);
  if (x === undefined) return;
  ctx.beginPath();
  ctx.translate(x, y); // 改变画布原点
  ctx.rotate(angle); // 旋转画布
  ctx.drawImage(img, -imgW / 2, -imgH / 2, imgW, imgH);
  // setTransform设置默认矩阵 恢复画布原点 避免后续画图坐标偏离。也可以通过save和restore的方式来恢复画布原点,save可以保存变换矩阵,在translate之前调用save
  ctx.setTransform(1, 0, 0, 1, 0, 0); 
}
编写动画函数
function animation() {
  // 清空画布 动画每一帧之前都需要清空画布,除非动画下一帧是全屏覆盖
  ctx.clearRect(0, 0, 600, 600); 
  requestAnimationFrame(animation); // 浏览器下一次渲染时执行动画函数
  drawImage();
  drawLine();
}
animation()

在这里插入图片描述

二、canvas 中的线性插值

已知 A,B 两点坐标,计算已知 x 或 y 的 C 点坐标,且 C 点在 AB 连线上

线性插值计算方法
/**
 * @desc 线性插值
 * @params coord1
 * @params coord2
 */
function TDLI(coord1, coord2) {
  const scale = (coord1[0] - coord2[0]) / (coord1[1] - coord2[1]);

  return {
    getY: (x) => (x - coord1[0]) / scale + coord1[1],
    getX: (y) => (y - coord1[1]) * scale + coord1[0],
  };
}
demo
const A = [90, 100];
const B = [205, 110];
const tdli = TDLI(A, B);

// 计算AB连线上 x坐标为 320的点
const Cx = 320;
const Cy = tdli.getY(Cx);

ctx.beginPath();
ctx.moveTo(A[0], A[1]);
ctx.lineTo(B[0], B[1]);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(B[0], B[1]);
ctx.lineTo(x, y);
ctx.setLineDash([4, 16]);
ctx.strokeStyle = "red";
ctx.stroke();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1195551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链探秘:从基础到深度,全面解读区块链技术与应用

1.区块链基本概念 1.发展历史 比特币诞生&#xff1a; 2008年&#xff0c;化名为中本聪的人发表了论文《Bitcoin&#xff1a;A Peer-to-Peer Electronic Cash System》 2009年1月3日&#xff0c;中本聪开发运行了比特币客户端程序并进行了首次挖矿&#xff0c;获得了第一批…

进阶课6——基于Seq2Seq的开放域生成型聊天机器人的设计和开发流程

情感聊天机器人通常属于开放领域&#xff0c;用户可以与机器人进行各种话题的互动。例如&#xff0c;微软小冰和早期的AnswerBus就是这种类型的聊天机器人。基于检索的开放领域聊天机器人需要大量的语料数据&#xff0c;其开发流程与基于任务型的聊天机器人相似&#xff0c;而基…

4面百度软件测试工程师的面试经验总结

没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年7月&#xff0c;我有幸成为了百度的一名测试工程师&#xff0c;从外包辞职了历经100…

解决Scrapy爬虫多线程导致抓取错乱的问题

目录 一、概述 二、问题分析 三、解决方案 四、案例分析 五、总结 一、概述 Scrapy是一个流行的Python爬虫框架&#xff0c;可以轻松地抓取网页数据并对其进行解析。然而&#xff0c;在抓取过程中&#xff0c;如果使用多线程进行并发处理&#xff0c;可能会遇到数据抓取错…

TCP触发海康扫码相机S52CN-IC-JQR-NNN25

PC环境设置 为保证客户端正常运行以及数据传输的稳定性&#xff0c;在使用客户端软件前&#xff0c;需要对 PC 环境 进行设置 关闭防火墙 操作步骤如下&#xff1a; 1. 打开系统防火墙。 2. 在自定义设置界面中&#xff0c;选择关闭防火墙的对应选项&#xff0c;并单击…

Linux学习教程(第一章 简介)1

Linux 系统已经渗透到 IT 领域的各个角落&#xff0c;作为一名 IT 从业人员&#xff0c;不管你是专注于编程&#xff0c;还是专注于运维&#xff0c;都应该对 Linux 有所了解&#xff0c;甚至还要深入学习&#xff0c;掌握核心原理。 Linux 学习建议&#xff1a;一定要安装 Li…

JSON可视化管理工具JSON Hero

本文软件由网友 zxc 推荐&#xff1b; 什么是 JSON Hero &#xff1f; JSON Hero 是一个简单实用的 JSON 工具&#xff0c;通过简介美观的 UI 及增强的额外功能&#xff0c;使得阅读和理解 JSON 文档变得更容易、直观。 主要功能 支持多种视图以便查看 JSON&#xff1a;列视图…

【斗罗二】霍雨浩拿下满分碾压戴华斌,动用家族力量,海神阁会议

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料《绝世唐门》第23话最新预告分析&#xff0c;魂兽升学考试中一场白虎魂师戴华斌与千年级别的风虎的决斗即将上演。风虎&#xff0c;作为虎类魂兽的王者&#xff0c;其强大的实力和独特的技能让这场战…

现在学编程还能够月薪过万吗?

当我们谈到职业选择时&#xff0c;一项常受人关注的问题是&#xff0c;现在学编程还能月薪过万吗&#xff1f;这似乎是一个不断挂在年轻人嘴边的问题&#xff0c;尤其是在数字化时代&#xff0c;编程的需求越来越大。 所以今天让我们一起探讨这个问题&#xff0c;看看现实生活…

漫谈广告机制设计 | 万剑归宗:聊聊广告机制设计与收入提升的秘密(1)

小时候看武侠电视剧《风云》的时候&#xff0c;其中无名有一招叫“万剑归宗”&#xff0c;乃是剑术最高境界。修炼的口诀是“万气自生&#xff0c;剑冲废穴&#xff1b;归元武学&#xff0c;宗远功长”&#xff0c;也就是说欲练此功&#xff0c;先自废武功&#xff0c;然后回归…

HIT_OS_LAB3 操作系统的引导

操作系统实验三 3.1. 实验目的 熟悉实验环境&#xff1b;建立对操作系统引导过程的深入认识&#xff1b;掌握操作系统的基本开发过程&#xff1b;能对操作系统代码进行简单的控制&#xff0c;揭开操作系统的神秘面纱。 3.2. 实验内容 3.2.1. 改写 bootsect.s 主要完成如下功…

如何下载Linux源码,看这篇就够了!

文章目录 前言一、linux官网二、查找发布版本三、下载方式 前言 在工作中&#xff0c;我们难免会遇到需要去找某个版本的linux源码的情况&#xff0c;今天这篇文章就手把手教大家如何找到自己想要的linux源码版本 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例…

医学影像系统源码(MRI、CT三维重建)

一、MRI概述 核磁共振成像&#xff08;英语&#xff1a;Nuclear Magnetic Resonance Imaging&#xff0c;简称NMRI&#xff09;&#xff0c;又称自旋成像&#xff08;英语&#xff1a;spin imaging&#xff09;&#xff0c;也称磁共振成像&#xff08;Magnetic Resonance Imag…

大数据Doris(二十):数据导入(Broker Load)介绍

文章目录 数据导入(Broker Load)介绍 一、​​​​​​​适用场景

docker通过nginx代理tomcat-域名重定向

通过昨天的调试&#xff0c;今天做这个域名就简单了&#xff0c; 正常我们访问网站一般都是通过域名比如&#xff0c;www.baidu.com对吧&#xff0c;有人也通过ip&#xff0c;那么这个怎么做呢&#xff1f;物理机windows可以通过域名访问虚拟机linux的nginx代理转向tomcat服务…

6.5对称二叉树(LC101-E)

算法&#xff1a; 其实就是比较左右子树是否可以翻转 比较的时候&#xff1a; 比较外面的节点是否相等&#xff0c;如示例1中的节点3 比较里面的节点是否相等&#xff0c;如示例1中的节点4 基本思路是这样的&#xff0c;那怎么遍历呢&#xff1f; 二叉树的题一定要掌握到…

开放式耳机井喷阶段,南卡品牌何以成为“头号玩家”?

对于耳机行业而言,过去两年的聚光灯属于开放式耳机这一才闯入赛道的品类。 在消费电子寒冬持续蔓延的时间节点,夺下属于自己的高光时刻实属不易,毕竟无论是过去数年间高歌猛进的智能可穿戴设备行业,还是更垂直的耳机赛道,现阶段均面临承压的局面。 一面是“前辈”们昔日的“爆…

HTB——常见端口及协议总结

文章目录 一、 常见端口二、HTTP协议三、FTP四、SMB 一、 常见端口 http协议&#xff1a;80、8000https协议&#xff1a;443、8443ftp协议&#xff1a;20&#xff08;数据传输&#xff09;、21&#xff08;发送命令&#xff09;smb协议&#xff1a;445 二、HTTP协议 https的…

【电源专题】POE 802.3af/at与802.3bt在握手阶段有什么差异

在文章:【电源专题】PSE如何与PD握手协商功率等级?中我们以PSE与PD设备在802.3af/at协议握手为例,讲到了PSE与PD协商时通过三个阶段:检测阶段、握手阶段、电压提升阶段。而对于802.3bt的握手存在明显的不同,所以本文就详细解释一下802.3bt协议为什么握手阶段与802.3af/at存…

《RN移动开发实战》3出版了,文末抽奖

前言 众所周知&#xff0c;传統的原生Android、iOS开发技术虽然比较成熟&#xff0c;但是多端重复开发的成本和开发效率的低下也是很多企业不愿意看到的&#xff0c;而不断崛起的跨平台技术让企业看到了曙光&#xff0c;“一次编写&#xff0c;处处运行”也不再是难以企及的目…