使用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中的border-radius属性
Aug 18 HTML / CSS
CSS3过渡transition效果实例介绍
May 03 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
May 28 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
Oct 23 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
Jun 21 HTML / CSS
html5适合移动应用开发的12大特性
Mar 19 HTML / CSS
分享全球十款超强HTML5开发工具
May 14 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
Dec 14 HTML / CSS
移动端Html5中百度地图的点击事件
Jan 31 HTML / CSS
原生 JS+CSS+HTML 实现时序图的方法
Jul 31 HTML / CSS
浅谈由position属性引申的css进阶讨论
May 25 HTML / CSS
html5+实现plus.io进行拍照和图片等获取
Jun 01 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
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
php简单实现数组分页的方法
2016/04/30 PHP
php原生导出excel文件的两种方法(推荐)
2016/11/19 PHP
JavaScript 继承的实现
2009/07/09 Javascript
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
解决Jquery load()加载GB2312页面时出现乱码的两种方案
2013/09/10 Javascript
javascript读写json示例
2014/04/11 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
python共享引用(多个变量引用)示例代码
2013/12/04 Python
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
Python中常用信号signal类型实例
2018/01/25 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
tensorflow 模型权重导出实例
2020/01/24 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
html5 worker 实例(二) 图片变换效果
2013/06/24 HTML / CSS
静态成员和非静态成员的区别
2012/05/12 面试题
教师的实习鉴定
2013/12/15 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers