使用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 3D立方体效果示例-transform也不过如此
Dec 05 HTML / CSS
CSS3教程(1):什么是CSS3
Apr 02 HTML / CSS
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
Oct 10 HTML / CSS
CSS3过渡transition效果实例介绍
May 03 HTML / CSS
纯CSS3实现扇形动画菜单(简化版)实例源码
Jan 17 HTML / CSS
HTML+CSS3模拟心的跳动实例代码
Sep 05 HTML / CSS
css3 pointer-events 介绍详解
Sep 18 HTML / CSS
CSS3 毛玻璃效果
Aug 14 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
Aug 01 HTML / CSS
html5使用canvas实现跟随光标跳动的火焰效果
Jan 07 HTML / CSS
html5 http的轮询和Websocket原理
Oct 19 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
Aug 05 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学习之PHP运算符
2006/10/09 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
PDO::quote讲解
2019/01/29 PHP
PHP7新功能总结
2019/04/14 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
javascript控制台详解
2015/06/25 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
解决Python一行输出不显示的问题
2018/12/03 Python
python实现的汉诺塔算法示例
2019/10/23 Python
Python使用re模块验证危险字符
2020/05/21 Python
python的launcher用法知识点总结
2020/08/07 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
送货司机岗位职责
2013/12/11 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
给校长的建议书400字
2014/05/15 职场文书
党支部特色活动方案
2014/08/20 职场文书
追悼会答谢词
2015/01/05 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
工商局调档介绍信
2015/10/22 职场文书
python小程序之飘落的银杏
2021/04/17 Python
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
Python中requests库的用法详解
2022/06/05 Python