欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HTML5绘制圆弧的代码教程

程序员文章站 2023-11-05 12:18:22
绘制圆弧 圆弧被定义为假想的圆周上任意两点之间的部分。canvas的api提供了两个绘制圆弧的方法:arc()和arcto()方法。 arc()方法 使用arc()方法绘制圆弧时,假想的圆由圆心和半...

绘制圆弧

圆弧被定义为假想的圆周上任意两点之间的部分。canvas的api提供了两个绘制圆弧的方法:arc()和arcto()方法。

arc()方法

使用arc()方法绘制圆弧时,假想的圆由圆心和半径来定义,两个点由起始角度和结束角度来定义,还需要一个参数来定义绘制方向。故,arc()方法的格式为:

arc(x, y, radius, startangle, endangle [, anticlockwise])

其中,(x, y)表示圆心的坐标,radius表示圆的半径,stratangle和endangle表示圆弧的起始角度和结束角度。可选参数anticlockwise用来指示绘制方向,true表示逆时针,false表示顺时针,默认值为false,即顺时针。

圆弧的单位是弧度。在一个圆周上,其角度是在笛卡尔坐标系下定义的,从圆右侧的0π开始,按顺时针方向依次经过π/2、π、3π/2、2π。角度的位置是规定好的,并且固定不变,与顺时针还是逆时针无关。如图 4‑7 所示:

HTML5绘制圆弧的代码教程

图4-7 arc()方法示意图

起始角度和结束角度没必要非得在0π 到 2π之间,它可以是任意实数,因为在圆周上旋转时,角度可以相互重叠。比方说我们定义3π为起始角度,就相当于圆周上完整的一圈(2π)再加另外半圈(1π)。也就是说,3π就等价于1π。再举一个例子,-3π也等价于1π,因为角度沿圆周逆时针旋转1.5圈,将结束于1π。

由于角度的位置是固定的,所以,在其他参数相同时,圆弧所掠过的角度就由anticlockwise参数来决定。例如,stratangle = 0,endangle = π / 2,如果顺时针画弧,则掠过的角度为90°;如果逆时针画弧,则掠过的角度为270°。

如下代码绘制两段圆弧,先逆时针方向绘制一个绿色的圆弧,再顺时针方向绘制一个浅黑色的圆弧。这两段圆弧,除了anticlockwise参数不同,其他参数均相同,它们位于同一个圆周上。 

context.linewidth = 10;   

context.beginpath();

context.arc(100, 100, 50, 0, math.pi/2 , true);

context.strokestyle = '#0f0';

context.stroke();

context.beginpath();

context.arc(100, 100, 50, 0, math.pi/2 , false);

context.strokestyle = '#444';

context.stroke();

上述代码的运行结果如图 4‑8 所示:

HTML5绘制圆弧的代码教程

图4-8 arc()方法绘制圆弧

可以看出,逆时针方向绘制的绿色圆弧所掠过的角度为270°,顺时针方向绘制的浅黑色圆弧所掠过的角度为90°,两段圆弧会正好形成一个完整的圆。

说明:

canvas中的所有角度都是以弧度为单位的,可以使用 degrees*math.pi/180 公式将角度转换为弧度。如20度,用弧度表示为20*math.pi/180。

arcto()方法

arcto()方法用来绘制与两条假想的直线均相切的假想圆上的圆弧。arcto()方法的格式为:

arcto(x1, y1, x2, y2, radius)

其中,(x1,y1)和(x2,y2)分别代表两个点,radius代表圆的半径。该方法一指定半径绘制一条圆弧,此圆弧与当前点到(x1,y1)的连线相切,而且与(x1,y1) 和(x2,y2)的连线也相切。在假想的圆上会有两段圆弧,arcto()方法取长度较短的那个。

context.beginpath();

context.moveto(20,20);          // 创建开始点

context.lineto(100,20);          // 创建水平线

context.arcto(150,20,150,70,50); // 创建弧线

context.lineto(150,140);         // 创建垂直线

context.stroke();                // 进行绘制

创建水平线后,当前点就成为(100,20),并且圆弧与(100,20)到(150,20)的水平线,(150,70) (150,140)的垂直线都相切,取其中较短的圆弧。