使用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 相关文章推荐
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
Feb 04 HTML / CSS
css3实现顶部社会化分享按钮示例
May 06 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
Apr 05 HTML / CSS
浅谈CSS3 box-sizing 属性 有趣的盒模型
Apr 02 HTML / CSS
html5标记文字_动力节点Java学院整理
Jul 11 HTML / CSS
基于HTML5的WebSocket的实例代码
Aug 15 HTML / CSS
HTML5本地存储之Database Storage应用介绍
Jan 06 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
Mar 25 HTML / CSS
html5启动原生APP总结
Jul 03 HTML / CSS
HTML5 canvas实现的静态循环滚动播放弹幕
Jan 05 HTML / CSS
CSS3点击按钮圆形进度打钩效果的实现代码
Mar 30 HTML / CSS
html解决浏览器记住密码输入框的问题
May 07 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 多维数组排序实现代码
2009/08/05 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
深入探究node之Transform
2017/07/20 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
Python的高阶函数用法实例分析
2019/04/11 Python
Python实现时间序列可视化的方法
2019/08/06 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
四好少年事迹材料
2014/01/12 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
团队拓展活动总结
2014/08/27 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
如何写辞职书
2015/02/26 职场文书
校车司机安全责任书
2015/05/11 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android