Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

HTML5 캔버스 변환(Transform) 완벽 가이드

HTML5 캔버스는 변환 행렬(transformation matrix)을 직접 수정할 수 있는 다양한 메서드를 제공합니다. 변환 행렬은 처음에 항등 변환(identity transform) 상태로 시작하며, 이후 변환 메서드를 사용해 원하는 형태로 조정할 수 있습니다.

주요 변환 메서드

캔버스에서 자주 사용되는 대표적인 변환 메서드는 다음과 같습니다.

  • translate(x, y) : 캔버스와 원점을 x축, y축 방향으로 이동합니다.
  • rotate(angle) : 지정한 각도(라디안)만큼 캔버스를 회전합니다.
  • scale(x, y) : x축과 y축 방향으로 크기를 확대하거나 축소합니다.
  • transform(a, b, c, d, e, f) : 현재 변환 행렬에 새로운 변환을 곱하여 적용합니다.
  • setTransform(a, b, c, d, e, f) : 기존 변환을 무시하고 변환 행렬을 새로 설정합니다.

예제

다음은 캔버스 변환을 활용한 실제 예제입니다. 12개의 사각형을 회전시키면서 점점 어두운 색으로 채우고, 마지막에는 setTransform으로 좌우 반전된 반투명 사각형을 그립니다.

<!DOCTYPE HTML>
<html>
   <head>
      <script>
         function drawShape(){
            // DOM을 통해 캔버스 요소 가져오기
            var canvas = document.getElementById('mycanvas');
            // 캔버스가 지원되지 않는 경우 실행하지 않도록 확인

            if (canvas.getContext){
               // getContext로 2D 드로잉 컨텍스트 사용
               var ctx = canvas.getContext('2d');
               var sin = Math.sin(Math.PI/6);
               var cos = Math.cos(Math.PI/6);
               ctx.translate(200, 200);
               var c = 0;

               for (var i=0; i <= 12; i++) {
                  c = Math.floor(255 / 12 * i);
                  ctx.fillStyle = "rgb(" + c + "," + c + "," + c + ")";
                  ctx.fillRect(0, 0, 100, 100);
                  ctx.transform(cos, sin, -sin, cos, 0, 0);
               }
               ctx.setTransform(-1, 0, 0, 1, 200, 200);
               ctx.fillStyle = "rgba(100, 100, 255, 0.5)";
               ctx.fillRect(50, 50, 100, 100);
            } else {
               alert('이 데모를 보려면 Safari 또는 Firefox 1.5+ 브라우저가 필요합니다.');
            }
         }
      </script>
   </head>
   <body onload = "drawShape();">
      <canvas id = "mycanvas" width = "400" height = "400"></canvas>
   </body>
</html>

코드 설명

위 예제의 핵심 동작 흐름은 다음과 같습니다.

  1. translate(200, 200)으로 원점을 캔버스 중앙으로 이동합니다.
  2. 반복문 안에서 transform(cos, sin, -sin, cos, 0, 0)을 호출해 매번 30도(Math.PI/6)씩 회전합니다.
  3. 각 단계마다 fillRect로 사각형을 그리며, 색상 값(c)을 점차 줄여 명도에 변화를 줍니다.
  4. 모든 사각형을 그린 후 setTransform(-1, 0, 0, 1, 200, 200)으로 변환 행렬을 초기화하면서 x축을 반전시킵니다.
  5. 마지막으로 반투명한 파란색 사각형을 덧그려 시각적 효과를 완성합니다.

이처럼 변환 행렬을 활용하면 회전, 이동, 확대·축소 등 복잡한 도형 변형을 손쉽게 구현할 수 있으며, 애니메이션이나 데이터 시각화 등 다양한 분야에서 응용할 수 있습니다.