使用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实现大小不一的粒子旋转加载动画
Apr 21 HTML / CSS
CSS3实现多重边框的方法总结
May 31 HTML / CSS
利用CSS3制作简单的3d半透明立方体图片展示
Mar 25 HTML / CSS
css3 transform过渡抖动问题解决
Oct 23 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
Aug 02 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
Aug 08 HTML / CSS
html5 video标签屏蔽右键视频另存为的js代码
Nov 12 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
May 29 HTML / CSS
HTML5进度条特效
Dec 18 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
Jul 18 HTML / CSS
详解HTML5常用的语义化标签
Sep 27 HTML / CSS
浅谈移动端中的视口(viewport)的具体使用
Apr 13 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
重置版游戏视频
2020/04/09 魔兽争霸
文章推荐系统(三)
2006/10/09 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php中final关键字用法分析
2016/12/07 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
PHP children()函数讲解
2019/02/03 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python输入中文的实例方法
2020/09/14 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
进修护士自我鉴定
2013/10/14 职场文书
大学在校生求职信范文
2013/11/21 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
机器人总动员观后感
2015/06/09 职场文书
雷锋的故事观后感
2015/06/10 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
golang json数组拼接的实例
2021/04/28 Golang