一个小的画布Canvas页面,记录点的轨迹

Hello大家好,好久没有更新了,最近在忙一些其他的事,今天说一下画布canvas,下面是我的代码,实现了一个点从画布的(0,0)到(canvas.width,canvas.height)的一个实现其中我在canvas里面加了一个背景,你们只需要把你们的图片放在上面即可实现一小段代码的运行,好久没有说知识点了!!慢慢会来的。打算更一些计网和数据库,暑假说吧!我是:

爱吃鸡爪zi!

话不多说,代码如下:建议从draw函数看起走

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    body {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
    }
    .container {
      text-align: center;
      font-family: Arial, sans-serif;
      border: 2px solid #000;
      padding: 20px;
      border-radius: 10px;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      height: 80vh;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }
    canvas {
      border: 1px solid #000;
      width: 80%;
      height: 50%;
    }
    .buttons {
      margin-top: 20px;
    }
    button {
      margin: 0 10px;
      padding: 10px 20px;
      font-size: 16px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>路径安全活动展示</h1>
    <canvas id="myCanvas"></canvas>
    <div class="buttons">
      <button id="backButton">返回上一级</button>
      <button id="refreshButton">刷新</button>
      <button id="stopButton">停止动画</button>
    </div>
  </div>

  <script>
    var canvas = document.getElementById('myCanvas');
    var ctx = canvas.getContext('2d');
   
    // 设置画布的宽度和高度
    canvas.width = 400;
    canvas.height = 400;
    // 创建一个新的Image对象
    var backgroundImage = new Image();
    // 设置Image对象的src属性为你的图片URL
    backgroundImage.src = '../img/bg1.png';

    // 在图片加载完成后,绘制图片到画布上
    backgroundImage.onload = function() {
      ctx.drawImage(backgroundImage, 0, 0, canvas.width, canvas.height);
    };
    // 在图片加载完成后,绘制图片到画布上
    backgroundImage.onload = function() {
      ctx.drawImage(backgroundImage, 0, 0, canvas.width, canvas.height);
    };
    var obstacles = [
      {x:100 ,y:0 , size:15},
      { x: 50, y: 50, size: 10 },
      { x: 100, y: 100, size: 10 },
      {x:180 ,y:100 , size:15},
      { x: 150, y: 150, size: 10 },
      {x:170 ,y:210 , size:15},
      {x:250 ,y:210 , size:15},
      {x:250 ,y:260 , size:15},
      {x:380 ,y:260 , size:15}
    ];

    var redCircle = {
      x: 10,
      y: 10,
      speed: 0.6,
      direction: 'right'
    };

    var animationRunning = true;
    var redCircleVisible = true;

    function drawObstacles() {
      for (var i = 0; i < obstacles.length; i++) {
        var obstacle = obstacles[i];
        ctx.fillStyle = 'black';
        ctx.fillRect(obstacle.x, obstacle.y, obstacle.size, obstacle.size);
      }
    }

    function drawRedCircle() {
      if (redCircleVisible) {
        ctx.fillStyle = 'red';
        ctx.beginPath();
        ctx.arc(redCircle.x, redCircle.y, 10, 0, Math.PI * 2);
        ctx.fill();
      }
    }

    function updateRedCirclePosition() {
      if (redCircle.direction === 'right') {
        redCircle.x += redCircle.speed;
        if (redCircle.x >= canvas.width - 10) {
          redCircle.x = canvas.width - 10;
          redCircle.direction = 'down';
        }
      } else if (redCircle.direction === 'down') {
        redCircle.y += redCircle.speed;
        if (redCircle.y >= canvas.height - 10) {
          redCircle.y = canvas.height - 10;
          redCircleVisible = false;
          animationRunning = false;
          alert("红色点已到达右下角!");
        }
      }

      for (var i = 0; i < obstacles.length; i++) {
        var obstacle = obstacles[i];
        if (
          redCircle.x < obstacle.x + obstacle.size &&
          redCircle.x + 10 > obstacle.x &&
          redCircle.y < obstacle.y + obstacle.size &&
          redCircle.y + 10 > obstacle.y
        ) {
          if (redCircle.direction === 'right') {
            redCircle.direction = 'down';
          } else if (redCircle.direction === 'down') {
            redCircle.direction = 'right';
          }
        }
      }
    }

    function draw() {
        
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.drawImage(backgroundImage, 0, 0, canvas.width, canvas.height);
      drawObstacles();
      drawRedCircle();
      updateRedCirclePosition();
    }

    function animate() {
      if (animationRunning) {
        draw();
        requestAnimationFrame(animate);
      }
    }

    animate();
    // 按钮事件处理函数
    document.getElementById('backButton').addEventListener('click', function() {
      window.history.back();
    });

    document.getElementById('refreshButton').addEventListener('click', function() {
      window.location.reload();
    });

    document.getElementById('stopButton').addEventListener('click', function() {
      animationRunning = false;
      alert("动画已停止");
    });
  </script>
</body>
</html>

其中,没有使用什么算法,// 设置Image对象的src属性为你的图片URL
    backgroundImage.src = '../img/bg1.png';把这个的src换为自己的即可。下面是我的运行截图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】UI学习——界面切换

界面切换 push和poppresent和dismiss示例程序 push和pop 在 Objective-C 中,pop 和 push 通常是与 UINavigationController 一起使用的方法,用于控制导航栈中视图控制器的跳转和回退。 push 和 pop 通常成对使用,用于实现导航栈的前进和后退功能。当用户进入新的视图控制器时…

一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)

一种新的一维时间序列信号盲解卷积算法&#xff08;以旋转机械故障诊断为例&#xff0c;MATLAB环境&#xff09;&#xff0c;可作为深度学习信号前处理过程&#xff0c;水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…

C++ 10 之 引用

c10引用.cpp #include <iostream>using namespace std;int main() {// 引用的语法&#xff1a;类型 &别名 原名// int a 10;// int &b a; // 此时a,b指向同一块内存// cout << "a: " << a << endl;// cout << "b: &…

【机器学习】GANs网络在图像和视频技术中的应用前景

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 1. &#x1f525;引言 背景介绍 研究意义 2. &#x1f388;GANs的基本概念和工作原理 生成对抗网络简介 工作原理 3. &#x1f916;GANs在图像生成中的应用 图像超分辨率 工作原理 图像去噪 工作原理 图…

java基于Vue+Spring boot前后端分离架构开发的一套UWB技术高精度定位系统源码

java基于VueSpring boot前后端分离架构开发的一套UWB技术高精度定位系统源码 系统采用UWB高精度定位技术&#xff0c;可实现厘米级别定位。UWB作为一种高速率、低功耗、高容量的新兴无线局域定位技术&#xff0c;目前应用主要聚焦在室内外精确定位。在工业自动化、物流仓储、电…

每日5题Day22 - LeetCode 106 - 110

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {…

航班进出港管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;航班信息管理&#xff0c;航飞降落请求管理&#xff0c;公告信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&a…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换主干网络之 StarNet | 《重写星辰⭐》

本改进已集成到 YOLOv8-Magic 框架。 论文地址:https://arxiv.org/abs/2403.19967 论文代码:https://github.com/ma-xu/Rewrite-the-Stars 最近的研究引起了人们对“星形运算”(按元素乘法)在网络设计中未被充分利用的潜力的关注。虽然直观的解释很多,但其应用的基本原理…

C# WinForm ——31 32 Menustrip菜单栏

1. 介绍 菜单控件&#xff0c;包含多个菜单项的菜单容器 主菜单下面可以有子菜单&#xff0c;子菜单下面可以有下一级子菜单 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用Dock定义要绑定到容器的控件边框&#xff0c;默认是t…

IDEA配置mybatis-config.xml模板文件

IDEA配置mybatis-config.xml模板文件 File>>Settings>>File and Code Templates 创建mybatis-config.xml模板 模板内容取自mybatis官网 mybatis官网 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC &qu…

WEB基础--TOMCAT服务器

服务器概述 什么是服务器 服务器&#xff1a;就是一个提供为人民服务的机器&#xff0c;这里的服务器主要指计算机服务器&#xff0c;分为两种&#xff1a;服务器软件和硬件服务器&#xff1b; 服务器分类 1、硬件服务器&#xff1a;安装了服务器软件的主机。就相当于高配的…

LogicFlow 学习笔记——2. LogicFlow 基础 实例

LogicFlow 实例 创建实例 每一个流程设计界面&#xff0c;就是一个 LogicFlow 的实例。 <template><div id"container"></div><!-- 用于显示 LogicFlow 图表的容器 --> </template> <script>// 创建 LogicFlow 实例const lf …

赛氪网受邀参加上海闵行区翻译协会年会,共探科技翻译创新之路

在科技飞速发展的时代背景下&#xff0c;翻译行业正面临着前所未有的机遇与挑战。作为连接高校、企业与社会的桥梁&#xff0c;赛氪网在推动翻译创新、促进学术交流方面展现出了独特的魅力。2024年6月9日&#xff0c;在华东师范大学外语学院举办的第十三届上海市闵行区翻译协会…

C++(构造和析构)

目录 1. 构造函数 1.1 概念 1.2 构造函数的分类 1.2.1 默认构造函数 1.2.2 带参数的构造函数 1.2.3 拷贝构造函数 1.2.4 移动构造函数 2. 析构函数 2.1 概念 3. 每期一问 3.1 上期答案 1. 构造函数 1.1 概念 在C中&#xff0c;构造函数&#xff08;Constructor&am…

Python - OS模块+sys模块

一、OS模块基本用法&#xff1a; import osprint(os.getcwd()) # 获取当前工作目录os.chdir(data) # 改变当前脚本工作目录&#xff1b;相当于终端里面的cd命令 print(os.getcwd()) # 获取当前工作目录 运行结果&#xff1a; D:\__TC22008_VBF\FOTA-vFlash-AutoTest D:\__TC22…

Mac下载了docker,在终端使用docker命令时用不了

问题&#xff1a;在mac使用docker的时候&#xff0c;拉取docker镜像失败 原因&#xff1a;docker是需要用app使用的 &#xff0c;所以在使用的时候必须打开这个桌面端软件才可以在终端上使用docker命令&#xff01;&#xff01;&#xff01;

【企业家必看】解锁财富新机遇:二人订单共享模式

在这个充满变革与创新的时代&#xff0c;我们有幸向您介绍一种全新的商业模式——二人订单共享模式。这不仅是一次商业创新&#xff0c;更是一次财富与价值共享的革命。 终身消费&#xff0c;终身收益 只需一次499元的终身消费&#xff0c;您即可成为会员。这意味着&#xff0…

JavaScript的选择结构和循环结构

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

晋级决赛 | 璞华龙舟队:驰骋双湖展雄风,龙舟“浪”出新高度!

“金荡杯”第三届江苏省传统龙舟邀请赛 6月2日&#xff0c;“金荡杯”第三届江苏省传统龙舟邀请赛&#xff08;鹅湖站&#xff09;在风景如画的鹅湖畔火热开赛。 碧波荡漾的湖面上&#xff0c;数条龙舟犹如一条条巨龙&#xff0c;蓄势待发&#xff0c;准备在比赛中一展风采。随…

cesium 多边形加边框宽度 Polygon outlineWidth

cesium中用polygon添加多边形时&#xff0c;设置outlineWidth无效&#xff0c;常见做法是在添加polygon的同时加一个polyline&#xff0c;但是当多边形相邻两条边的角度比较小的情况下&#xff0c;这两个点的连接处有明显的交叉。 解决方案&#xff1a; 第一步&#xff1a;通过…