使用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实现的竖形二级导航的实例教程
Dec 11 HTML / CSS
CSS3的一个简单导航栏实现
Aug 03 HTML / CSS
HTML5 File接口在web页面上使用文件下载
Feb 27 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
May 28 HTML / CSS
html5与css3小应用
Apr 03 HTML / CSS
HTML5 history新特性pushState、replaceState及两者的区别
Dec 26 HTML / CSS
html5 实现客户端验证上传文件的大小(简单实例)
May 15 HTML / CSS
html5使用canvas压缩图片的示例代码
Sep 11 HTML / CSS
浅谈HTML5新增和废弃的标签
Apr 28 HTML / CSS
Html5嵌入钉钉的实现示例
Jun 04 HTML / CSS
HTML基础详解(下)
Oct 16 HTML / CSS
CSS SandBox应用场景及常见问题
Jun 25 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 trim 去除空字符的定义与语法介绍
2010/05/31 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
Python的面向对象思想分析
2015/01/14 Python
Python写的英文字符大小写转换代码示例
2015/03/06 Python
python 队列详解及实例代码
2016/10/18 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
python 实现绘制整齐的表格
2019/11/18 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
使用Pycharm分段执行代码
2020/04/15 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python是怎样处理json模块的
2020/07/16 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
自荐信的格式
2014/03/10 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
和睦家庭事迹
2014/05/14 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
长城导游词300字
2015/01/30 职场文书
财务经理岗位职责
2015/01/31 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书