背景

最近设计师控制不住自己的洪荒之力,设计图搞得高端大气上档次,各种曲线满天飞。为了更好地实现页面效果,经常需要绘制形如下图的贝塞尔曲线:

一般实现这种效果有两种思路:SVG和Canvas。直接使用Canvas去画贝塞尔曲线比较繁琐,故在开发中使用了ZRender.js这款Canvas库。


ZRender简介

ZRender是EChart的底层库,功能十分强大,可以很方便地在Canvas中绘制各种图形。

截止今日(2017-11-16),ZRender的最新版本为3.7.x,而直接在必应上面搜索ZRender搜出来的官网和文档都是几年前的比较老旧的、基于2.x版本资料,但是最新版的3.7.x的API与2.x版本的相比有很多API和使用方法都发生了较大的改变,因此应直接查看新版资料:

github:https://github.com/ecomfe/zrender
文档地址:https://ecomfe.github.io/zrender-doc/public/


贝塞尔曲线的绘制

回过头来看曲线。上面图中的这种曲线有个明显特点就是曲线的起点终点处的切线方向都是水平方向的。绘制这种曲线需要2个控制点。一般地,对于起点坐标为(x1, y1),终点坐标为(x2, y2)的这类曲线,其两个控制点的坐标分别为:

((x1 + x2) / 2, y1)( (x1 + x2) / 2, y2)

知道了这个公式,接下来就可以用ZRender画图了。

首先,访问上文中提到的文档地址,按照里面说明即可下载到ZRender库,并引入到页面里。接下来的代码主要有三步:

  1. 创建一个ZRender实例:
    var zr = zrender.init(document.getElementById('box'))

  2. 本例中以画布的两个对角线为起止点,创建一个贝塞尔曲线实例。
    其中,shape用以配置贝塞尔曲线的起止点坐标和控制点坐标,x1,y1是起始点坐标,x2,y2是结束点坐标,cpx1,cpy1是第一个控制点的坐标,cpx2,cpy2是第二个控制点的坐标。
    style用以配置绘图相关的选项,如stroke是画线的颜色,lineWidth是线的宽度。

var h = zr.getHeight(),w = zr.getWidth(),line = new zrender.BezierCurve({shape: {x1: 0,y1: h,cpx1: w / 2,cpy1: h,cpx2: w / 2,cpy2: 0,x2: w,y2: 0},style: {stroke: 'green',lineWidth: 2}
});

3 . 将贝塞尔曲线添加到画布中。
zr.add(line);

至此, 贝塞尔曲线绘制完毕。

附完整代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><div id="box" style="height:400px;width:600px;border:1px solid black;"></div><script src="./zrender.min.js"></script><script>var zr = zrender.init(document.getElementById('box')),h = zr.getHeight(),w = zr.getWidth(),line = new zrender.BezierCurve({shape: {x1: 0,y1: h,cpx1: w / 2,cpy1: h,cpx2: w / 2,cpy2: 0,x2: w,y2: 0},style: {stroke: 'green',lineWidth: 2}});zr.add(line);</script>
</body>
</html>

使用ZRender画贝塞尔曲线相关推荐

  1. C语言画贝塞尔曲线的函数

    程序截图 简单说明 这个函数就是 void drawBezierCurve(COLORREF color, const unsigned int len, ...) color 是贝塞尔曲线的颜色,l ...

  2. ios 画线平滑_iOS 画贝塞尔曲线 连续曲线 平滑曲线 曲线图表

    利用贝塞尔曲线画一段连续曲线 bezierDemo2.png bezierDemo1.png image.png 如果我们根据几个点画一条连续的曲线, 我们使用的方法是 - (void)addCurv ...

  3. python如何画贝塞尔曲线_初识贝塞尔曲线

    贝塞尔曲线在CSS动画中和canvas.svg绘图中都是比较重要的一个东西!所以我来好好的小结一下关于它的一些东西. 什么是贝塞尔曲线 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔(Pierre ...

  4. VBA,Shapes.AddCurve SafeArrayOfPoints:=pts  画贝塞尔曲线

    1  Shapes.AddCurve SafeArrayOfPoints:=pts   贝塞尔曲线 https://docs.microsoft.com/zh-cn/office/vba/api/ex ...

  5. python如何画贝塞尔曲线_Python使用matplotlib实现绘制自定义图形功能示例

    本文实例讲述了Python使用matplotlib实现绘制自定义图形功能.分享给大家供大家参考,具体如下: 一 代码 from matplotlib.path importPath from matp ...

  6. Unity画贝塞尔曲线自定义图片组件

    头一回写这个文章,也是就分享一点自己的学习心得,并且记录下自己做过的这个功能. 事实上我这也是借鉴了大佬的代码,统筹琢磨出来的,比较初级,但是有用. 话不多说,上效果图: 如图所见,展现出来的功能组件 ...

  7. IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)...

    本文转载自:http://blog.csdn.net/rhljiayou/article/details/9919713 首先了解一下CGContextRef: An opaque type that ...

  8. IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)

    本文转载自:http://blog.csdn.net/rhljiayou/article/details/9919713 首先了解一下CGContextRef: An opaque type that ...

  9. cic曲线是什么_贝塞尔曲线基本用法

    使用UIBezierPath可以创建基于矢量的路径,此类是Core Graphics框架关于路径的封装.使用此类可以定义简单的形状,如椭圆.矩形或者有多个直线和曲线段组成的形状等. UIBezierP ...

最新文章

  1. linux grub2 等待时间修改
  2. 在2003 server上部署DNS服务器
  3. playbook编写分布式lnmp
  4. linux查文件的前几行,Linux--查询文件的第几行到第几行命令
  5. 如何防止插入删除表造成的数据库死锁
  6. php 0-1,PHP 动态解决0-1背包问题
  7. Linux 命令之 ln -- 为文件创建链接
  8. from表单iframe原网页嵌入
  9. docker 镜像 增删改查
  10. ROS2——南溪的ROS2使用手册
  11. 为什么不能在lock语句的主体内使用#39;await#39;运算符?
  12. 微程序相关的两个知识点
  13. Yii 2.0 权威指南(3) 使用数据库
  14. com.google.zxing 二维码生成与解析
  15. 信号与系统公式笔记(8)——拉普拉斯变换
  16. Windows-Server-2012-如何实现多个用户远程桌面登陆
  17. 关于Three.js 加载地面贴图的坑
  18. http://www.cnblogs.com/dolphin0520/p/3923167.html
  19. design contains shelved or modified (but not repoured) polygons. the result....继续铺铜还是报警,解决方案如下:
  20. 计算机d盘hlddz是啥,tempest_qqgametempestj是会么文件,可以删除么

热门文章

  1. 如何快速对接快递模块之电商平台
  2. 卡耐基梅隆大学计算机工程录取率,卡内基梅隆大学2020新生数据,计算机学院录取率堪比藤校!...
  3. 产品上新需要注意什么 总结的思维导图分享给大家
  4. 矿物追踪mod_技术处于危险之中,我们可以依靠矿物原料多长时间
  5. 嵌入式软件工程师技术等级
  6. add_metrology_object_line_measure 抓线(无对齐测量模型)
  7. java实现OpenCV 4.1.0人脸相似度对比
  8. Day_04 Vue学习
  9. 小区物业信息管理系统c语言,小区信息管理系统.doc
  10. 如何配置XenDesktop使用Mirror数据库