canvas07:非零環繞填充規則與繪製一個鏤空的正方形

1先繪製一個大的正方形

2繪製一個小的正方形,位於大正方形的中部

3.填充後我們會得到什麼圖形?

我們接下來試一下:

代碼:

<style>
    canvas {
        border: 1px #333 solid;
    }
</style>
<body>
    <!-- 1.定義一個畫板 -->
    <canvas id="canvas01" width="400px" height="600px"></canvas>
</body>
</html>
<script>

    var myCanvas = document.getElementById('canvas01');

    var ctx = myCanvas.getContext('2d');
    // 大的正方形、
    ctx.moveTo(100,100);
    ctx.lineTo(300,100);
    ctx.lineTo(300,300);
    ctx.lineTo(100,300);
    ctx.closePath();
    ctx.stroke();
    // 繪製小的正方形
    ctx.moveTo(150,150);
    ctx.lineTo(250,150);
    ctx.lineTo(250,250);
    ctx.lineTo(150,250);
    ctx.closePath();
    // 描邊
    ctx.stroke();
    ctx.fill();
</script>

效果:

結果:我們只看到了黑色的大正方形,沒有看到小正方形。我們現在逆時針描繪小正方形。

代碼:

   // 第二種
    // 大的正方形、
    ctx.moveTo(100,100);
    ctx.lineTo(300,100);
    ctx.lineTo(300,300);
    ctx.lineTo(100,300);
    ctx.closePath();
    ctx.stroke();
    // 繪製小的正方形
    ctx.moveTo(150,150);
    ctx.lineTo(150,250);
    ctx.lineTo(250,250);
    ctx.lineTo(250,150);
    ctx.closePath();
    // 描邊
    ctx.stroke();
    ctx.fill();

效果:

我們可以看到,逆時針描繪小正方形,小正方形沒有填充顏色,我們得到了一個鏤空的正方形。

原因:

    非零環繞填充規則:看一塊區域是否被填充,可以重這個區域拉一條線出去,看和這條直線相交的軌跡,如果遇到順時針軌跡加1,如果遇到逆時針軌跡減1,將所以軌跡的值計算出來,如果是非零就填充,如果等於零不填充。

當我們順時針描繪小正方形時,直線相交的兩個點爲順時針,結果爲2,填充。逆時針描繪時,直線相交的兩個點結果爲0,不填充。而大的正方形,直線只相交於大正方形的邊,結果爲1,填充。

如圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章