1. 程式人生 > >canvas繪製圖形——直線、多邊形、七巧板

canvas繪製圖形——直線、多邊形、七巧板

前言

canvas 是 html5 中的一個新元素,主要用於圖形的繪製,通過 JavaScript 來控制。<canvas> 標籤定義一個圖形容器,也可以叫做畫布,通過 js 指令碼可以繪製出各種各樣的影象。

建立canvas

建立 canvas 只需要新增 canvas 標籤就可以了,在建立時,除 id 外一般還會定製畫布尺寸(width height)。定義畫布尺寸不建議使用 css 的方式定製,這裡的尺寸也定義了畫布內部的解析度,是 w3c 的標準用法。

<!DOCTYPE html>
<html lang="zh-cn">
<head> <meta charset="UTF-8"> <title>CanvasDemo</title> </head> <body> <canvas id="canvas" width="768" height="768"></canvas> </body> </html>

繪製圖形

在 js 中首先要對 canvas 物件初始化。

var canvas = document.getElementById('canvas');
var context =
canvas.getContext('2d'); // 使用 2d 畫圖
繪製直線

繪製直線用到的兩個函式主要是 context.moveTo(x1, y1) 和 context.lineTo(x2, y2)。表示一條從 (x1, y1) 到 (x2, y2) 的直線, context.lineTo( ) 函式可以多次呼叫實現多筆畫。然後呼叫 context.stroke( ) 繪製。

// 狀態設定
context.moveTo(100,100)	// 起點
context.lineTo(700,700)	
context.lineTo(700,100)
context.lineWideh = 5	// 畫筆寬度
context.
strokeStyle = "#005588" // 畫筆樣式,主要指顏色 // 繪製 context.stroke();
繪製多邊形

使用 context.lineTo( ) 可以實現多筆畫,因此回到起點的話,就繪製出了一個多邊形。

context.moveTo(100,100)	// 起點
context.lineTo(700,700)	
context.lineTo(700,100)
context.lineTo(100,100)	// 回到起點

context.stroke();

上述例子中就繪製了一個空心三角形,我們可以使用 context.fill( ) 來給三角形著色。用法如下:

context.fillStyle = "rgb(2,100,30)";
context.fill();

繪製多個圖形

在實際應用中,大部分情況下不會只繪製一條直線或一個圖形,當要在一個畫布中繪製多個圖形時,要使用 context.beginPath( ) 和 context.closePath( )。

context.beginPath();
context.moveTo(100,100)	// 起點
context.lineTo(700,700)	
context.lineTo(700,100)
context.lineTo(100,100)	
// 繪製
context.fillStyle = "rgb(2,100,30)";
context.fill();
context.stroke();
context.closePath();
            
context.beginPath();
context.moveTo(100,200)	// 起點
context.lineTo(600,700)	
// 繪製
context.strokeStyle = "blue";
context.lineWidth = 5;
context.stroke();
context.closePath();

例項:繪製七巧板

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>七巧板</title>
</head>
<body>
    <canvas id="canvas"></canvas>
    <style>
        #canvas{
            margin: auto;
        }
    </style>
    <script>
        // 定義資料
        var data = [
            {p:[{x:0,y:0},{x:800,y:0},{x:400,y:400}],color:"#caff67"},
            {p:[{x:0,y:0},{x:400,y:400},{x:0,y:800}],color:"#67beef"},
            {p:[{x:800,y:0},{x:800,y:400},{x:600,y:600},{x:600,y:200}],color:"#ef3d61"},
            {p:[{x:600,y:200},{x:600,y:600},{x:400,y:400}],color:"#f9f51a"},
            {p:[{x:400,y:400},{x:600,y:600},{x:400,y:800},{x:200,y:600}],color:"#a594c0"},
            {p:[{x:200,y:600},{x:400,y:800},{x:0,y:800}],color:"#6a5acd"},
            {p:[{x:800,y:400},{x:800,y:800},{x:400,y:800}],color:"#f6ca29"},
        ];
        
		// 繪製
        window.onload = function(){
            var canvas = document.getElementById('canvas');
            var context = canvas.getContext('2d');
            canvas.width = 800;
            canvas.height = 800;

            for(var i = 0;i < data.length;i++){
                draw(data[i], context);
            }
        };
        
        // 繪製函式
        function draw(data,context){
            context.beginPath();
            context.moveTo(data.p[0].x, data.p[0].y);
            for(var i = 1;i < data.p.length;i++){
                context.lineTo(data.p[i].x, data.p[i].y);
            }
            context.lineTo(data.p[0].x, data.p[0].y)
            context.closePath();
            context.fillStyle = data.color;
            context.fill();
        }
    </script>
</body>
</html>

效果圖

pic