canvas笔记-非零环绕原则及剪纸实例

首先提下非零环绕原则,如下图:

这里如上面的图,这个非零环绕和画图的方向有关!

如+1要染色的地方,在这里找一个点射向外边,如果相交的地方画图方向和射线方向一样就是+1,要染色。

+2那个地方,也是那样。

0为不染色,因为一个+1一个-1,只要不是0就要染色,这就是非零环绕原则。

下面给出两个实例

程序运行截图如下:

源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<canvas id="canvas" style="border: 1px solid #aaa; display: block; margin: 50px auto;">
    当前浏览器不支持canvas
</canvas>

<script>

    window.onload = function(){

        let canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 800;
        let context = canvas.getContext("2d");

        context.beginPath();
        context.arc(400, 400, 300, 0, Math.PI * 2, false);
        context.arc(400, 400, 150, 0, Math.PI * 2, true);

        context.fillStyle = "#058";
        context.shadowColor = "gray";
        context.shadowOffsetX = 10;
        context.shadowOffsetY = 10;
        context.shadowBlur = 10;
        context.fill();
    }

</script>

</body>
</html>

第二个实例运行截图如下;

源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<canvas id="canvas" style="border: 1px solid #aaa; display: block; margin: 50px auto;">
    当前浏览器不支持canvas
</canvas>

<script>

    window.onload = function(){

        let canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 800;
        let context = canvas.getContext("2d");

        context.beginPath();
        context.rect(100, 100, 600, 600);
        pathRect(context, 200, 200, 400, 200);
        pathTriangle(context, 300, 450, 150, 650, 450, 650);
        context.arc(550, 550, 100, 0, Math.PI * 2, true);
        context.closePath();

        context.fillStyle = "#058";
        context.shadowColor = "gray";
        context.shadowOffsetX = 10;
        context.shadowOffsetY = 10;
        context.shadowBlur = 10;
        context.fill();
    }

    function pathRect(cxt, x, y, width, height){

        cxt.moveTo(x, y);
        cxt.lineTo(x, y + height);
        cxt.lineTo(x + width, y + height);
        cxt.lineTo(x + width, y);
        cxt.lineTo(x, y);
    }

    function pathTriangle(cxt, x1, y1, x2, y2, x3, y3){

        cxt.moveTo(x1, y1);
        cxt.lineTo(x2, y2);
        cxt.lineTo(x3, y3);
        cxt.lineTo(x1, y1);
    }

</script>

</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/106519011
今日推荐