使用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中的元素过渡属性transition示例详解
Nov 30 HTML / CSS
CSS3中Animation属性的使用详解
Aug 06 HTML / CSS
利用css3画个同心圆示例代码
Jul 03 HTML / CSS
HTML5里autofocus自动聚焦属性使用介绍
Jun 22 HTML / CSS
简单聊聊H5的pushState与replaceState的用法
Apr 03 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
May 20 HTML / CSS
html5 的a标签 Href 拨电话的写法
Nov 04 HTML / CSS
详解html5 canvas 微信海报分享(个人爬坑)
Jan 12 HTML / CSS
基于MUI框架使用HTML5实现的二维码扫描功能
Mar 01 HTML / CSS
Canvas图片分割效果的实现
Jul 29 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
Sep 16 HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
Jul 21 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实现与ASP Banner组件相似的类
2006/10/09 PHP
php5中类的学习
2008/03/28 PHP
php数组去重复数据示例
2014/02/25 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
python分割列表(list)的方法示例
2017/05/07 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
10款最好的Python开发编辑器
2019/07/03 Python
python用requests实现http请求代码实例
2019/10/31 Python
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
实习单位接收函模板
2014/01/10 职场文书
文科生自我鉴定
2014/02/15 职场文书
高中军训感言400字
2014/02/24 职场文书
企业标语口号
2014/06/10 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
Pandas 稀疏数据结构的实现
2021/07/25 Python
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
Win10 Anaconda安装python-pcl
2022/04/29 Servers