canvas的用法,使用vue3和canvas画一个树

news2024/11/24 16:36:39

一,canvas简介

 是 HTML5 新增的,一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画,甚至可以进行实时视频处理和渲染。

详情点击链接,前去菜鸟教程或者w3c查看

二,开始写代码,画树

首先看一下预览图

 实现步骤:

  1.         创建vue3项目,在APP.vue中添加canvas
    <canvas ref="canvas"></canvas>
  2.  在js中,使用ref接收
    let canvas=ref(null)
  3.  因为是在标签内做画,所以代码必须要写在onMounted生命周期中
    onMounted(()=>{
      const ctx=canvas.value.getContext('2d')
      canvas.value.width=window.innerWidth*window.devicePixelRatio
      canvas.value.height=window.innerHeight*window.devicePixelRatio
      ctx.translate(canvas.value.width/2, canvas.value.height)
      ctx.scale(1,-1)
      ctx.beginPath()
      ctx.lineWidth="10"
      ctx.lineCap="round"
      ctx.strokeStyle="#ccc"
      ctx.moveTo(0,0)
      ctx.lineTo(0,100)
      ctx.stroke()
    })

    第一行getContext('2d')渲染上下文,就是用来渲染页面的,是必须的.第二和第三行用来设置画布大小.第四行translate()用来移动画布,把画布的坐标原点移动到页面的中下方,因为默认的坐标原点是在页面左上角,这样不利于后期计算.第五行scale()用来翻转y轴

     第六行beginPath()为新建一条路径.第七行设置路径(线条)的宽度,默认单位为px.第八行设置路径(线条)的结尾方式,round为圆弧形,此外还有

     第九行设置线条颜色,第十行moveTo()把画笔移动到坐标原点,准备开始画线。第十一行lineTo()为线条的结束点,第十二行stroke()通过线条来绘制图形轮廓,最终就有了上图的一条线,这这是一条线,剩下的只需要把这些代码抽进一个方法里,然后递归即可

  4. 写方法

    //ctx上下文 起始坐标,线条粗细,线条长度,角度
    function drawTree(ctx,v0,thick,length,dir){
      if(thick<3&&Math.random()<0.3)return
      if(thick<2){
        ctx.beginPath()
        ctx.arc(...v0,20,0,2*Math.PI)
        ctx.fillStyle=Math.random()<0.3?'#ccc':'red'
        ctx.fill()
        return
      }
      ctx.beginPath()
      ctx.moveTo(...v0)
      const v1=[
        v0[0]+length*Math.cos((dir*Math.PI)/100),
        v0[1]+length*Math.sin((dir*Math.PI)/100),
      ]
      ctx.lineTo(...v1)
      ctx.lineCap='round'
      ctx.lineWidth=thick
      ctx.strokeStyle='#333'
      ctx.stroke()
      // 渲染帧函数
      // requestAnimationFrame(()=>{
      //   drawTree(ctx,v1,thick*0.8,length*0.8,dir+Math.random()*30),
      //   drawTree(ctx,v1,thick*0.8,length*0.8,dir-Math.random()*30)
      // })
      setTimeout(() => {
        drawTree(ctx,v1,thick*0.8,length*0.8,dir+Math.random()*30),
        drawTree(ctx,v1,thick*0.8,length*0.8,dir-Math.random()*30)
      }, 50);
    }

    在这个方法中,传人了线条起始坐标,线条粗细,线条长度,线条角度,写了地递归结束条件,线条粗细小于3像素并且随机数小于0.3结束,如果线条粗细小于2就画上圆形花瓣,颜色随机,最主要的是lineTo()线条结束坐标点,需要三角函数的知识,cos和sin方法来计算,最后的渲染帧函数和setTimeout函数是用来做动画效果的,setInterval也可以,最后在onMonuted生命周期里调用一下就可以了

    onMounted(()=>{
      const ctx=canvas.value.getContext('2d')
      canvas.value.width=window.innerWidth*window.devicePixelRatio
      canvas.value.height=window.innerHeight*window.devicePixelRatio
      ctx.translate(canvas.value.width/2, canvas.value.height)
      ctx.scale(1,-1)
      // ctx.beginPath()
      // ctx.lineWidth="10"
      // ctx.lineCap="round"
      // ctx.strokeStyle="#ccc"
      // ctx.moveTo(0,0)
      // ctx.lineTo(0,100)
      // ctx.stroke()
      drawTree(ctx,[0,0],10,200,50)
    })
  5. 结束!谢谢观看,欢迎指正

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

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

相关文章

牛客网最新版 Java 面试题大全带答案 1100 多题(限时分享)

面试题就好像科举考试时代背的八股文&#xff0c;是知识改变命运的代表作。你不刷&#xff0c;不管是校招还是社招&#xff0c;就很过这一关。面试前还是很有必要针对性的刷一些题&#xff0c;很多朋友的实战能力很强&#xff0c;但是理论比较薄弱&#xff0c;面试前不做准备是…

MySQL数据备份与还原、索引、视图

一.备份与还原 /***************************样例表***************************/ CREATE DATABASE booksDB; use booksDB; CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL …

Unity2019_寻路系统

简单导航寻路功能 选定为静态网格导航 Windows>Ai>Navigation&#xff0c;点击烘焙 角色上挂一个导航网格组件 挂上脚本&#xff0c;鼠标点击位置设置为导航的终点 using UnityEngine; using UnityEngine.AI;public class PalyerMovement : MonoBehaviour {private Nav…

Mysql——》数据目录

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

vue3 KeepAlive实操

一.相关文档 KeepAlive 官方文档Vue Router 文档Pinia 文档 二.需求 首页->列表 —不缓存列表列表->详情 —缓存列表详情->列表 — 恢复列表缓存 三.代码如下 1.定义pinia export const useStore defineStore(store, {state: () > ({cachedList: [] //缓存白…

校园课表微信小程序全栈项目

遇到的第一个问题关于npm start 首先找到对应的后端项目 crtl shift (esc键下的波浪号) 召唤终端 Error:Cannot find module dotenv 解决问题: npm install dotenv 简写 npm i dotenv 然后遇到第二个问题 Port 3000 is already in use 我的3000接口被占用 那就要去检…

【直到用了Tabby这款开源好用的终端工具,直接和Xshell、Putty、FinalShell告别】

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

红队攻击:初始访问

聆听你的声音 如果你有独到的想法和建议&#xff0c;欢迎私信与我一同分享&#xff01; 公众号&#xff1a;安全攻防渗透 0x01 windows-多账户同时登陆 描述 攻击者可能会获取并滥用本地帐户的凭据&#xff0c;以获取初始访问权限&#xff0c;持久性&#xff0c;权限提升或…

未设置Strict-Transport-Security响应头【原理扫描】

IIS环境检测到网站存在响应头缺失漏洞解决办法: 1.webconfig中添加响应头 <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><directoryBrowse enabled"false" /><httpProtocol><cu…

Elasticsearch 8.8.1安装及启动

华为云的镜像去下载 ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?CN&OD logstash: https://mirrors.huaweicloud.com/logstash/?CN&OD kibana: https://mirrors.huaweicloud.com/kibana/?CN&OD 原文链接&#xff1a;https://blog.csdn.ne…

AI加速财务智能化,实在智能、优贲财税、楚云科技共探数字员工新未来

作为财务发展的最新前沿&#xff0c;智能财务正在逐步渗入日常工作中&#xff0c;加快企业数字化转型步伐&#xff0c;促进我国财务信息化建设的快速发展。在当前形势下&#xff0c;企业应如何进行数字化转型以重塑业务、财务和税务等关系&#xff0c;形成管理闭环&#xff0c;…

注解和反射03(Java)

#拓展开题&#xff1a; 类的加载与ClassLoader的理解 什么时候会发生类初始化&#xff1f; 类加载器的作用 动态创建对象执行方法 有了Class对象&#xff0c;能做什么&#xff1f; newInstance()是一个Java中使用反射创建对象实例的方法&#xff0c;通过该方法可以获取类的构…

智能物流监控系统的数据平台技术研究

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.1 项目背景 物联网技术是利用传感器嵌入各种末端设备&#xff0c;通过无线或有线网络接入互联网以实现人与物、物与物实时互联的新兴技术[1]。 智能物流监控系统是在物流量越来越大、物流价值越来越贵重的背…

【Distributed】zookeeper+kafka的应用及部署

文章目录 一、zookeeper1. zookeeper的概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制第一次启动选举机制非第一次启动选举机制选举Leader规则 2. 部署 Zookeeper 集群2.1 安装前准备2.2…

MySQL数据库表数据的基本操作

目录 1.创建表 2.插入数据 3.修改表数据 3.1、将所有员工薪水修改为5000元 ​3.2、将姓名为张三的员工薪水修改为3000元 ​3.3、将姓名为李四的员工薪水修改为4000元gender改为女 ​3.4、将王五的薪水在原有基础上增加1000元 4、MySQL字符集 1.创建表 创建员工表emplo…

【技巧】Latex在线工具:公式编辑器、表格编辑器

找到什么再补充 目录 表格编辑器 公式编辑器 表格编辑器 https://www.tablesgenerator.com/ 公式编辑器 https://www.latexlive.com/

数据库开发和数据库管理有什么区别?

数据库开发&#xff08;Database Development&#xff09;和数据库管理&#xff08;Database Administration&#xff09;是数据库领域中的两个关键角色和职责。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 数据库开发人员专注于以下方面&#xff1a…

windows安装gitlab-runner提交gitlab自动打包maven包

运行环境&#xff1a; 私服gitlab,想使用gitlab的ci/cd自动打包&#xff0c;不需要将打好的包部署到远程服务器而是保存在本地的&#xff0c;可以在本地安装gitlab-runner,打好的包直接在本地生成 本地是window环境 1 本地安装maven https://maven.apache.org/download.cgi …

Python批量对word文件重命名

一、背景 在日常工作或学习中&#xff0c;我们可能会遇到需要对大量的 Word 文件进行重命名的情况。手动一个一个修改文件名费时费力&#xff0c;而编写一个 Python 脚本则可以自动化完成这个任务&#xff0c;提高效率。 二 、开发环境 为了实现批量对 Word 文件进行重命名的功…

leaflet在天地图上添加poi兴趣点

前言 书接上节&#xff0c;在上一篇博客加载的天地图的基础上&#xff0c;加载poi兴趣点。 上节传送&#xff1a;使用leaflet在html中加载天地图且去掉左上角的缩放图标以及右下角的logo 一、加载poi的方法 leaflet通过 L.marker 方法用来加载poi&#xff0c;我们只需填入p…