【绘制】HTML5 Canvas 中路径(path)、描边(stroke)与填充(fill)详细介绍(图文、代码示例)

本文主要是介绍【绘制】HTML5 Canvas 中路径(path)、描边(stroke)与填充(fill)详细介绍(图文、代码示例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我的处女作《Canvas系列教程》在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作。

教程介绍、教程目录等能在README里查阅。

传送门:https://github.com/827652549/CanvasStudy

目录

 

引入

案例

介绍

在线演示

效果图

代码

路径

子路径 

填充路径中的“非零环绕规则”

“非零环绕规则”的判断过程


引入

至今为止,我们所绘制的唯一图形,就是通过strokeRect()绘制矩形,也使用fillRect()进行填充。这两个方法都是立即生效的,的。

立即生效的Canvas API中的方法:

  • strokeRect()
  • fillRect()
  • strokeText()
  • fillText()

绘图环境中,可以绘制更为复杂的图形,如贝塞尔曲线等,这些方法都是基于路径(path)的。

大多数绘制系统,如SVG、Apple的Cocoa框架、Adobe illustrator等,都是基于路径的,使用这些绘制系统时,都是先定义一个路径,然后对其描边或填充。图示演示了三种绘制方式(描边、填充、描边和填充)。

案例

介绍

分别用矩形、开放路径、闭合路径演示三种不同的绘制方式。

在线演示

https://827652549.github.io/Canvas/Unit2/PathStrokeFill.html

效果图

闭合路径的代码实现比开放路径多写了一条closePath,用于将此时的路径从当前点回到起点。

代码

https://github.com/827652549/CanvasStudy/blob/master/Unit2/PathStrokeFill.html

路径

CanvasRenderingContext2D之中与路径有关的方法
方法描述
arc(x,y,r,sAngle,eAngle,true)

在当前路径中添加一段表示圆弧或圆形的子路径。五个参数分别是:

x坐标,y坐标,半径,起始角,结束角,(顺/逆时针)

beginPath()清除所有子路径,开始一段新路径
closePath()将当前路径位置连接到起点
fill()使用fillStyle对当前路径内部进行填充
rect(x,y,width,height)创建一个矩形
stroke()使用strokeStyle对当前路径进行描边

路径与隐形墨水

这是一个恰当对比喻,用来说明“创建路径随后对其进行描边或填充”,我们将这个操作比作“使用隐形墨水来绘图”。

你用隐形墨水所控制对内容不会立即显示出来,但你可以调节隐形墨水的颜色,笔尖宽度等等,最后用“特殊的方法(fill或stroke)”将图像显示出来。

子路径 

在某一时刻,canvas之中只能有一条路径存在,Canvas规范将其称为“当前路径(current path)”,这条路径可以包含很多子路径(subpath):有两个或更多的点组成。

为了理解什么是子路径,我们先来看一段代码:

context.beginPath();context.rect(10,10,100,100);
context.stroke();context.beginPath();context.rect(30,30,100,100);
context.stroke();

首先调用一次beginPath()开启一段新路径,该方法会将当前路径中所有子路径都清除掉,然后调用rect()方法,该方法向当前路径中添加了一个含有4个点的子路径,最后调用stroke()方法描边显形。

接下来再次调用了beginPath()方法,清除了上次调用rect()方法所创建的子路径(指那个矩形路径),然后再添加了另一个矩形子路径,最后进行描边显形。

如果我们第二次不调用beginPath()方法,那么此时路径便有两个矩形,那么第二次stroke()时便又会重新绘制一遍第一个矩形。当然,我们也可以同时删除第一个stroke()和第二个beginPath()来达到同样的效果,但为了让你理解,我有意这么做。

个人认为,子路径(subpath)不应该这么翻译,容易与继承关系中的“父子”中的“子”混淆,在Canvas这个应用场景中,被翻译成“补充路径”应该更容易理解。个人愚见,还请多指教。

填充路径中的“非零环绕规则”

如果当路径是循环的,或者包含多个相交的子路径,那fill()就会按照“非零环绕规则(nonzero winding rule)”来判断填充哪些区域。

“非零环绕规则”的判断过程

  1. 对于路径中的任意给定区域,在区域内画一条足够长的线段,使线段终点完全落于路径范围之外。(图中三个箭头表示此过程)
  2. 计数器初始化为0,对于每一条线段来说,每当线段与路径顺时针部分相交时+1,与路径逆时针部分相交时-1。
  3. 如果计数器最终值不是0,则证明在内部,如果是0,则证明在外部。仅填充在内部的区域。

以上图为例

上箭头与逆时针相交,计数器结果-1,填充;

右箭头与两个逆时针相交,结果-2,填充;

左箭头同时与一个顺时针和逆时针路径相交,结果为0,不填充。

这篇关于【绘制】HTML5 Canvas 中路径(path)、描边(stroke)与填充(fill)详细介绍(图文、代码示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/253486

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1