HTML
의 <canvas>
엘리먼트를 활용해 그래픽을 구성하는 수단을 제공하는 Javascript
API이다.애니메이션, 게임 그래픽, 데이터 시각화, 사진 조작 및 실시간 비디오 처리를 위해 사용된다.
API를 활용하기 전에 간단한 사전 준비가 필요하다. HTML
문서에 <canvas>
태그를 적고, API를 활용할 js
을 연결한다.
<body>
<canvas></canvas>
<script src="app/js"></script>
</body>
app.js
에서는 canvas
엘리먼트를 획득 후 context()
를 연결한다.
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
canvas.width = 800;
canvas.height = 800;
canvas
의 너비와 높이는 800px
로 맞췄고, context는 평면 그림을 그릴 것이므로 "2d"를 선택했다.
getContext()
는 드로잉, 즉 붓을 반환한다고 생각하면 된다.
기본적으로 사각형을 그려보자.
ctx.fillRect(50, 50, 100, 100);
ctx.strokeRect(160, 50, 100, 100);
ctx.rect(270, 50, 100, 100);
ctx.fill();
ctx.beginPath();
ctx.rect(380, 50, 100, 100);
ctx.fillStyle = "red";
ctx.fill();
fillRect(x, y, w, h)
는 내부가 채워진 사각형을 그린다. x, y
는 시작점 좌표이고, w
는 가로 길이, h
는 세로 길이이다. strokeRect()
와 rect()
도 같은 아규먼트를 받는다.
시작점 좌표는 canvas
영역의 왼쪽 모서리로, 0부터 시작한다. 가로 800px
, 세로 800px
인 canvas
는 800 * 800 짜리 모눈종이를 생각하면 편하다.
strokeRect()
은 선만 있는 사각형을 그린다.
rect()
는 사각형을 그리지만 화면에 나타내는 옵션이 없는 상태다. fill()
이나 stroke()
함수로 화면에 나타낸다.
beginPath()
는 이전에 그리던 그림과 다른 경로를 구성할 때 사용한다. 예제에서 두 번째 fill()
이전에 fillStyle
을 "red"로 초기화했다. 만약 새 경로를 생성하지 않았다면 모든 사각형의 색상이 빨간색으로 칠해진다.
moveTo(x, y)
와 lineTo(x, y)
로 원하는 위치에 선을 그릴 수 있다.
ctx.moveTo(50, 50);
ctx.lineTo(150, 50);
ctx.lineTo(150, 150);
ctx.lineTo(50, 150);
ctx.strokeStyle = "red";
ctx.stroke();
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(50, 150);
ctx.strokeStyle = "blue";
ctx.stroke();
선의 시작은 moveTo()
로 설정한다. 이후 이어지는 선들은 lineTo()
로 그린다.
선으로 그려진 도형도 fill()
과 stroke()
옵션을 사용할 수 있다.
fill()
은 moveTo()
와 마지막 lineTo()
를 연결한 공간을 도형으로 취급해 채운다.
stroke()
는 선으로 나타낸다.
만약 선으로 도형을 완성하려면 마지막 lineTo()
를 시작점과 연결해야 뚫리지 않은 도형을 완성할 수 있다.
beginPath()
를 사용해 선마다 다른 색으로 설정할 수 있다.
ctx.arc(200, 50, 30, 0, 2 * Math.PI);
ctx.fill();
ctx.beginPath();
ctx.arc(250, 50, 30, 0, 1.5 * Math.PI);
ctx.fill();
원은 arc(x, y, radius, startAngle, endAngle)
로 그린다.
startAngle
과 endAngle
는 원을 어디서 그려 어디서 끝낼지 정한다.
w3schools
의 이미지를 보면 90도 위치가 0
이며 시계 방향으로 증가하는 것을 알 수 있다. startAngle
이 0
, endAngle
이 1.5 * Math.PI
라면 90도에서 시작해 상단에 끝난다. 출력의 오른쪽 원이 그 결과물이다. 이런 식으로 시작점과 끝점을 변경할 수 있다.
배운 걸 종합해 집과 사람을 그려봤다.
참고
Nomad Coders - 바닐라 JS로 그림 앱 만들기
MDN docs - Canvas API
W3Schools - arc() Method