HTML5 Canvas 绘制椭圆与椭圆弧的实现

原创 2016年06月01日 19:00:33
由于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变形就可以了。推荐使用该方法。实现代码如下:

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方法

在HTML5的Canvas上绘制椭圆的几种方法(转)

概述     HTML5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结。各种方法各有优缺,视情况选用。各方法的参数相同: context为Canvas的2D绘图环境对象,x...
  • dragoo1
  • dragoo1
  • 2015年07月28日 13:58
  • 949

canvas画旋转椭圆

要求使用画布变换方法。 效果如下: 代码如下: 旋转椭圆 var canvas = document.querySelector('#canvas'), con...
  • sysuzjz
  • sysuzjz
  • 2016年11月09日 23:56
  • 813

html5 canvas 实现小球绕椭圆旋转

测试 var ball_count = 10;//小球的个数 var circle_x = 0;//圆心的X坐标 var circl...
  • czh4869623
  • czh4869623
  • 2014年09月17日 14:23
  • 2349

three.js 源码注释(九十三)extras/core/Path.js

Path类创建2d的路径,包括点,线,和立方体,类似于HTML5 2D画布的API,curvePath类的扩展. Curve 2维向量数组...
  • omni360
  • omni360
  • 2015年02月01日 20:20
  • 1588

利用 Three.js 编写 web 版 3D 贪吃蛇游戏

Three.js是一个好用的web 3D框架,可以省去直接调用WebGL的麻烦
  • jupeizhong
  • jupeizhong
  • 2014年10月28日 17:05
  • 2855

【JavaScript】实现三个小球围着椭圆旋转的加载动画

好久没有写过原生JS了,突然没事做,写了一个跟着鼠标走的加载小动画,最终效果如下图: 这个效果实现起来非常简单,大概思路是:先用 CSS3 的 border-radius 属性将三个 di...
  • a727911438
  • a727911438
  • 2017年07月06日 16:06
  • 773

HTML5画布Three.js图像纹理

将一个图像纹理应用到与Three.js,我们可以设置材料属性映射到一个图像使用loadTexture形象实用程序。 body { margin: 0p...
  • u012292563
  • u012292563
  • 2014年01月09日 13:42
  • 788

画椭圆 - HTML5 Canvas 作图

8、function DrawEllipse(Canvas,O,OA,OB) 功能:画椭圆 参数:O:椭圆中心的坐标; OA,OB:长轴、短轴的长度 源代码: function D...
  • HTMLCanvas
  • HTMLCanvas
  • 2012年08月13日 14:41
  • 730

Three.js自定义相机旋转动画:沿圆弧旋转

/* *camera:相机 *angle:旋转角度 *segs:分段,即圆弧对应的路径分为几段 *during:动画执行的时间 ...
  • birdflyto206
  • birdflyto206
  • 2016年08月17日 09:41
  • 6037

JS画椭圆

*{ margin:0; padding:0; } .ab{ width:1px; ...
  • u011551941
  • u011551941
  • 2015年05月29日 17:33
  • 1718
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HTML5 Canvas 绘制椭圆与椭圆弧的实现
举报原因:
原因补充:

(最多只允许输入30个字)