使用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,js)
Dec 12 HTML / CSS
CSS3教程(9):设置RGB颜色
Apr 02 HTML / CSS
CSS3属性box-shadow使用详细教程
Jan 21 HTML / CSS
CSS3实现时间轴效果
Jul 11 HTML / CSS
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
Nov 16 HTML / CSS
详解如何在css中引入自定义字体(font-face)
May 17 HTML / CSS
纯css3实现思维导图样式示例
Nov 01 HTML / CSS
HTML5中5个简单实用的API
Apr 28 HTML / CSS
浅谈关于html5中图片抛物线运动的一些心得
Jan 09 HTML / CSS
AmazeUI 模态窗口的实现代码
Aug 18 HTML / CSS
CSS完成视差滚动效果
Apr 27 HTML / CSS
CSS中理解层叠性及权重如何分配
Dec 24 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 发送带附件邮件示例
2014/01/23 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
php实现删除空目录的方法
2015/03/16 PHP
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
js返回上一页并刷新代码整理
2012/12/21 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
jQuery手风琴的简单制作
2017/05/12 jQuery
webpack多页面开发实践
2017/12/18 Javascript
详解Django框架中用context来解析模板的方法
2015/07/20 Python
python实现决策树分类算法
2017/12/21 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
在python里从协程返回一个值的示例
2019/02/19 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
大学生专业个人学习的自我评价
2013/10/26 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
倡议书范文大全
2015/04/28 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
导游词之广西漓江
2019/11/02 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
js 实现验证码输入框示例详解
2022/09/23 Javascript