Canvas学习笔记02:canvas的路径扫盲,附代码案例

hello,我是贝格前端工场,最近在学习canvas,分享一些canvas的一些知识点笔记,本期分享canvas的路径知识,欢迎老铁们一同学习,欢迎关注,如有前端项目可以私信贝格。

一、什么是canvas路径

Canvas路径(Canvas Path)是指在HTML5的Canvas元素上绘制的图形的路径。路径是由一系列的线段和曲线组成的,可以用来描述和绘制复杂的图形。

Canvas路径包括两种基本的绘制命令:线段(line)和曲线(curve)。

  1. 线段:线段是由起点和终点组成的直线。绘制线段的命令是lineTo(x, y),其中(x, y)是线段的终点坐标。
  2. 曲线:曲线可以是贝塞尔曲线或弧线。绘制贝塞尔曲线的命令有quadraticCurveTo(cp1x, cp1y, x, y)和bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y),其中(cp1x, cp1y)和(cp2x, cp2y)是控制点坐标,(x, y)是曲线的终点坐标。绘制弧线的命令是arcTo(x1, y1, x2, y2, radius),其中(x1, y1)和(x2, y2)是曲线的起点和终点,radius是曲线的半径。

通过使用这些绘制命令,可以在Canvas上创建复杂的路径,然后可以使用fill()或stroke()等命令填充或描边路径,从而实现各种形状和图形的绘制。


 


 

除了基本的绘制命令,还可以使用moveTo(x, y)命令将当前绘制位置移动到指定的坐标,closePath()命令闭合路径,arc(x, y, radius, startAngle, endAngle, anticlockwise)命令绘制弧形等。

Canvas路径提供了强大的绘制功能,可以实现各种复杂的图形和效果,如绘制线条、多边形、圆形、曲线、文字等。

二、canvas路径的用途

Canvas路径提供了丰富的绘制功能,可以实现各种复杂的图形和效果。以下是一些Canvas路径可以实现的常见功能:


 

  1. 绘制基本形状:使用Canvas路径可以绘制基本的形状,如线段、矩形、圆形、椭圆等。
  2. 绘制多边形:通过连接多个线段,可以绘制多边形,如三角形、四边形、五边形等。
  3. 绘制曲线:Canvas路径支持绘制贝塞尔曲线和弧线,可以实现平滑的曲线效果。
  4. 绘制文字:使用Canvas路径可以绘制文字,可以通过路径来控制文字的形状和布局。
  5. 绘制复杂图形:通过组合和变换路径,可以绘制复杂的图形,如复杂的几何图形、图标、图表等。
  6. 填充和描边路径:可以使用填充和描边命令来给路径添加颜色和样式,实现填充和描边效果。
  7. 裁剪路径:可以使用裁剪命令来限制绘制的范围,只在指定的路径内进行绘制,实现裁剪效果。
  8. 动画效果:通过不断更新路径的属性和重新绘制,可以实现动画效果,如移动的路径、变形的路径等。

总之,Canvas路径提供了丰富的绘制功能,可以实现各种复杂的图形和效果,可以用于制作图表、图标、游戏、动画等各种应用场景。

三、如何使用canvas路径

要使用Canvas路径,需要以下步骤:

  1. 获取Canvas元素:首先,需要获取到Canvas元素的引用,可以使用document.getElementById()或其他方法获取到Canvas元素的引用。
  2. 获取绘图上下文:通过Canvas元素的getContext()方法,可以获取到绘图上下文对象。绘图上下文对象是实际执行绘图操作的对象,可以通过该对象进行路径的绘制和其他绘图操作。
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
  1. 绘制路径:通过调用绘图上下文对象的路径绘制命令,可以创建和绘制路径。可以使用beginPath()方法开始一个新的路径,然后使用路径绘制命令(如lineTo()、quadraticCurveTo()、bezierCurveTo()、arcTo()等)来定义路径的形状。
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(150, 50);
ctx.lineTo(150, 150);
ctx.lineTo(50, 150);
ctx.closePath();
  1. 填充或描边路径:可以使用fill()方法来填充路径,使用stroke()方法来描边路径。填充和描边路径之前,可以通过设置绘图上下文对象的属性(如fillStyle、strokeStyle、lineWidth等)来设置填充和描边的样式。
ctx.fillStyle = "red";
ctx.fill();

ctx.strokeStyle = "blue";
ctx.lineWidth = 2;
ctx.stroke();
  1. 其他路径操作:除了绘制路径之外,还可以使用其他路径操作命令来对路径进行操作。例如,可以使用moveTo()方法移动当前绘制位置,使用closePath()方法闭合路径,使用clip()方法裁剪路径等。
ctx.moveTo(100, 100);
ctx.lineTo(200, 200);
ctx.closePath();
ctx.clip();

通过以上步骤,就可以使用Canvas路径进行绘图操作。可以根据需要,组合和变换路径,实现各种复杂的图形和效果。

四、示例:一个圆沿着曲线滚动

下是一个使用Canvas路径实现圆形在一条曲线上运动的示例代码:

var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");

// 定义曲线路径
ctx.beginPath();
ctx.moveTo(50, 200);
ctx.quadraticCurveTo(200, 50, 350, 200);
ctx.lineWidth = 2;
ctx.strokeStyle = "blue";
ctx.stroke();

// 定义圆形的初始位置和半径
var x = 50;
var y = 200;
var radius = 10;

function drawCircle() {
  // 清除画布
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 绘制曲线路径
  ctx.beginPath();
  ctx.moveTo(50, 200);
  ctx.quadraticCurveTo(200, 50, 350, 200);
  ctx.lineWidth = 2;
  ctx.strokeStyle = "blue";
  ctx.stroke();

  // 绘制圆形
  ctx.beginPath();
  ctx.arc(x, y, radius, 0, 2 * Math.PI);
  ctx.fillStyle = "red";
  ctx.fill();

  // 更新圆形的位置
  x += 1;
  y = 200 + Math.sin(x / 100) * 100;

  // 循环绘制
  requestAnimationFrame(drawCircle);
}

// 开始绘制
drawCircle();

在上述代码中,首先定义了一条曲线路径,使用quadraticCurveTo()方法绘制二次贝塞尔曲线。然后定义了圆形的初始位置和半径。在drawCircle()函数中,先清除画布,然后重新绘制曲线路径和圆形,再更新圆形的位置。通过不断更新圆形的位置和重新绘制,使用requestAnimationFrame()实现动画效果。最后调用drawCircle()函数开始绘制。

后记:贝格前端工场也开始研究canvas,欢迎志同道合的朋友一块学习,分享中如有不足之处欢迎指正。

往期回顾


Canvas学习笔记01:可供canvas操作对象及主要作用

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

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

相关文章

滑动窗口刷题(三)

1. 找到字符串中所有字母异位词 1.题目解析 比较易懂,不做解析。 2.算法思路 哈希表滑动窗口有效字符个数优化 创建两个哈希表,将p字符串存入哈希表2。 定义cnt存放有效字符个数。 进窗口:存入哈希表1,如果该元素在哈希1中的…

嵌入式中常见语言对内存管理基本方法

大家好,今天给大家分享一下,从语言角度来讲:对比常见的几种语言对内存的管理方法​。 (1)汇编语言:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010 )&…

前端工程化面试题 | 17.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

python:读 Freeplane.mm文件,使用 xml.etree 生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 强大的节点功能,不仅仅节点的种类很多&#xf…

提升代码能力:程序员的进阶之路

提升代码能力:程序员的进阶之路 在当今日益发展的技术领域,程序员的代码能力对于个人职业发展至关重要。优秀的代码能力不仅能提高开发效率,还能产生高质量的软件和解决方案。然而,提升代码能力是一个不断学习和成长的过程。本文将…

人工智能何时会拥有自由意志?

一、自由意志的来源 人类的自由意志是一个复杂而深奥的概念,它涉及到哲学、心理学、神经科学等多个学科领域。目前并没有一个统一且被广泛接受的答案来完全解释自由意志如何形成,但可以从多个角度探讨其可能性和相关理论: 1. **哲学视角**&…

python项目的容器化部署

python项目的容器化部署 参考链接编辑Dockerfile文件构建镜像打包镜像加载镜像创建并启动容器 参考链接 链接1 链接2 编辑Dockerfile文件 下方代码是Dockerfile文件的内容: FROM continuumio/miniconda3 WORKDIR .COPY table_handle/ ./table_handle/COPY requi…

零基础学编程,编程简单学,中文编程工具下载及工具箱进度条构件的用法

一、前言 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 进度条 进度…

注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构等

注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构 #知识点: 1、SQLMAP-常规猜解&字典配置 2、SQLMAP-权限操作&文件命令 3、SQLMAP-Tamper&使用&开发 4、SQLMAP-调试指纹&风险等级 #参考文章: https://w…

【Android】View 与 ViewGroup

View 是 Android 所有控件的基类,我们平常所用的 TextView 和 ImageView 都是继承自 View 的,源码如下: public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {... }public class ImageView extends View {.…

stm32利用CubeMX实现外部中断触发数码管加减数

首先打开proteus绘制电路图,如下: 然后打开CubeMX,配置晶振和GPIO: 接下来就是生成keil工程文件,用keil打开。 新建一个desplay.h文件:下面是全部代码 #ifndef __DESPLAY_H #define __DESPLAY_H #endif#i…

2024全国水科技大会暨土壤和地下水污染防治与修复技术创新论坛(七)

论坛召集人:李 辉 上海大学环境与化学工程学院教授 一、会议背景 十四五”时期,我国生态文明建设进入以减污降碳协同增效为重点战略方向,促进经济社会发展全面绿色转型,实现生态环境质量改善由量变到质变的关键时期。聚焦土壤与地…

Leetcode3039. 进行操作使字符串为空

Every day a Leetcode 题目来源:3039. 进行操作使字符串为空 解法1:哈希 排序 操作的定义:每次操作依次遍历 ‘a’ 到 ‘z’,如果当前字符出现在 s 中,那么删除出现位置最早的该字符(如果存在的话&…

从ViT到MAE,transformer架构改造Autoencoder

Vision Transformer (ViT) 论文出处[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (arxiv.org) 传统的卷积神经网络(CNN)在图像分类、目标检测等任务上表现出色,但其局限性也逐渐显露&#xf…

《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)

文章目录 3.1 编写 Dockerfile3.1.1 重点基础知识3.1.2 重点案例:创建简单 Python 应用的 Docker 镜像3.1.3 拓展案例 1:Dockerfile 优化3.1.4 拓展案例 2:多阶段构建 3.2 构建流程深入解析3.2.1 重点基础知识3.2.2 重点案例:构建…

GO-ICP的使用(一)

一、代码下载以、修改以及使用 下载: 链接:yangjiaolong/Go-ICP: Implementation of the Go-ICP algorithm for globally optimal 3D pointset registration (github.com) 解压之后 : 首先visual studio项目,配置好PCL环境&…

计算机组成原理(13)-----硬件多线程

目录 1.细粒度多线程 2.粗粒度多线程 3.同时多线程(SMT) 在不支持硬件多线程的处理器中,若要进行线程的切换,就需要保存和恢复线程的运行环境(否则会出现数据覆盖引起的错误)。 但在支持硬件多线程的处…

五篇保姆级分类诊断教程,数据特征提取+优化算法+机器学习

今天水一期,总结一下以前写过的几篇保姆级故障诊断。学会这几篇,机器学习的故障诊断你就基本合格了! 本期内容:基于SABO-VMD-CNN-SVM的分类诊断。 依旧是采用经典的西储大学轴承数据。基本流程如下: 首先是以最小包络熵…

Github代码仓库SSH配置流程

作者: Herman Ye Auromix 测试环境: Ubuntu20.04 更新日期: 2024/02/21 注1: Auromix 是一个机器人爱好者开源组织。 注2: 由于笔者水平有限,以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…