风骚的 【Canvas (曲线图形绘制)】

1,464 阅读5分钟

风骚的 Canvas

3.1 canvas中的曲线图形

曲线与弧线的区别:弧线上的每一个点都有相同的曲率,也就是说弧线上的点是在一个圆周上的,而曲线则不一定,曲线可以有自己轨迹,曲线包括弧线。

3.1.1 圆形的绘制

API:

  • beginPath(): 开始路径
  • arc(x,y,r,beginAngle,endAngle,anticlockwise): 参数分别表示 圆心坐标,起始角度,结束角度,是否逆时针绘制,默认为false,也就是默认按顺时针绘制。
  • closePath(): 闭合路径,这样会形成一个封闭的图形,如果不适用closePath方法闭合路径的话那么绘制出来的就是一段弧线。

关于角度

起始角度和结束角度都用弧度表示, 即 90° 表示为 90 * Math.PI / 180,起始角度与结束角度都是与x轴正反向的夹角。

绘制圆与圆弧的步骤

绘制封闭圆形: 开始路径,定义圆/半圆,闭合路径,描边/填充,这样绘制的是一个闭合的圆形/半圆。
绘制圆弧: 开始路径,定义圆弧,描边,绘制圆弧不需要闭合路径,只需要定义好圆弧进行描边即刻。

描边圆

    <body>
        <canvas id="circle1" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function() {
                var circle1 = document.getElementById('circle1')
                var ctx1 = circle1.getContext('2d')
                
                ctx1.beginPath()
                ctx1.arc(100,100,50,0,90* Math.PI / 180)
                ctx1.closePath()
                
                //描边圆
               ctx1.strokeStyle = "red"
               ctx1.stroke()
    </body>    
    

浏览器中显示的效果

image.png

填充圆

    <body>
        <canvas id="circle1" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function() {
                var circle1 = document.getElementById('circle1')
                var ctx1 = circle1.getContext('2d')
                
                ctx1.beginPath()
                ctx1.arc(100,100,50,0,90* Math.PI / 180)
                ctx1.closePath()
                
                 //填充圆
                ctx1.fillStyle = "red"
                ctx1.fill()
    </body>    
    

浏览器中的预览效果

image.png

注意事项:

在定义了一个圆之后,如果不进行填充或者描边的话是不会有显示效果的,因为定义了之后要进行绘制

绘制一个完整的圆

        <body>
        <canvas id="circle1" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function() {
                var circle1 = document.getElementById('circle1')
                var ctx1 = circle1.getContext('2d')
                
                ctx1.beginPath()
                ctx1.arc(100,100,50,0,360 * Math.PI / 180)
                ctx1.closePath()
                
                 //填充圆
                ctx1.fillStyle = "red"
                ctx1.fill()
    </body>    
    

浏览器中预览效果

image.png

3.1.2 弧线的绘制

API:

  • arc(x,y,r,beginAngle,endAngle,anticlockwise): 分别表示 圆心坐标,起始角度,结束角度,是否逆时针绘制,默认为false,也就是默认按顺时针绘制
  • arcTo(cx,cy,x2,y2,r): 参数分别表示 控制点坐标,结束点坐标,半径,使用方法是 通过moveTo等方法定义一个起点,然后起点,结束点分别与控制点相连成边形成夹角,这条圆弧就是一条与两边相切且半径为r的弧线,arcTo()方法绘制的弧线是两个切点之间长度最短的圆弧。如果开始点不是弧线起点,arcTo()方法还将添加一条当前端点到弧线起点的直线线段。也就是说,开始点坐标并不一定是弧线起点坐标,如图:。

image.png

使用arc方法绘制圆弧

        <body>
        <canvas id="circle1" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function() {
                var circle1 = document.getElementById('circle1')
                var ctx1 = circle1.getContext('2d')
                
                ctx1.beginPath()
                ctx1.arc(100,100,50,0,90 * Math.PI / 180)
                           
                 //填充圆
                ctx1.strokeStyle = "blue"
                ctx1.stroke()
    </body>    
    

浏览器中的预览效果

image.png

使用 arcTo 方法绘制圆形

        <body>
        <canvas id="circle1" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function() {
                var circle1 = document.getElementById('circle1')
                var ctx1 = circle1.getContext('2d')
                
                ctx1.moveTo(100,160)
                ctx1.lineTo(140,160)
                ctx1.stroke()
                ctx1.arcTo(160,160,160,190,20)
                ctx1.lineTo(160,210)
                ctx1.stroke()  
                 
    </body>    
    

浏览器中的预览效果

image.png

圆角矩形的绘制

        <body>
        <canvas id="canvas" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function () {
            /** @type {HTMLCanvasElement} */
            var canvas = document.getElementById('canvas')
            var ctx = canvas.getContext('2d')

            ctx.moveTo(50,50)
            ctx.lineTo(160,50)
            ctx.arcTo(190,50,190,80,30)
            ctx.moveTo(190,80)
            ctx.lineTo(190,120)
            ctx.arcTo(190,150,160,150,30)
            ctx.moveTo(160,150)
            ctx.lineTo(50,150)
            ctx.arcTo(20,150,20,120,30)
            ctx.moveTo(20,120)
            ctx.lineTo(20,80)
            ctx.arcTo(20,50,50,50,30)
            ctx.stroke()
                 
    </body>    
    

浏览器中预览效果

image.png

看到这是不是瞬间感觉border-radius格外的香.........

这些是绘制圆形或者圆弧的方法,那么怎么绘制如何绘制一条曲线呢?如说着这种:

image.png

这种曲线我们可以采用贝塞尔曲线的方式进行绘制。

3.1.3 曲线的绘制

贝塞尔曲线: 贝塞尔曲线是一种用于二维图形的应用程序数学曲线,接触过css的同学们应该知道我们可以利用贝塞尔曲线进行动画的调节,它的应用还是比较广泛的,在任何一种绘图系统里都会有所涉及,因此掌握贝塞尔曲线还是很重要的

二次贝塞尔曲线

API: -quadraticCurveTo(cx,cy,endx,endy): 二次贝塞尔曲线的参数类似与arcTO,但是它不需要半径,如图:。

image.png

   <body>
        <canvas id="canvas" width="500" height="700" style="border: 1px solid red;"></canvas>
            window.onload = function () {
                /** @type {HTMLCanvasElement} */
                var canvas = document.getElementById('canvas')
                var ctx = canvas.getContext('2d')
                ctx.moveTo(100, 100)

                ctx.quadraticCurveTo(200, 100, 50, 150)
                ctx.stroke()
                 
    </body>    
    

浏览器中的预览效果

image.png

注意:二次贝塞尔曲线只提供了控制点和结束点,起始点还是需要我们自己通过moveTo或者lineTo进行提供

三次贝塞尔曲线

在canvas中我们还可以通过三次贝塞尔曲线进行曲线的绘制,三次贝塞尔的基础上多加了一个控制点,如下图:

image.png

三次贝塞尔曲线是通过四个点来调节曲线弯曲程度,它的起点同样事通过moveTo或者lineTo提供。

API:

  • bezierCurveTo(cx1,cy1,cx2,cy2,ex,ey):分别对应控制点1,控制点2,结束点。
  <body>
            <canvas id="canvas" width="500" height="700" style="border: 1px solid red;"></canvas>
                window.onload = function () {
                    /** @type {HTMLCanvasElement} */
                    var canvas = document.getElementById('canvas')
                    var ctx = canvas.getContext('2d')
                 //三次贝塞尔曲线
                    ctx.moveTo(20,80)
                    ctx.bezierCurveTo(20,20,120,120,120,60)
                    ctx.stroke()
                 
    </body>   
    

浏览器中的预览效果

image.png

关于曲线图形的相关绘制可参考HTML 5 Canvas查看相应的API,线条与文本