使用canvas绘制一个五角星

4,888 阅读2分钟

一、了解canvas

canvas 是HTML5新增的元素,用于在网页上绘制图形。但 canvas 只是图形的容器,必须要通过脚本(通常是JavaScript)来绘制图形。

可以通过多种方法使用canvas标签来绘制路径、盒、圆、字符及添加图像等。

<canvas></canvas>标签间插入的内容是供不支持 canvas 元素的浏览器显示的,可以用来做兼容,例如:

<canvas id="myCanvas" width="400" height="400">
    您的浏览器暂时不支持canvas,请升级或更换您的浏览器!
</canvas>

使用 canvas 来绘制图形:

<script>
    // 使用id来寻找canvas元素
    var myCanvas = document.getElementById('myCanvas');
    if (myCanvas.getContext) {
        // 创建context对象
        // getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
        var ctx = myCanvas.getContext("2d");
        // 写一个Hello World先
        ctx.font = "30px Arial";
        ctx.fillText("Hello World", 10, 50);
    }
</script>

二、使用canvas绘制一个五角星

<script>
    // 使用id来寻找canvas元素
    var myCanvas = document.getElementById('myCanvas');
    if (myCanvas.getContext) {
        // 创建context对象
        // getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
        var ctx = myCanvas.getContext("2d");
        // beginPath:开始绘制一段新的路径
        ctx.beginPath();
        var horn = 5; // 画5个角
        var angle = 360/horn; // 五个角的度数
        // 两个圆的半径
        var R = 200;
        var r = 80;
        // 坐标
        var x = 200;
        var y = 200;
        for (var i = 0; i < horn; i++) {
            // 角度转弧度:角度/180*Math.PI
            // 外圆顶点坐标
            ctx.lineTo(Math.cos((18 + i * angle) / 180 * Math.PI) * R + x, -Math.sin((18 + i * angle) / 180 * Math.PI) * R + y);
            // 內圆顶点坐标
            ctx.lineTo(Math.cos((54 + i * angle) / 180 * Math.PI) * r + x, -Math.sin((54 + i * angle) / 180 * Math.PI) * r + y);
        }
        // closePath:关闭路径,将路径的终点与起点相连
        ctx.closePath();
        ctx.lineWidth = "3";
        ctx.fillStyle = '#E4EF00';
        ctx.strokeStyle = "red";
        ctx.fill();
        ctx.stroke();
    }
</script>

效果图:

三、让五角星动起来

在之前的基础上修改完善,让这个五角星动起来:

<script>
    // 使用id来寻找canvas元素
    var myCanvas = document.getElementById('myCanvas');
    if (myCanvas.getContext) {
        // 创建context对象
        // getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
        var ctx = myCanvas.getContext("2d");
        var horn = 5; // 画5个角
        var angle = 360/horn; // 五个角的度数
        // 两个圆的半径
        var R = 200;
        var r = 80;
        // 坐标
        var x = 200;
        var y = 200;
        var rot = 10;
        
        function drawStar(ctx, R, r, rotate){
            // beginPath:开始绘制一段新的路径
            ctx.beginPath();
            for (var i = 0; i < horn; i++) {
                // 角度转弧度:角度/180*Math.PI
                var roateAngle = i * angle - rotate; // 旋转动起来
                // 外圆顶点坐标
                ctx.lineTo(Math.cos((18 + roateAngle) / 180 * Math.PI) * R + x, -Math.sin((18 + roateAngle) / 180 * Math.PI) * R + y);
                // 內圆顶点坐标
                ctx.lineTo(Math.cos((54 + roateAngle) / 180 * Math.PI) * r + x, -Math.sin((54 + roateAngle) / 180 * Math.PI) * r + y);
            }
            // closePath:关闭路径,将路径的终点与起点相连
            ctx.closePath();
            ctx.lineWidth = "3";
            ctx.fillStyle = '#E4EF00';
            ctx.strokeStyle = "red";
            ctx.fill();
            ctx.stroke();
        }
        drawStar(ctx, R, r, 20);
        
        // setInterval(function (){
        //     ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);
        //     drawStar(ctx, R, r, rot);
        //     rot += 2;
        // }, 30);

        // 更加流畅的动画:window.requestAnimationFrame
        function step(){
            ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);
            drawStar(ctx, R, r, rot);
            rot += 1;
            window.requestAnimationFrame(step);
        }
        window.requestAnimationFrame(step);
    }
</script>