여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. HTML Canvas - 선 그리기

HTML Canvas – 선 그리기

4일전 작성

HTML Canvas 선 그리기

HTML5 Canvas에서 선을 그리는 방법에 대해 알아본다.

직선 그리기

Canvas에서 직선을 그리려면 다음 메소드를 사용한다:

  • moveTo(x,y) – 선의 시작점을 정의한다
  • lineTo(x,y) – 선의 끝점을 정의한다

실제로 선이 그려지게 하려면 stroke() 메소드를 사용해야 한다.

예제: Canvas에 직선 그리기

다음 코드는 Canvas에 직선을 그리는 방법을 보여준다:

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">브라우저가 HTML5 Canvas를 지원하지 않습니다.</canvas>
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.moveTo(0, 0);ctx.lineTo(200, 100);ctx.stroke();</script>

위 예제의 실행 과정:

  1. moveTo(0,0): 선의 시작점을 캔버스의 왼쪽 상단 모서리로 이동한다
  2. lineTo(200,100): 선을 캔버스의 지점 (200,100)까지 그린다
  3. stroke(): 실제로 선을 그리는 메소드를 호출한다

여러 선 그리기

여러 선을 그리려면 moveTo()와 lineTo() 메소드를 반복해서 사용하면 된다.

예제: Canvas에 여러 선 그리기

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">브라우저가 HTML5 Canvas를 지원하지 않습니다.</canvas>
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.beginPath();ctx.moveTo(20, 20);ctx.lineTo(180, 20);ctx.stroke();ctx.beginPath();ctx.moveTo(20, 50);ctx.lineTo(180, 50);ctx.stroke();ctx.beginPath();ctx.moveTo(20, 80);ctx.lineTo(180, 80);ctx.stroke();</script>

선 스타일 설정

Canvas에서는 다양한 속성을 사용하여 선의 스타일을 변경할 수 있다.

선 색상 변경

strokeStyle 속성을 사용하여 선의 색상을 설정할 수 있다.

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">브라우저가 HTML5 Canvas를 지원하지 않습니다.</canvas>
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.strokeStyle = "#FF0000";ctx.moveTo(0, 0);ctx.lineTo(200, 100);ctx.stroke();</script>

선 두께 변경

lineWidth 속성을 사용하여 선의 두께를 설정할 수 있다.

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #d3d3d3;">
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.lineWidth = 10;ctx.moveTo(20, 20);ctx.lineTo(180, 80);ctx.stroke();</script>

선 끝부분 스타일 변경

lineCap 속성을 사용하여 선의 끝 부분 스타일을 설정할 수 있다. 가능한 값은 “butt”, “round”, “square”이다.

<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.lineWidth = 10;ctx.beginPath();ctx.lineCap = "butt";ctx.moveTo(20, 20);ctx.lineTo(180, 20);ctx.stroke();ctx.beginPath();ctx.lineCap = "round";ctx.moveTo(20, 60);ctx.lineTo(180, 60);ctx.stroke();ctx.beginPath();ctx.lineCap = "square";ctx.moveTo(20, 100);ctx.lineTo(180, 100);ctx.stroke();</script>

선 연결부 스타일 설정

lineJoin 속성을 사용하여 두 선이 만나는 지점의 스타일을 설정할 수 있다. 가능한 값은 “bevel”, “round”, “miter”이다.

<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.lineWidth = 10;ctx.beginPath();ctx.lineJoin = "miter";ctx.moveTo(20, 20);ctx.lineTo(100, 50);ctx.lineTo(20, 80);ctx.stroke();ctx.beginPath();ctx.lineJoin = "round";ctx.moveTo(120, 20);ctx.lineTo(200, 50);ctx.lineTo(120, 80);ctx.stroke();ctx.beginPath();ctx.lineJoin = "bevel";ctx.moveTo(220, 20);ctx.lineTo(300, 50);ctx.lineTo(220, 80);ctx.stroke();</script>

점선 그리기

setLineDash() 메소드와 lineDashOffset 속성을 사용하여 점선을 그릴 수 있다.

<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");ctx.beginPath();ctx.moveTo(20, 20);ctx.lineTo(280, 20);ctx.stroke();ctx.beginPath();ctx.setLineDash([10, 5]);ctx.moveTo(20, 50);ctx.lineTo(280, 50);ctx.stroke();ctx.beginPath();ctx.setLineDash([20, 5, 5, 5]);ctx.moveTo(20, 80);ctx.lineTo(280, 80);ctx.stroke();ctx.beginPath();ctx.setLineDash([]);ctx.moveTo(20, 110);ctx.lineTo(280, 110);ctx.stroke();</script>

그리드 그리기

다음 예제는 캔버스에 그리드를 그리는 방법을 보여준다. 이는 다양한 작업을 할 때 참조점으로 활용할 수 있다.

<canvas id="myCanvas" width="300" height="300" style="border:1px solid #d3d3d3;">
<script>var c = document.getElementById("myCanvas");var ctx = c.getContext("2d");var canvasWidth = c.width;var canvasHeight = c.height;var gridSize = 20;ctx.strokeStyle = "#ddd";ctx.lineWidth = 0.5;for (var x = 0; x <= canvasWidth; x += gridSize) {ctx.beginPath();ctx.moveTo(x, 0);ctx.lineTo(x, canvasHeight);ctx.stroke();}for (var y = 0; y <= canvasHeight; y += gridSize) {ctx.beginPath();ctx.moveTo(0, y);ctx.lineTo(canvasWidth, y);ctx.stroke();}ctx.strokeStyle = "#FF0000";ctx.lineWidth = 1;ctx.beginPath();ctx.moveTo(0, canvasHeight/2);ctx.lineTo(canvasWidth, canvasHeight/2);ctx.stroke();ctx.beginPath();ctx.moveTo(canvasWidth/2, 0);ctx.lineTo(canvasWidth/2, canvasHeight);ctx.stroke();</script>

💡 Canvas 선 그리기 팁:
• 복잡한 도형을 그릴 때는 beginPath()를 사용하여 각 선을 분리한다
• 최적화를 위해 여러 선을 한 번에 그리려면 path를 모두 정의한 후 마지막에 한 번만 stroke()를 호출한다
• 곡선이 필요하다면 arc(), bezierCurveTo(), quadraticCurveTo() 메소드를 사용할 수 있다

Canvas 선 그리기 속성 요약

속성/메소드 설명 가능한 값
moveTo(x,y) 선의 시작점을 설정한다 x좌표, y좌표
lineTo(x,y) 선의 끝점을 설정한다 x좌표, y좌표
stroke() 선을 실제로 그린다
beginPath() 새로운 경로를 시작한다
closePath() 현재 지점과 시작점을 연결하여 경로를 닫는다
strokeStyle 선의 색상이나 스타일을 설정한다 색상 이름, HEX, RGB, RGBA
lineWidth 선의 두께를 설정한다 픽셀 단위의 숫자
lineCap 선의 끝 모양을 설정한다 butt(기본값), round, square
lineJoin 선이 만나는 모서리 스타일을 설정한다 miter(기본값), round, bevel
setLineDash([a,b,…]) 선의 점선 패턴을 설정한다 숫자 배열 (선 길이와 간격)
lineDashOffset 점선 패턴의 오프셋을 설정한다 숫자

이 기본적인 선 그리기 기술을 마스터하면 복잡한 그래픽과 애니메이션을 Canvas에서 구현할 수 있다. 더 복잡한 형태는 이러한 기본 요소들을 조합하여 만들 수 있다.

참고
Mingg`s Diary
밍구
공부 목적 블로그