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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在HTML5的Canvas上绘制椭圆的几种方法相关的知识,希望对你有一定的参考价值。

html5中的Canvas并没有直接提供绘制椭圆的方法,下面是对几种绘制方法的总结。各种方法各有优缺,视情况选用。各方法的参数相同,以下为两种常见的方法。

工具原料:浏览器、编辑器

方法一:参数方程法

1、函数的参数x,y为椭圆中心,a,b分别为椭圆横半轴、纵半轴长度,不可同时为0,该方法的缺点是,当lineWidth较宽,椭圆较扁时,椭圆内部长轴端较为尖锐,不平滑,效率较低,代码如下:

function ParamEllipse(context, x, y, a, b)

   //max是等于1除以长轴值a和b中的较大者
   //i每次循环增加1/max,表示度数的增加
   //这样可以使得每次循环所绘制的路径(弧线)接近1像素
   var step = (a > b) ? 1 / a : 1 / b;
   context.beginPath();
   context.moveTo(x + a, y); //从椭圆的左端点开始绘制
   for (var i = 0; i < 2 * Math.PI; i += step)
   
      //参数方程为x = a * cos(i), y = b * sin(i),
      //参数为i,表示度数(弧度)
      context.lineTo(x + a * Math.cos(i), y + b * Math.sin(i));
   
   context.closePath();
   context.stroke();
;

方法二:均匀压缩法

1、其方法是用arc方法绘制圆,结合scale进行,横轴或纵轴方向缩放(均匀压缩),这种方法绘制的椭圆的边离长轴端越近越粗,长轴端点的线宽是正常,边离短轴越近、椭圆越扁越细,甚至产生间断,这是scale导致的结果,这种缺点某些时候是优点,比如在表现环的立体效果(行星光环)时,对于参数a或b为0的情况,这种方法不适用,代码如下:

function EvenCompEllipse(context, x, y, a, b)

   context.save();
   //选择a、b中的较大者作为arc方法的半径参数
   var r = (a > b) ? a : b; 
   var ratioX = a / r; //横轴缩放比率
   var ratioY = b / r; //纵轴缩放比率
   context.scale(ratioX, ratioY); //进行缩放(均匀压缩)
   context.beginPath();
   //从椭圆的左端点开始逆时针绘制
   context.moveTo((x + a) / ratioX, y / ratioY);
   context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI);
   context.closePath();
   context.stroke();
   context.restore();
;
参考技术A

关于canvas绘制椭圆的方式在我的这篇博文里面有详细的描述.其实canvas是支持绘制椭圆的,只不过很多人转发博文的时候不带思考.把错的也给转发了.下面是链接Canvas绘制椭圆

以上是关于在HTML5的Canvas上绘制椭圆的几种方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 canvas 绘图的几种方法

HTML5——Canvas 高级操作

Three中创建文字的几种方法

如何在 html5 画布中绘制椭圆?

如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

圆与椭圆