ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise)。
参数(从左到右):
(起点x,起点y,半径x,半径y,旋转的角度,起始角,结果角,顺时针还是逆时针)
<!DOCTYPE html> <html> <head> <Meta charset=UTF-8> <title>椭圆</title> </head> <body> <canvas id=canvas style=border:1px solid #aaa;display:block;margin:50px auto;> 当前浏览器不支持Canvas,请更换浏览器后再试 </canvas> <script> window.onload = function(){ var canvas = document.getElementById(canvas); var ctx=canvas.getContext('2d'); canvas.width = 800; canvas.height = 800; if(ctx.ellipse){ ctx.ellipse(300,300,200,100,0,0,Math.PI*2); ctx.fillStyle=blue; ctx.strokeStyle=#000; ctx.fill(); ctx.stroke(); }else{ alert(no ellipse!); } } </script> </body> </html>
canvas画的椭圆效果如下:
说明:这种方法目前似乎只有谷歌支持,其他浏览器还未存在ellipse()。
既然上述方法无法支持其他浏览器,我们就来看看其他canvas绘制椭圆的方法。
这种方法用到了一个canvas函数scale,scale函数能实现canvas的缩放。缩放有水平和垂直两个方向,代码中把canvas水平方向放大了,而垂直方向不变,因此,原来arc画出的圆形就变成了一个椭圆。
canvas绘制椭圆的代码如下:
<!DOCTYPE HTML> <html> <head> <style> body { margin: 0px; padding: 0px; } </style> </head> <body> <canvas id=myCanvas width=578 height=200></canvas> <script> var canvas = document.getElementById('myCanvas'); var context = canvas.getContext('2d'); var centerX = 0; var centerY = 0; var radius = 50; // save state context.save(); // translate context context.translate(canvas.width / 2, canvas.height / 2); // scale context horizontally context.scale(2, 1); // draw circle which will be stretched into an oval context.beginPath(); context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false); // restore to original state context.restore(); // apply styling context.fillStyle = 'pink'; context.fill(); context.linewidth = 5; context.strokeStyle = 'black'; context.stroke(); </script> </body> </html>
canvas椭圆效果如下:
二、canvas画椭圆之使用贝赛尔曲线绘制椭圆
这种方法绘制椭圆是把一个椭圆分成了4条贝塞尔曲线,用他们连成了一个椭圆。
canvas绘制椭圆的代码如下:
<!DOCTYPE html> <html> <head> <Meta charset=UTF-8> <title>椭圆</title> </head> <body> <canvas id=canvas style=border:1px solid #aaa;display:block;margin:50px auto;> 当前浏览器不支持Canvas,请更换浏览器后再试 </canvas> <script> var canvas = document.getElementById(canvas); canvas.width = 600; canvas.height = 600; var context = canvas.getContext(2d); context.linewidth = 10; context.strokeStyle=black; BezierEllipse2(context, 470, 200, 100, 20); //椭圆 function BezierEllipse2(ctx, x, y, a, b){ var k = .5522848, ox = a * k, // 水平控制点偏移量 oy = b * k; // 垂直控制点偏移量</p> <p> ctx.beginPath(); //从椭圆的左端点开始顺时针绘制四条三次贝塞尔曲线 ctx.moveto(x - a, y); ctx.bezierCurveto(x - a, y - oy, x - ox, y - b, x, y - b); ctx.bezierCurveto(x + ox, y - b, x + a, y - oy, x + a, y); ctx.bezierCurveto(x + a, y + oy, x + ox, y + b, x, y + b); ctx.bezierCurveto(x - ox, y + b, x - a, y + oy, x - a, y); ctx.closePath(); ctx.stroke(); }; </script> </body> </html>
canvas椭圆效果如下:
三、canvas画椭圆之使用两条贝赛尔曲线画出椭圆
canvas绘制椭圆的代码如下:
//椭圆 CanvasRenderingContext2D.prototype.oval = function (x, y, width, height) { var k = (width/0.75)/2, w = width/2, h = height/2; this.beginPath(); this.moveto(x, y-h); this.bezierCurveto(x+k, y-h, x+k, y+h, x, y+h); this.bezierCurveto(x-k, y+h, x-k, y-h, x, y-h); this.closePath(); return this; }
注意:这个方法只需要记住这一点,椭圆的宽度与画出椭圆的贝赛尔曲线的控制点的坐标比例如下:
贝塞尔控制点x=(椭圆宽度/0.75)/2。
原文地址:https://www.jb51.cc/html5/1199948.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。