iT邦幫忙

2

Canvas - 基礎圖形繪製篇

Ares 2019-06-18 14:13:454387 瀏覽
  • 分享至 

  • xImage
  •  

此篇要來介紹 canvas,它是一個 html 中的元素,並且可以使用 javascript 來操縱,並在網頁上畫出一些圖形,今天就是帶大家一起了解該如何繪製圖形,後續還會有其他的介紹,那讓我們開始吧!

新增 canvas 元素

首先我們在 body 內新增一個 canvas 元素,並給它 id 與寬高

// index.html

<body>
  <canvas id="mycanvas" width="600" height="600"></canvas>
</body>

也可以使用 css 設定,若用 css 設定則需另外用 javascript 來調整寬高
因為 css 調整的是可以看見的範圍,而 javascript 調整的是整張畫布的大小

/* style.css */

#mycanvas {
  width: 600px;
  height: 600px;
}
// javascript.js

const canvas = document.getElementById('mycanvas');
const ctx = canvas.getContext('2d');

// 直接設定像素
canvas.width = 600;
canvas.height = 600;

// 或是等同螢幕寬高
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

開始畫圖吧!

要繪製 canvas 我們必須使用 javascript 來操縱它,首先抓取元素,並將它設為 2d 圖形

// javascript.js

const canvas = document.getElementById('mycanvas');
const ctx = canvas.getContext('2d');

設定完成後就可以開始畫圖囉~

矩形

// 填滿顏色的矩形
ctx.fillRect(x, y, width, height)
// 空心的矩形
ctx.strokeRect(x, y, width, height)
// 清除矩形內的顏色
ctx.clearRect(x, y, width, height)

// 範例
ctx.fillRect(25,25,100,100);
ctx.clearRect(45,45,60,60);
ctx.strokeRect(50,50,50,50);

範例圖形
矩形範例

路徑繪圖

// 開啟繪圖
ctx.beginPath()
// 結束路徑
ctx.closePath()

// 移動畫筆
ctx.moveTo(x, y)
// 畫出線條
ctx.lineTo(x, y)

// 畫出邊框
ctx.stroke()
// 填滿路徑
ctx.fill()

// 範例
ctx.beginPath();
ctx.moveTo(75,50);
ctx.lineTo(100,75);
ctx.lineTo(100,25);
ctx.fill();

範例圖形
路徑繪圖範例

弧形

弧形的參數比較多,共有六個

arc(x, y, radius, startAngle, endAngle, anticlockwise)

此方法使用的是弧度不是角度,弧度的單位是 π,所以我們要先使用 javascript 將角度換算

// 1π 等於 180度
(Math.PI/180) * deg
  • x:圓心 x 座標
  • y:圓心 y 座標
  • radius:半徑
  • startAngle:起始點
  • endAngle:終點
  • anticlockwise:順時鐘為 false,逆時鐘為 true
// 範例
ctx.beginPath();
ctx.arc(75,75,50,0,Math.PI*2,true);
ctx.moveTo(110,75);
ctx.arc(75,75,35,0,Math.PI,false);
ctx.moveTo(65,65);
ctx.arc(60,65,5,0,Math.PI*2,true);
ctx.moveTo(95,65);
ctx.arc(90,65,5,0,Math.PI*2,true);
ctx.stroke();

範例圖形
弧形範例

貝茲曲線

貝茲曲線又更複雜些,分為二次與三次貝茲曲線,差異為由一個點控制或兩個點控制
https://ithelp.ithome.com.tw/upload/images/20190618/20115569t3GiNXO3pN.png

// 二次曲線
quadraticCurveTo(cp1x, cp1y, x, y)
// 三次曲線
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

// 二次曲線範例
ctx.beginPath();
ctx.moveTo(75,25);
ctx.quadraticCurveTo(25,25,25,62.5);
ctx.quadraticCurveTo(25,100,50,100);
ctx.quadraticCurveTo(50,120,30,125);
ctx.quadraticCurveTo(60,120,65,100);
ctx.quadraticCurveTo(125,100,125,62.5);
ctx.quadraticCurveTo(125,25,75,25);
ctx.stroke();

// 三次曲線範例
ctx.beginPath();
ctx.moveTo(75, 40);
ctx.bezierCurveTo(75, 37, 70, 25, 50, 25);
ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5);
ctx.bezierCurveTo(20, 80, 40, 102, 75, 120);
ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5);
ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25);
ctx.bezierCurveTo(85, 25, 75, 37, 75, 40);
ctx.stroke();

範例圖形
貝茲曲線範例

canvas 大部分就是用這些法來繪製
目前都是黑白的,之後要開始加上色彩與細部設定囉!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言