使用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实现超炫的loading加载动画效果
May 07 HTML / CSS
css3的transition属性详解
Dec 15 HTML / CSS
详解CSS3的perspective属性设置3D变换距离的方法
May 23 HTML / CSS
CSS3 box-sizing属性详解
Nov 15 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
Nov 05 HTML / CSS
详解HTML5 LocalStorage 本地存储
Dec 23 HTML / CSS
使用HTML5的Notification API制作web通知的教程
May 08 HTML / CSS
HTML5标签使用方法详解
Nov 27 HTML / CSS
css3中transform属性实现的4种功能
Aug 07 HTML / CSS
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
Dec 06 HTML / CSS
CSS中实现动画效果-附案例
Feb 28 HTML / CSS
HTML页面中使两个div并排显示的实现
May 15 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 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
2014学雷锋活动心得体会
2014/03/10 职场文书
数学教研活动总结
2014/07/02 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
导游欢送词
2015/01/31 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript