使用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 相关文章推荐
使用CSS实现阅读进度条
Feb 27 HTML / CSS
css实例教程 一款纯css3实现的超炫动画背画特效
Nov 05 HTML / CSS
CSS3实现时间轴效果
Jul 11 HTML / CSS
CSS3实现的渐变幻灯片效果
Dec 07 HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
Sep 12 HTML / CSS
HTML5 Geolocation API的正确使用方法
Dec 04 HTML / CSS
HTML5 中新的全局属性(整理)
Jul 31 HTML / CSS
a标签下载链接的简单实现
Sep 13 HTML / CSS
canvas小画板之平滑曲线的实现
Aug 12 HTML / CSS
CSS代码检查工具stylelint的使用方法详解
Mar 27 HTML / CSS
简单实现一个手持弹幕功能+文字抖动特效
Mar 31 HTML / CSS
HTML中的表单元素介绍
Feb 28 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
smarty section简介与用法分析
2008/10/03 PHP
PHP采集相关教程之一 CURL函数库
2010/02/15 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
PHP实现一维数组转二维数组的方法
2015/02/25 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
javascript 显示当前系统时间代码
2009/12/28 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
js 开发之autocomplete=&quot;off&quot;在chrom中失效的解决办法
2017/09/28 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
python之mock模块基本使用方法详解
2019/06/27 Python
Python连接字符串过程详解
2020/01/06 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
大学生创业计划书的用途
2014/01/08 职场文书
职业生涯规划设计步骤
2014/01/12 职场文书
2014年协会工作总结
2014/11/22 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
看雷锋电影观后感
2015/06/10 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
MYSQL如何查看操作日志详解
2022/05/30 MySQL
spring boot实现文件上传
2022/08/14 Java/Android