使用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 02 HTML / CSS
css3实现的下拉菜单效果示例
Jan 22 HTML / CSS
CSS3实现可关闭的下拉手风琴菜单效果
Aug 31 HTML / CSS
canvas像素画板的实现代码
Nov 21 HTML / CSS
html5中去掉input type date默认样式的方法
Sep 06 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
Feb 06 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
Jan 30 HTML / CSS
HTML5标签使用方法详解
Nov 27 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
Feb 19 HTML / CSS
canvas线条的属性详解
Mar 27 HTML / CSS
HTML5 weui使用笔记
Nov 21 HTML / CSS
html5中嵌入视频自动播放的问题解决
May 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
PHPlet在Windows下的安装
2006/10/09 PHP
使用adodb lite解决问题
2006/12/31 PHP
php HandlerSocket的使用
2011/05/02 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP实现linux命令tail -f
2016/02/22 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
python tornado微信开发入门代码
2018/08/24 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
一份报关员的职业规划范文
2014/01/08 职场文书
校园之声广播稿
2014/01/31 职场文书
暑期教师培训方案
2014/06/07 职场文书
工作会议简报
2015/07/20 职场文书
教师读书活动心得体会
2016/01/14 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android