使用HTML5的Canvas绘制曲线的简单方法


Posted in HTML / CSS onSeptember 08, 2015

Canvas2D自带的曲线方法

最近在研究3D柔体的计算,所以在狂补一些知识。经常会涉及到一些数值分析方面的东西,主要是曲线的各种插值算法。突然想起了Canvas2D本身也是可以绘制曲线的,使用的是二次和三次的贝兹曲线。其实我也一直没用它的过这个方法,现在就来试试吧~

这篇只是说说简单的曲线绘制,咱就不说一大堆复杂的原理了。况且贝兹曲线这东西的原理本身很简单,看看维基百科就能明白。其实很多绘图工具中的简单曲线绘制都是使用贝兹曲线的,如果你用过windows自带绘图工具中的曲线就一定不陌生。可以先拖出一条直线,然后点击某个位置让直线扭曲。一开始的拖动动作就是决定曲线的两个顶点,点击动作就是添加中间点。在windows自带的绘图工具使用的是三次贝兹曲线,你可以添加两个中间点。贝兹曲线和一般的多项式插值不同,它的中间点只是作为控制点用的,并不是曲线必须经过的顶点。而且它还可以做出闭曲线。Canvas2D中有提供两个绘制曲线的方法

quadraticCurveTo:二次贝兹曲线

bezierCurveTo:三次贝兹曲线

线条是从当前所在位置开始画的,可以用moveTo方法来指定当前位置。有了曲线的开始位置后,还需要中间点和结束位置。把这些位置坐标传给绘制函数即可。比如二次贝兹曲线需要一个中间点和一个结束位置,所以要传两个坐标给quadraticCurveTo函数。坐标是由x和y组成的,也就是说这个函数有4个参数。bezierCurveTo也是一样的,只是它有两个中间点而已。下面咱就来用用看

CSS Code复制内容到剪贴板
  1. <canvas id="canvas" width="200" height="200"></canvas>   
  2. <script>   
  3. var g=canvas.getContext("2d");   
  4. //普通的直线   
  5. g.beginPath();   
  6. g.strokeStyle="#CCC";   
  7. g.moveTo(0,0);   
  8. g.lineTo(200,0);   
  9. g.lineTo(0,200);   
  10. g.lineTo(200,200);   
  11. g.stroke();   
  12. //贝兹曲线   
  13. g.beginPath();   
  14. g.strokeStyle="#F00";   
  15. g.moveTo(0,0);   
  16. g.bezierCurveTo(200,0, 0,200, 200,200);   
  17. g.stroke();   
  18. </script>  

使用HTML5的Canvas绘制曲线的简单方法
这个按照Z字形的轨迹给定四个点,画出了普通的直线和贝兹曲线。这只是普通的曲线而已,贝兹曲线的厉害之处是它可以画出闭曲线,比如这样一段代码

CSS Code复制内容到剪贴板
  1. g.beginPath();   
  2. g.strokeStyle="#00F";   
  3. g.moveTo(100,0);   
  4. g.bezierCurveTo(-100,200, 300,200, 100,0);   
  5. g.stroke();  

使用HTML5的Canvas绘制曲线的简单方法

把三次贝兹曲线的开始位置和结束位置设置到同一点上就可以画出闭曲线。因为贝兹曲线的插值方向不是按照坐标轴走的,所以可以绘制出闭曲线。如果想让多项式插值绘制出闭曲线我们就得转换参数,使用极坐标系来完成。

我使用的例子都是三次贝兹曲线。其实二次的也一样,只是少了个中间点就画不出我想要的东西了。我就不再??乱淮蠖蚜耍?馄?驼庋?? =。。

HTML / CSS 相关文章推荐
CSS3教程(7):CSS3嵌入字体
Apr 02 HTML / CSS
CSS3教程(1):什么是CSS3
Apr 02 HTML / CSS
CSS3网格的三个新特性详解
Apr 04 HTML / CSS
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
Jul 21 HTML / CSS
css3弹性盒子flex实现三栏布局的实现
Nov 12 HTML / CSS
详解CSS3:overflow属性
Nov 17 HTML / CSS
HTML5 本地存储实现购物车功能
Sep 07 HTML / CSS
鲜为人知的HTML5语音合成功能
May 17 HTML / CSS
html5画布旋转效果示例
Jan 27 HTML / CSS
纯HTML5+CSS3制作生日蛋糕(代码易懂)
Nov 16 HTML / CSS
用canvas显示验证码的实现
Apr 10 HTML / CSS
CSS的calc函数用法小结
Jun 25 HTML / CSS
详解HTML5中ol标签的用法
Sep 08 #HTML / CSS
深入解析HTML5中的Blob对象的使用
Sep 08 #HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
Sep 02 #HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
Aug 31 #HTML / CSS
详解HTML5中的元素与元素
Aug 17 #HTML / CSS
详解HTML5中download属性的应用
Aug 06 #HTML / CSS
详解HTML5中div和section以及article的区别
Jul 14 #HTML / CSS
You might like
业余方法DIY电子管FM收音机
2021/03/02 无线电
基于MySQL体系结构的分析
2013/05/02 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
php按单词截取字符串的方法
2015/04/07 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
从0搭建vue-cli4脚手架
2020/06/17 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
python入门教程 python入门神图一张
2018/03/05 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
服务生自我鉴定
2014/01/22 职场文书
小学生表扬稿范文
2015/05/05 职场文书
经营场所使用证明
2015/06/19 职场文书