绘制贝塞尔曲线

贝塞尔曲线于1959年,由法国物理学家与数学家Paul de Casteljau所发明,于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,并用于汽车的车身设计。贝赛尔曲线为计算机矢量图形学奠定了基础,它的主要意义在于无论是直线或曲线都能在数学上予以描述。

贝塞尔曲线分为两种:二次贝塞尔曲线和三次贝塞尔曲线。

quadraticCurveTo()方法绘制二次贝塞尔曲线

二次贝塞尔曲线是一种二次曲线,它只能向一个方向弯曲,由三个点来定义:两个锚点及一个控制点,控制点用来控制曲线的形状。

二次贝塞尔曲线由三个特征切线定义,曲线的第一部分与上下文点和控制点形成的虚线相切,曲线的顶部与midpoint 1和midpoint 2形成的虚线相切,曲线的最后部分与控制点和终点形成的虚线相切。如图 4‑10 所示:

图4-10 二次贝塞尔曲线示意图

在Canvas中,二次贝塞尔曲线的两个锚点分别是上下文点和终点,而起点是已知的。因此只需知道控制点和终点,就能唯一确定一条二次贝塞尔曲线。绘制方法为:

  1. quadraticCurveTo(controlX, controlY, endingPointX, endingPointY)

以下实例使用quadraticCurveTo(cpx,cpy,x,y)方法来绘制一条二次曲线,其中,起点是由上下文维护,控制点为(cpx,cpy),终点为(x,y)。

  1. var cpx = 150, cpy = 50, x = 200, y = 250;
  2. context.lineWidth = 10;
  3. context.beginPath();
  4. context.moveTo(50,250);
  5. context.quadraticCurveTo(cpx,cpy,x,y);
  6. context.stroke();

上述代码的运行结果如图 4‑11 所示:

图4-11 quadraticCurveTo()方法绘制二次贝塞尔曲线

bezierCurveTo()方法绘制三次贝塞尔曲线

由于二次贝塞尔曲线只有一个控制点,所以它永远只能画向一个方向弯曲的弧线,画不出S形曲线。要绘制S形曲线,还需要使用三次贝塞尔曲线。

三次贝塞尔曲线是一种三次曲线,由四个点来定义:两个锚点及两个控制点,两个控制点用来控制曲线的形状。

贝塞尔曲线由5条特征切线定义。曲线的第一部分与从上下文点和第一个控制点形成的虚线相切,曲线的第二部分与midpoint 1和midpoint 3形成的虚线相切,曲线的顶部与midpoint 2和midpoint 4形成的虚线相切,曲线的第四部分与midpoint 3和midpoint 5形成的虚线相切,曲线的最后部分与第二个控制点和终点形成的虚线相切。如图 4‑12 所示:

图4-12 三次贝塞尔曲线示意图

Canvas中的三次贝塞尔曲线由上下文点、两个控制点、一个终点定义。绘制方法为:

  1. bezierCurveTo(controlX1, controlY1, controlX2, controlY2, endPointX, endPointY)

以下实例使用bezierCurveTo(cp1x,cp1y, cp2x,cp2y,x,y)方法来绘制一条二次曲线,其中,起点是由上下文维护,控制点为(cp1x,cp1y)和(cp2x,cp2y),终点为(x,y)。

  1. var cp1x = 200, cp1y = 260, cp2x = 380, cp2y = 10, x = 420, y = 180;
  2. context.lineWidth = 10;
  3. context.beginPath();
  4. context.moveTo(180, 100);
  5. context.bezierCurveTo(cp1x,  cp1y,  cp2x,  cp2y,  x,  y);
  6. context.stroke();

上述代码的运行结果如图 4‑13 所示:

图4-13 bezierCurveTo()方法绘制三次贝塞尔曲线

关于作者

歪脖先生,十五年以上软件开发经验,酷爱Web开发,精通 HTML、CSS、JavaScript、jQuery、JSON、Python、Less、Bootstrap等,著有《HTML宝典》、《揭秘CSS》、《Less简明教程》、《JSON教程》、《Bootstrap2用户指南》,并全部在 GitHub 上开源。

版权声明:本文出自 歪脖网 的《HTML宝典》,欢迎在线阅读,并提出宝贵意见。

HTML5 Canvas中绘制贝塞尔曲线相关推荐

  1. 用html5的canvas画布绘制贝塞尔曲线

    查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  2. 在Silverlight中绘制贝塞尔曲线

    在Silverlight中绘制贝塞尔曲线 我以前的流程设计器使用的都是曲线,而且不能调扭曲,朋友们意见很大,后来我升级了设计器,这里贴出我实现扭曲的思路 代码下载: http://files.cnbl ...

  3. HTML1个像素宽的代码,HTML5 Canvas中绘制一个像素宽的细线实现代码详情

    正统的HTML5 Canvas中如下代码ctx.lineWidth = 1; ctx.beginPath(); ctx.moveTo(10, 100); ctx.lineTo(300,100); ct ...

  4. canvas贝塞尔曲线爱心_Canvas中绘制贝塞尔曲线

    ① 什么是贝塞尔曲线? 在数学的数值分析领域中,贝济埃曲线(英语:Bézier curve,亦作"贝塞尔")是计算机图形学中相当重要的参数曲线.更高维度的广泛化贝济埃曲线就称作贝济 ...

  5. 【绘制】HTML5 Canvas二次方贝塞尔曲线,实现复选框对勾对号,实现圆角三角形,圆角矩形(图文,示例)

    我的处女作<Canvas系列教程>在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作. 教程介绍.教程目录等能在README里查阅. 传送门:https: ...

  6. html5画椭圆的完整代码,HTML5 Canvas中绘制椭圆的4种方法

    概述 HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结.各种方法各有优缺,视情况选用.各方法的参数相同: 1.context为Canvas的2D绘图环境对象, 2.x ...

  7. html如何画出四个圆圈,HTML5 Canvas中绘制椭圆的4种方法

    概述 HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结.各种方法各有优缺,视情况选用.各方法的参数相同: 1.context为Canvas的2D绘图环境对象, 2.x ...

  8. html5绘制矩形动画,HTML5 Canvas中绘制矩形实例

    本文翻译自Steve Fulton & Jeff Fulton HTML5 Canvas, Chapter 2, "The Basic Rectangle Shape". ...

  9. HTML5 Canvas中 绘制圆弧

    绘制圆弧 圆弧被定义为假想的圆周上任意两点之间的部分.Canvas的API提供了两个绘制圆弧的方法:arc()和arcTo()方法. arc()方法 使用arc()方法绘制圆弧时,假想的圆由圆心和半径 ...

最新文章

  1. 【教程】怎么同时同时ping1000个IP地址?
  2. DinamicX 详解:如何让盲人也能在线购物?
  3. nodejs(6)express学习
  4. 使用github时因fatal: remote origin already exists错误,无法提交
  5. shell变量里的字符替换
  6. Mendix:低代码与无代码的异同点与用例
  7. 60-150-040-使用-Sink-Flink自定义UpsertStreamTableSink
  8. sql server management studio 修改计算机名_计算机毕业设计之SpringBoot+ES搜房网
  9. NOI2015 荷马史诗
  10. Linux服务器SMB服务挂载目录
  11. 睡后收益 -- CSDN博客打赏功能及自定义模块以及代码分享
  12. linux英特尔蓝牙驱动,IntelBluetoothFirmware 英特尔蓝牙驱动
  13. office各版本网盘免费下载
  14. 音频知识之OGG格式分析
  15. 重新整理的三国9州,郡,地域数据
  16. 春分时节,迎一场春暖花开
  17. python初级课程-辛舒展-专题视频课程
  18. window设置oracle sid,window下改oracle_sid
  19. Linux学习-02-Linux的安装
  20. 他是阿里顶尖科学家,扛起国产分布式数据库大旗,性能超Oralce 20倍!

热门文章

  1. 方法调用中的别名问题
  2. Firefox(火狐)下载时卡在最后1秒解决办法
  3. asp.net 中RadioButtonList的选项改变事件处理(采用jquery操作)
  4. 发布一个mmap的trie_midrmm02_新浪博客
  5. 用 git 维护 vim 代码
  6. 奔跑吧火柴人c语言开发_小学数学智力题:这两个火柴棍趣味题,你能做出来吗?...
  7. 山东理工oj答案java_众数问题(山东理工OJ)
  8. word文档怎么开启护眼模式_开启手机护眼模式,我们的眼睛真的能免受伤害吗?...
  9. oracle命中率sql,Oracle 检查命中率的SQL
  10. 为什么我的文章总是没人回复