【ZRender 渲染引擎 - 壹】 | 基础图形元素绘制

article/2025/9/21 5:01:21

theme: cyanosis

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 7 天,点击查看活动详情


开篇前言

在掘金认识我的都知道,我主要是研究 Flutter 的。其实我一直希望开发出一套好用的 Flutter 的图表库,但是期间遇到了一些瓶颈。当我偶然知道 echarts 底层是由 ZRender 引擎渲染时,内心是非常激动的。无论是简单的统计图,还是复杂的雷达图、地图、关系图,本质上都是通过 ZRender 引擎渲染绘制的。

image.png

ZRender 封装了前端 canvas 的绘制逻辑,通过上层的接口去操作底层的绘制功能。从而屏蔽不同环境的差异性,提供统一的访问方式,并提供更高级的图形元素的绘制功能,方便使用者的调度,这都是封装的特点。

image.png

所以我悟了,相比于 图表库 这种复杂上层建筑,在起步阶段时,一个好的引擎作为底层基础是必不可少的。想打造一个像 echarts 这样几乎完美的图表库,在短时间内是不可能凭空实现的。所以准备研究一下 ZRender ,体会一下其中的设计思想、结构思路和逻辑实现,先打造一个符合 Flutter 框架的二维绘图引擎库 render2d。这点对于绘制小能手的我感觉还是有些希望的。

所以本系列文章将作为对前端的 ZRender 引擎研究的探索记录。我对 web 前端的知识并不是非常精通,但对于前端的 Canvas 绘制还是略知一二的,借此可能还会巩固一些小前端的知识。


1. ZRender 和基础图形元素介绍

Flutter 中对于绘制封装了 CanvasPaintPathMatrix4 等类型,并且有自身的 Animation 动画机制。 相比而言,Html 的绘制显得更加原始一些,面向过程的味道更浓,这也是封装一个绘制引擎的必要性。 ZRender 的封装感觉要比 Flutter 绘制系统要高一层级,它封装了很多基础设施,让绘制对于使用者而言更加简易。所以有必要学习一下,它山之石可以攻玉。

ZRender 是一个开源项目,地址在 【ecomfe/zrender】,可以将其 clone 到本地,方便查看源码。

image.png


对于绘制的封装而言,基础图形元素是必不可少的,以后简称为 图元 。他们被定义在 graphic 文件夹中,其中 Displayable 是图元比较顶层的抽象。在 shape 文件夹中定义了一些基础图形,它们是 echarts 图表展示的基础。

image.png

所以在刚接触 ZRender 时,了解这些图元的使用是一个比较好的切入点。本文先从一些简单的图形元素绘制进行体验,了解 ZRender 的基本使用。

image.png


2. ZRender 的使用

作为一个 js 的库,引入的方式大同小异。这里先通过最原始的方式体验一下 zrender, 先不通过前端框架集成。在下载的源码后,在 dist 文件夹中可以得到库文件:

image.png

对于简单的集成体验,使用 script 标签引入库即可:

image.png


对于图元的绘制测试,将使用如下的展示方式:在 100*100的虚线框内部是绘制内容,框下是标题信息。所以先来准备一些结构和样式。如下所示,这些非常基础,就不介绍了:

image.png

css ---->[css 样式]---- <style> .wrapper { display: flex; flex-direction: column; align-items: center; } .box { width: 100px; height: 100px; border: 2px dashed; } .leabel { margin-top: 5px; font-size: 14px; font-weight: bold; color: gray; } </style> 布局结构上是通过 flex 布局维护的上下结构:

```html ---->[html 结构]----

折线: Polyline

```

script 标签下书写 js 脚本, 使用方式也比较简单。通过 zrender.init 来关联 dom 节点进行初始化,获取渲染对象。如何创建绘制对象,添加到渲染对象中即可。如下是折线 Polyline 的的绘制效果,可以看出 ZRender 默认的坐标系是以 dom 节点 左上角为原点,向左和下方为正方向的直角坐标系,这也是屏幕渲染中最常用的坐标系:

image.png

Polyline 通过 shape.points 属性提供点数组,将点依次连接进行显示:

``` ---->[js 脚本]----

```


3.直线、矩形、圆形的绘制

这三个图形,是基础中的基础,在 ZRender 中分别通过 LineRectCircle 绘制。由于基本流程是相同的,下面的绘制体验中,只贴出核心的图元对象创建的代码:

image.png

直线通过 shape 属性的 x1y1x2y2 指定两个坐标,进行连线:

const line = new zrender.Line({ shape: { x1: 0, y1: 0, x2: 100, y2: 100, }, style: stokeStyle })


矩形 Rect : 通过左上角坐标 (x,y) 和宽高 widthheight 确定形状,另外可以使用 shape.r 属性指定四周圆角:

image.png

``` const rect = new zrender.Rect({ shape: { x: 10, y: 10, width: 80, height: 80, }, style: stokeStyle })

const rrect = new zrender.Rect({ shape: { x: 25, y: 25, r: [5,10,5,10], width: 50, height: 50, }, style: stokeStyle }) ```


圆形 Circle : 通过圆心坐标 (cx,cy) 和半径 rheight 确定形状:

image.png

const circle = new zrender.Circle({ shape: { cx: 50, cy: 50, r: 50, }, style: stokeStyle })


4. 圆弧、椭圆、贝塞尔曲线

下面来看一组曲线:圆弧、椭圆、贝塞尔曲线分别由 ArcEllipseBezierCurve 绘制。圆弧就是圆上的一段弧线,通过指定 startAngleendAngle 截取:

image.png

const arc = new zrender.Arc({ shape: { cx: 50, cy: 50, r: 40, startAngle: 0, endAngle: 135 * Math.PI / 180, }, style: stokeStyle })


椭圆 Ellipse 通过中心点 (cx,cy) 和横纵半轴长 rxry 确定:

image.png

const ellipse = new zrender.Ellipse({ shape: { cx: 50, cy: 50, rx: 50, ry: 30, }, style: stokeStyle })


贝塞尔曲线 BezierCurve在绘制界可谓老生常谈的知识了。这里的 BezierCurve 可以绘制二次和三次贝塞尔曲线。如下是一段二次贝塞尔曲线:参数包括 起点 (x1,x2)控制点1 (cpx1,cpy1)终点 (x2,y2)

image.png

const bezierCurve2 = new zrender.BezierCurve({ shape: { x1: 30, y1: 20, cpx1: 70, cpy1: 10, x2: 80, y2: 40, }, style: stokeStyle })


另外,如果指定 控制点2 (cpx2,cpy2) 就会绘制三次贝塞尔曲线:

image.png

const bezierCurve3 = new zrender.BezierCurve({ shape: { x1: 30, y1: 20, cpx1: 50, cpy1: 10, cpx2: 80, cpy2: 20, x2: 80, y2: 40, }, style: stokeStyle })

关于贝塞尔曲线,在 《【Flutter 绘制番外】svg 终篇 - 路径指令》 一文中有所介绍,结合其中的图来看更好理解一些:

image.png


5. 文字、图片的简单绘制

另外,绘制过程中还有文字和图片这两个非常重要的部分,通过 TextImage 绘制。 文字的样式非常多,属性在 style 中配置,基本上和 css 的属性是类似的,这里先简单体验一下:

image.png

const text = new zrender.Text({ style: { text : 'ZRender', fontSize: 20, x:10, y:40 } })


图片通过 Image 进行展示,属性也在 style 中配置:

image.png

const text = new zrender.Image({ style: { image : '../assets/icon_head.webp', x:10, y:10, with:80, height:80, } })


这上面的 9 种是最基础的图形元素,这里只是简单的绘制体验,在 zrender 官网文档 中有对各种图形的详细属性介绍,感兴趣的可以自己参阅。下一篇,将介绍一下其他的不太常用的图元,并基于 Vue 框架来整合这些绘制样例。那本文就到这里,谢谢观看 ~

  • @张风捷特烈 2022.10.21 未允禁转
  • 我的 公众号: 编程之王
  • 我的 github 主页 :  toly1994328

http://chatgpt.dhexx.cn/article/r9TykIkC.shtml

相关文章

zrender学习

这个是项目总结&#xff0c;不适合学习 <div id"canvas" style"background-image:url(./canvasbg.gif)"></div> 定义zrender初始化对象&#xff0c;背景是一个gif图 样式如下 ↓ 工程里&#xff0c; topo.html <div id "containe…

zrender源码学习笔记(一):认识zrender

本文内容 入门zrender绘制原理 入门zrender zrender是Echarts底层的2D绘图引擎&#xff0c;在搞懂其原理之前&#xff0c;我们先学会如何使用zrender&#xff0c;我们从绘制一个简单圆形入门。这里也给出官网入门教程 初始化 zrender.init(dom)初始化zrender实例&#xff0c…

zrender 知识:使用zrender搭建流程图工具

首先看下最终的效果图&#xff1a; 主要使用的技术是zrender.js和vue.js&#xff0c;zrender 用于实现流程图&#xff0c;vue搭建整体架构。 本篇文章主要面向对zrender有一定了解的同学。 本篇文章只讲解核心flowchart的实现方法。 一.分析 流程图主要包含节点node、联系e…

zrender基础入门,简单的案例图形绘制

一、简单介绍 ZRender是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender也是ECharts的渲染器。 流程图&#xff1a; 二、使用入口 (1)npm install zrender&#xff0c;因为zrender不是浏览器自带不同于前面的canvas与svg&#xff0c;需要先下载 …

二维绘图引擎ZRender

1、开始使用 描述 ZRender是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器。 下载 ZRender 项目在 gitHub ,也可以使用 npm install zrender 下载。 在 dist 目录下找到 zrender.js 和 zrender.min.js&#xff0c;前者是开发…

MATLAB中求矩阵的特征值和特征向量

矩阵特征值的数学定义 设A是n阶方阵&#xff0c;如果存在常数λ和n维非零列向量x&#xff0c;使得等式Axλ x成立&#xff0c;则称λ为A的特征值&#xff0c;x是对应特征值λ的特征向量。 求特征值和特征向量&#xff1a; eig(A)&#xff1a;求矩阵A的全部特征值&#xff0c…

简单易懂的特征值与特征向量

特征值与特征向量是线性代数中一个很基础的知识&#xff0c;但是很多人对这两个概念没有一个直观的概念&#xff0c;从直觉上&#xff0c;很难理解这两个东西&#xff0c;只知道公式&#xff0c;但是不知道它代表的意义。当年上现代课的时候&#xff0c;老师根本不会去讲这些东…

特征值和特征向量的几何意义

1. 特征值和特征向量 我们首先回顾下特征值和特征向量的定义如下&#xff1a; A x λ x Ax\lambda x Axλx 其中A是一个 n n n\times n nn的实对称矩阵&#xff0c; x x x是一个n维向量&#xff0c;则我们说 λ \lambda λ是矩阵A的一个特征值&#xff0c;而 x x x是矩阵A的…

特征值和特征向量的通俗解释

我们知道&#xff0c;特征向量的公式是 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 其中A代表矩阵&#xff0c;x代表特征向量&#xff0c;代表特征值。 众所周知&#xff0c;特…

对特征值和特征向量的理解

Agenda 1. 特征值和特征向量1.1 特征值和特征向量的通俗解释1.2 如何计算矩阵的特征值和特征向量1.3 特征多项式1.4 特征值和特征向量的性质 1. 特征值和特征向量 在讨论特征值和特征向量之前&#xff0c;必须声明的是现在我们关注的是有限维 线性空间上的线性变换。这里两个关…

线性代数(五)特征值和特征向量

文章目录 一&#xff1a;特征值与特征向量二&#xff1a;特征方程2.1行列式求解的另一种方法--初等变换2.2可逆矩阵定理以及行列式性质的补充2.3特征方程/特征多项式2.4相似性 三&#xff1a;对角化3.1从例子出发3.2定理3.3例子 一&#xff1a;特征值与特征向量 1.定义&#x…

特征值和特征向量(三)

特征值和特征向量&#xff08;三&#xff09; 一、先看一下教科书上的定义&#xff1a;设A是n阶方阵&#xff0c;如果存在常数及非零n向量x&#xff0c;使得&#xff0c;则称是矩阵A的特征值&#xff0c;x是A属于特征值的特征向量。给定n阶矩阵A&#xff0c;行列式 的结果是关…

网页游戏脱机脚本制作视频教程

网页游戏脱机脚本制作视频教程 百度网盘 布脖练馅辰杖怖铱试疤促钩咏合躺酱澈纸罢旨谖谘帘婪尾拾碧鸥居丶骨碳捍饰炔幌干衫乖商衣临衣氛捍运阂妊痰煤籽媒移惶心谑源谑丫松橙湛叭坪佳蛊八婪毒鄙刮碧悠凳炔捍灰钩贺篮媒梅敝粱寡油倨制柿囊谐举婪贫婪奖堂虏啄腊谘剿镜感诺衣挥堂猎…

python可以制作游戏脚本吗_用Python写一个游戏脚本,你会吗?

学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手。如果你也想多练项目实战。可以去小编的Python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目 听说pywin32写脚本还不错 pyw…

逆水寒商业脚本制作视频

​一章 易语言基础 共6课时 1、关于易语言必须了解的基本知识 2、易语言基本组件(不包括超级列表框)讲解 3、易语言超级列表框详解 3、易语言核心支持库讲解之一 4、易语言核心支持库讲解之二 5、易语言模块制作和DLL制作 6、用制作的模块和DLL开发三个小软件 第二章…

Java开发游戏脚本(第三卷)

游戏脚本开发第三卷 XML文件存储数据使用exe4j打包成exe文件回首BUG最后结语 XML文件存储数据 我举个例子&#xff0c;我的窗口数据需要存储到文件&#xff0c;它的结构为: public class Game {// Game类的成员变量private String Title;private int X;private int Y;private…

乐玩模块脚本实战教程辅助脚本制作开发视频

乐玩插件模块的制作&#xff0c;封装了后台绑定判断&#xff0c;键鼠图色窗口文本输入等游戏辅助常用的方法&#xff0c;每种方法都做了游戏调用测试示范&#xff0c;最后录制了四种多线程方法调用乐玩插件&#xff0c;并通过游戏进行了演示。 学习地址&#xff1a;链接&#x…

游戏多开器制作教程

这里讲解怎么制作多开器&#xff0c;简单易懂的讲解&#xff0c;希望能够记录学习过程。 用易语言来制作自己的小工具&#xff0c;还是挺有成就感的。每个人都可以。 1.常见的几种游戏多开限制-简单说明 2.什么是互斥体 3.互斥体的类型与查找 4.编写多开代码实现游戏多开

C++游戏编程教程(一)

参考书籍&#xff1a;《C游戏编程&#xff1a;创建3D游戏》 注&#xff1a;本教程所有代码的开发环境均为Visual Studio Preview 2022&#xff0c;C标准是C20。 一、初识SDL SDL是一个跨平台的开源多媒体库&#xff0c;被广泛应用于游戏开发&#xff0c;具体可以看这里。另外…

html5分镜头脚本范例,分镜头脚本教程图解

这是一份pdf免费高清彩版的分镜头脚本设计教程&#xff0c;全书彩页&#xff0c;排版非常不错&#xff0c;阅读起来充满趣味性&#xff0c;另外&#xff0c;书中有不少分镜头脚本范例以及分镜头脚本教程图解&#xff0c;是一本值得一看的好书。全书详细讲解了分镜头是如何制作的…