使用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实现精美横向滚动菜单按钮
Apr 14 HTML / CSS
利用CSS3的定位页面元素
Aug 29 HTML / CSS
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
Aug 25 HTML / CSS
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
Sep 10 HTML / CSS
CSS3实现线性渐变用法示例代码详解
Aug 07 HTML / CSS
CSS3 文字动画效果
Nov 12 HTML / CSS
video结合canvas实现视频在线截图功能
Jun 25 HTML / CSS
HTML5重塑Web世界它将如何改变互联网
Dec 17 HTML / CSS
html5中的一些标签学习(心得)
Oct 18 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
Mar 21 HTML / CSS
前端实现背景虚化但内容清晰且自适应 的实例代码
Aug 01 HTML / CSS
常用的文件对应的MIME类型汇总
Apr 26 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倒计时出现-0情况的解决方法
2016/07/28 PHP
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
js控制frameSet示例
2013/09/10 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
Python 开发Activex组件方法
2009/11/08 Python
RC4文件加密的python实现方法
2015/06/30 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
python opencv摄像头的简单应用
2019/06/06 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
利用python画出AUC曲线的实例
2020/02/28 Python
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
初中学校对照检查材料
2014/08/19 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
中学音乐课教学反思
2016/02/18 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis