本文主要介绍了HTML5画布中4种绘制椭圆的方法。本文介绍了4种方法:参数方程法、均匀压缩法、三次贝塞尔曲线法和光栅法。





总结

HTML5中的画布并没有直接提供一种绘制椭圆的方法,下面是几种绘图方法的总结:

1.context是2D绘图环境对象的帆布,
2。x是一个椭圆的中心坐标,
3 y是一个椭圆中心坐标,
4、A是椭圆横半轴。
5 b是椭圆的纵轴的长度。

参数方程法

该方法利用椭圆参数方程绘制椭圆。

复制代码代码如下所示:
/ / -----------方程是用来画椭圆的贸易数据交换
参数,y,b为椭圆的中心;椭圆椭圆轴分别为,
/纵轴长度,不同时0
/这种方法的缺点是线宽较宽时,相对平坦的椭圆。
椭圆内尖/长轴,不光滑,效率低。
函数的ParamEllipse(X,Y,语境,A,B)
{
max等于1,除以长轴值a和b中较大的一个。
我为每一个周期添加了1 max,表示增加的程度。
这使得每个循环/路径绘制到接近1个像素(ARC)。
var(=)(1)1;
Context.beginPath();
Context.moveTo(X,Y); / /从左点绘制椭圆
对于(var i = 0;i < 2 * Math.PI;我=步)
{
参数方程x=a(i),y=B **(i),
/ /参数为我,以度(弧度)
Context.lineTo(x + * Math.cos(我),Y + b * math.sin(我));
}
Context.closePath();
context.stroke();
};


均匀的压缩方法

该方法利用数学中的均匀压缩原理将圆压缩成椭圆。从理论上讲,它可以得到标准椭圆。下面的代码将导致线宽不一致的问题。解决的办法是看评论在5楼simonleung。

复制代码代码如下所示:
/ / ------------均匀压缩方法比椭圆
该方法用于绘制与刻度相结合的圆弧/圆弧法。
水平方向或垂直方向/缩放(均匀压缩)
长轴端点长轴端近端椭圆刃厚的绘制方法为正态宽度法。
从短轴近轴的边缘看,较平坦的椭圆很细,甚至断了,这是刻度的结果。
这是当一些缺点/优点,如立体声效应在性能的环(环)时
对于A或B 0的参数,此方法不合适。
函数的EvenCompEllipse(X,Y,语境,A,B)
{
context.save();
选择半径半径参数法中的A,B/O / 大
var(= B)A:B;
无功ratiox = / / / R;横向放大率
无功ratioy = b / / / R;垂直缩放比例
context.scale(ratiox,ratioy); / /变焦(均压)
Context.beginPath();
从一开始就是椭圆/逆时针拉伸。
Context.moveTo(((x + y) / / ratiox,ratioy);
context.arc(X / Y / ratiox,ratioy,R,0, 2×数学。PI);
Context.closePath();
context.stroke();
context.restore();
};


三次贝塞尔曲线法1

三次贝塞尔曲线绘制椭圆在实际绘图的一种近似,也是理论的一个近似。但由于其效率高,在计算机矢量图形,它经常用于绘制椭圆,但具体的理论还不是很清楚。近似度在两控制点的选择,该方法的控制点的位置是我自己的实验,且精度好。

复制代码代码如下所示:
/ / ---------使用三贝塞尔曲线模拟椭圆1 ---------------------
这种方法在线宽较宽、相对平坦的椭圆时产生,
主要轴端尖锐且不光滑现象。
功能bezierellipse1(x,y,语境,A,B)
{
关键是 / /两控制点beziercurveto集
0.5和0.6是两个关键系数(在这个函数中测试)
var = 0.5 * *,
= 0.6×**;
context.save();
context.translate(x,y);
Context.beginPath();
从椭圆的纵轴上/下端开始逆时针方向画。
context.moveto(0,B);
Context.bezierCurveTo(牛B,一个,哦,一,0);
Context.bezierCurveTo(,-哦,牛,B,0,B);
Context.bezierCurveTo(牛,B,-,-哦,-,0);
Context.bezierCurveTo(-,哦,牛,B,0,B);
Context.closePath();
context.stroke();
context.restore();
};


三次贝塞尔曲线法2

这种方法是由计算器后回复,精度高,并绘制椭圆的常用方法。

复制代码代码如下所示:
/ / ---------使用三贝塞尔曲线模拟椭圆2 ---------------------
这种方法在线宽较宽、相对平坦的椭圆时产生。
、长轴端尖而不平滑现象。
该方法比贝塞尔方法精度高,但效率较低。
功能bezierellipse2(CTX,X,Y,A,B)
{
var = 5522848,
控制点偏移量
垂直控制点偏移
Ctx.beginPath();
从一开始就是椭圆/顺时针方向绘制43贝塞尔曲线。
Ctx.moveTo(X,Y);
Ctx.bezierCurveTo(X,Y公司,X牛B,Y,X,Y B);
Ctx.bezierCurveTo(X + Y B,牛X,Y公司,X,Y);
Ctx.bezierCurveTo(X + Y + X +,哎,牛,Y + B,X,Y + B);
Ctx.bezierCurveTo(X牛,Y + B,X,Y +公司,X,Y);
Ctx.closePath();
Ctx.stroke();
};


光栅的方法

该方法可以根据画布对像素的操作能力,利用图形中的基本算法绘制椭圆,如中点画椭圆算法等。

一个例子是博客一,一个HTML5画布,强化班(1)mdash;mdash;光栅图形(1)中点圆算法这种方法更加灵活、高效和准确的比较,因为原始。但要实现一个有价值的椭圆作图功能,就更为复杂了,例如,当线宽变化时,算法就更复杂了,虽然它是一种绘制圆的算法,但画椭圆的算法与此类似。

总结

由于显示分辨率的限制,基本上所有的方法都不可能达到100%的精度。

最好的方式是将电弧()+()规模。画布绘图库KineticJS是此方法的使用。

在其他绘图软件,与HTML5的画布,它提供了内在的弧()+()方法,通常规模模拟近似椭圆的贝塞尔曲线,无论多少贝塞尔曲线是近似的。对贝塞尔曲线来模拟椭圆的使用,你可以参考这个信息:使用折线图椭圆弧,二次或三次Bezier曲线。

由于ARC(+)+规模(浏览器)是一种浏览器实现的方法,理论上具有最高的精确度,它从效率、准确性和易用性中获益最大。

在绘制椭圆弧()+()量表,对两种方法的调用顺序context.stroke context.restore()和()的不同,结果将是非常有趣的。通常应该恢复()和中风()。

演示

下面是除了光栅法之外的几个椭圆函数的演示。演示代码如下所示:

复制代码代码如下所示:

< / / {CDATA{!
VaR的画布,
语境;
var div = document.getelementbyid(canvaswrap );
div.innerhtml = ;
画布document.createelement(画布);
canvas.style.width =600px
canvas.style.height =600px
canvas.width = 600;
canvas.height = 600;
背景canvas.getcontext(2D);
div.appendchild(帆布);
execdraw()函数
{
解决镀铬线宽度小于或等于1个问题
context.linewidth = 1.1;
背景。strokeStyle =黑
ParamEllipse(背景,130, 80, 50,50); / /圈
ParamEllipse(背景,130, 80, 100,20); / /椭圆
EvenCompEllipse(背景,130, 200, 50,50); / /圈
EvenCompEllipse(背景,130, 200, 100,20); / /椭圆
bezierellipse1(背景,470, 80, 50,50); / /圈
bezierellipse1(背景,470, 80, 100,20); / /椭圆
bezierellipse2(背景,470, 200, 50,50); / /圈
bezierellipse2(背景,470, 200, 100,20); / /椭圆
相似性检测(重合度)
ParamEllipse(背景,300, 450, 250,50);
context.strokestyle =黄色;
bezierellipse1(背景,300, 450, 250,50);
context.strokestyle =蓝色;
bezierellipse2(背景,300, 450, 250,50);
};
clearcavnas()函数
{
context.clearrect(0, 0, 600,600);
};
>


实施
明确


注意,要成功运行代码,您需要支持HTML5画布的浏览器。