【绘制】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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n