canvas(一)描邊與填充


1.canvas畫布的大小

canvas默認的大小是 300*150。
通過操作width/height屬性可以設置畫布的大小,屬性值只能是具體是像素值,而不能是百分比。
提示:給canvas設置邊框就可以看見他的大小了。

注意:css樣式里面width/height只是將畫布整體縮放而已(連同畫布的坐標),並不是設置畫布的大小。

<body>
    <div class="box">
        <!-- 在標簽中設置畫布大小 -->
        <canvas width="400" height="200"></canvas>
    </div>
</body>
//js設置畫布大小
var canvas = document.querySelector("canvas")
// 方法一
canvas.setAttribute("width",400)
canvas.setAttribute("height",200)
//方法二
canvas.width = 400
canvas.height = 200

2.繪制直線

在畫布中作圖的第一步是獲取繪圖工具,接着描點,最后將描點的軌跡繪制展現出來。
要用到的API:
canvas.getContext("2d"):獲取繪圖工具
ctx.moveTo(x,y):將畫筆移動到相關坐標
ctx.lineTo(x,y):畫一條直線到相關坐標
ctx.strokeStyle:設置描邊的顏色
ctx.lineWidth:設置直線的寬度
ctx.stroke():將前面畫筆的移動軌跡進行描邊

<script>
    var canvas = document.querySelector("canvas")
    // 設置畫布大小
    canvas.width = 400
    canvas.height = 200
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")
    // 將畫筆移動到相關坐標
    ctx.moveTo(100,100)
    // 畫一條直線到相關坐標
    ctx.lineTo(300,100)
    // 再畫一條直接到相關坐標
    ctx.lineTo(300,150)
    // 設置描邊的顏色
    ctx.strokeStyle = "blue"
    // 設置直線的寬度
    ctx.lineWidth = 5
    // 將前面畫筆的移動軌跡進行描邊
    ctx.stroke()
</script>

3.設置新的繪制起點 ctx.beginPath()

ctx.stroke()繪制的時候默認會將前面已經繪制過的軌跡覆蓋,例如:

<script>
    var canvas = document.querySelector("canvas")
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")

    // 繪制一條藍色的直線
    ctx.moveTo(100,100)
    ctx.lineTo(300,100)
    ctx.strokeStyle = "blue"
    ctx.lineWidth = 5
    ctx.stroke()

    // 再繪制一條綠色的直線
    ctx.moveTo(100,150)
    ctx.lineTo(300,150)
    ctx.strokeStyle = "green"
    ctx.stroke()
</script>

我們不希望這樣的結果,可以設置新的繪制起點。
語法:ctx.beginPath()

<script>
    var canvas = document.querySelector("canvas")
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")

    // 繪制一條藍色的直線
    ctx.moveTo(100,100)
    ctx.lineTo(300,100)
    ctx.strokeStyle = "blue"
    ctx.lineWidth = 5
    ctx.stroke()

    // 再繪制一條綠色的直線
    // 設置新的繪制起點
    ctx.beginPath()
    ctx.moveTo(100,150)
    ctx.lineTo(300,150)
    ctx.strokeStyle = "green"
    ctx.stroke()
</script>

4.繪制填充顏色的三角形

fillStyle:設置填充顏色
fill():填充

注意:填充的時候會將起點和終點自動連接,以形成一個封閉的形狀

<script>
    var canvas = document.querySelector("canvas")
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")

    // 繪制一條藍色的直線
    ctx.moveTo(50,50)
    ctx.lineTo(150,50)
    ctx.lineTo(150,150)
    // 描邊的直線並沒有閉合成一個封閉的形狀
    ctx.stroke()

    // 設置填充顏色
    ctx.fillStyle = "yellow"
    // 填充(將起點和終點自動連接,以形成一個封閉的形狀)
    ctx.fill()
</script>

5.自動閉合路徑 ctx.closePath()

在描邊的時候,即使起始點和lineTo結束點的坐標一致,他也無法完全閉合,有缺角

<script>
    var canvas = document.querySelector("canvas")
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")

    // 繪制一條藍色的直線
    ctx.moveTo(50,50)
    ctx.lineTo(200,50)
    ctx.lineTo(200,200)
    ctx.lineTo(50,50)
    // 即使起點終點一致,描邊時還是有缺角
    ctx.lineWidth = 8
    ctx.stroke()
</script>

要閉合路徑,無需手動計算起點和終點,直接添加 ctx.closePath() ,會自動連接起點和終點,描邊時還不會缺角

<script>
    var canvas = document.querySelector("canvas")
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")

    // 繪制一條藍色的直線
    ctx.moveTo(50,50)
    ctx.lineTo(200,50)
    ctx.lineTo(200,200)
    // 自動閉合路徑
    ctx.closePath()
    // 即使起點終點一致,描邊時還是有缺角
    ctx.lineWidth = 8
    ctx.stroke()
</script>

6.繪制鏤空的正方形

鏤空的正方形由2個大小不一的正方形組成。小的正方形嵌套在大整形的正中央。

如果要對這2個正方形進行填充,問題就來了?是2個都進行填充?還是只填充一個?在這里填充有自己的規則,這個規則被稱為非0環繞規則。

非0環繞規則:
看一塊區域是否填充,先從這個區域往外拉一條線,看和這條線相交的軌跡,如果是順時針就+1,逆時針就-1,如果最終值不等於0,則該區域填充。如果等於0,則該區域不填充。

<script>
    var canvas = document.querySelector("canvas")
    // 獲取繪圖工具
    var ctx = canvas.getContext("2d")

    //繪制兩個大小不一的正方形套在一起(200*200 100*100)

    //大正方形順時針 200*200
    ctx.moveTo(50, 50);
    ctx.lineTo(250, 50);
    ctx.lineTo(250, 250);
    ctx.lineTo(50, 250);
    //自動閉合路徑
    ctx.closePath();

    //小正方形逆時針 100*100
    ctx.moveTo(100, 100);
    ctx.lineTo(100, 200);
    ctx.lineTo(200, 200);
    ctx.lineTo(200, 100);
    //自動閉合路徑
    ctx.closePath();

    ctx.fillStyle = "yellow"
    ctx.fill()
</script>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM