HTML5 Canvas 绘制椭圆与椭圆弧的实现
2016-06-01 19:00
288 查看
由于HTML Canvas 2D Context标准中并没有直接绘制椭圆与椭圆弧的方法,所以浏览器普遍没有这个方法,不过,Chrome支持ellipse方法,至于从哪个版本开始支持的,我就未查证了。IE11,Edge,
Firefox, Safari目前最新版都还不支持。。。
所以,我们需要用JS来实现这个方法。原理就是用已经支持的其它方法来模拟ellipse方法,可以用lineTo, quadraticCurveTo, bezierCurveTo, arcTo, arc等方法来实现。
用lineTo来模拟的话,就是参数方程的形式,计算出椭圆上的点的坐标,逐点用lineTo绘制模拟椭圆。简单粗暴有效。
用quadraticCurveTo, bezierCurveTo是一种近似模拟,用贝塞尔曲线来拟合椭圆或椭圆弧,关键在于计算合适的控制点。有些特定场景下很适合。
用arcTo, arc来实现也比较简单,不需要复杂计算,由于arcTo, arc只提供了绘制正圆弧的功能,要绘制椭圆弧,配合scale变形就可以了。推荐使用该方法。实现代码如下:
使用示例:
ellipse方法各参数的含义:
x, 椭圆圆心X坐标
y, 椭圆圆心Y坐标
radiusX, 长半轴长度
radiusY, 长半轴长度
rotation, 椭圆旋转角度 (单位是度不是弧度)
startAngle, 椭圆弧起始角弧度 (单位是弧度不是度!)
endAngle, 椭圆弧结束角弧度 (单位是弧度不是度!)
antiClockwise, 是否是逆时针方向绘制。true表示逆时针方向绘制椭圆弧,false顺时针方向绘制椭圆弧。
至于为什么一个方法内惊现 2 种角度单位,我只能说:前端标准就是这么乱!
Google出品的 canvas-5-polyfill.js 用于增强canvas兼容性,它也给canvas加上了ellipse方法
Firefox, Safari目前最新版都还不支持。。。
所以,我们需要用JS来实现这个方法。原理就是用已经支持的其它方法来模拟ellipse方法,可以用lineTo, quadraticCurveTo, bezierCurveTo, arcTo, arc等方法来实现。
用lineTo来模拟的话,就是参数方程的形式,计算出椭圆上的点的坐标,逐点用lineTo绘制模拟椭圆。简单粗暴有效。
用quadraticCurveTo, bezierCurveTo是一种近似模拟,用贝塞尔曲线来拟合椭圆或椭圆弧,关键在于计算合适的控制点。有些特定场景下很适合。
用arcTo, arc来实现也比较简单,不需要复杂计算,由于arcTo, arc只提供了绘制正圆弧的功能,要绘制椭圆弧,配合scale变形就可以了。推荐使用该方法。实现代码如下:
if (CanvasRenderingContext2D.prototype.ellipse == undefined) { CanvasRenderingContext2D.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) { this.save(); this.translate(x, y); this.rotate(rotation); this.scale(radiusX, radiusY); this.arc(0, 0, 1, startAngle, endAngle, antiClockwise); this.restore(); } }
使用示例:
// var canvas = document.getElementById("canvas1"), ctx = canvas.getContext('2d'); //.... ctx.moveTo(100,200); ctx.ellipse(300, 200, 100, 60, 0, 0, Math.PI, true); ctx.stroke();
ellipse方法各参数的含义:
x, 椭圆圆心X坐标
y, 椭圆圆心Y坐标
radiusX, 长半轴长度
radiusY, 长半轴长度
rotation, 椭圆旋转角度 (单位是度不是弧度)
startAngle, 椭圆弧起始角弧度 (单位是弧度不是度!)
endAngle, 椭圆弧结束角弧度 (单位是弧度不是度!)
antiClockwise, 是否是逆时针方向绘制。true表示逆时针方向绘制椭圆弧,false顺时针方向绘制椭圆弧。
至于为什么一个方法内惊现 2 种角度单位,我只能说:前端标准就是这么乱!
Google出品的 canvas-5-polyfill.js 用于增强canvas兼容性,它也给canvas加上了ellipse方法
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- HTML5中在客户端验证文件上传的大小
- html5 web数据存储
- 最后一次说说闭包
- Ajax
- HTML5调用摄像头实例
- 页面元素查找之Selectors API
- 使用ajax实现用户登录验证(升级版)
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因