使用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 倾斜的网页图片库实例教程
Nov 14 HTML / CSS
纯HTML+CSS3制作导航菜单(附源码)
Apr 24 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
Oct 16 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
Oct 20 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
Feb 24 HTML / CSS
HTML5中的强制下载属性download使用实例解析
May 12 HTML / CSS
使用HTML5里的classList操作CSS类
Jun 28 HTML / CSS
HTML5 实现图片上传预处理功能
Feb 06 HTML / CSS
HTML5开发动态音频图的实现
Jul 02 HTML / CSS
AmazeUI 网格的实现示例
Aug 13 HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
Jun 21 HTML / CSS
如何使用 resize 实现图片切换预览功能
Aug 23 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
php adodb连接mssql解决乱码问题
2009/06/12 PHP
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
PHP图片加水印实现方法
2016/05/06 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
用javascript获取textarea中的光标位置
2008/05/06 Javascript
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
植物选择:Botanic Choice
2017/02/15 全球购物
京东国际站:JOYBUY
2017/11/23 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
高二地理教学反思
2014/01/24 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
党员个人公开承诺书
2014/08/29 职场文书
个人贷款收入证明
2014/10/26 职场文书
工作自我推荐信范文
2015/03/25 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书