canvas 태그를 이용한 그리기 튜토리얼 中 기본, 도형그리기
(https://developer.mozilla.org/en/Canvas_tutorial)

*** canvas 태그를 지원하는 chrome, FF 등의 브라우저로 테스트해 봐야 함 ***







1. 기본사용법

canvas 태그의 2d context를 얻어 fillStyle()을 이용하여 채우기 속성을 정하고 fillRect()로 사각형 그리기



<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>
window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');
       
        // 좌측 상단 빨간 사각형
        ctx.fillStyle = "rgb(255, 0, 0)";
        ctx.fillRect(
10, 10, 50, 50);
        // 우측 하단 파란 사각형 (반투명)
        ctx.fillStyle = "rgba(0, 0, 255, 0.5)";
        ctx.fillRect(
40, 40, 50, 50);
    }
    else
alert('canvas를 지원하지 않는 브라우저입니다.');
}

</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>











2-1. 사각형 그리기

fillRect() : 채움형태의 사각형 그리기
strokeRect() : 사각형 테두리 그리기
clearRect() : 사각형 범위만큼 삭제

가장 바깥에 채움형태의 빨간 사각형을 그리고, 내부에 작은 사각형 범위만큼을 지우고, 그 내부에 더 작은 사각형 테두리 그리기.

<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');
       
        // 빨간색 채움형태 사각형
        ctx.fillStyle = 'rgb(255, 0, 0)';       
        ctx.fillRect(10, 10, 80, 80);
        // 사각형 범위 지우기
        ctx.clearRect(20, 20, 60, 60);
        // 사각형 테두리
        ctx.strokeRect(30, 30, 40, 40);
    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}
</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>









2-2. drawing paths

drawing paths를 통해 도형을 그리려면 아래의 과정을 거쳐야 한다.

1) beginPath() : 새로운 도형을 그리기 위한 초기화
2) 어쩌구 저쩌구 해서 막 그린다
3) closePath() : 현재 위치에서 시작위치까지 직선을 그어 도형을 완성하는 함수. 도형이 이미 완성되어 있거나 위치가 하나 밖에 없다면 아무것도 하지 않음. (optional step)
4) stroke(and/or)fill : stroke는 도형의 테두리를 그리고, fill은 도형의 내부를 색으로 채움. (만약 fill method를 호출해서 도형을 그렸다면 자동으로 도형이 닫히므로 closePath()를 호출할 필요가 없다)

 

2-2-1. moveTo
  - 아무것도 그리지 않으면서 위치만 이동시키는 함수.

moveTo, arc를 이용하여 얼굴 그리기

<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');
       
        ctx.beginPath();  
        // (동그라미) 50:50을 기준으로 반지름 40짜리 원을 그림
        ctx.arc(50,50,40,0,Math.PI*2,true);
        ctx.moveTo(80,50); // 좌표이동
        // (입) 50:50을 기준으로 반지름 30짜리 반원을 그림 (반시계 방향으로)
        ctx.arc(50,50,30,0,Math.PI,false);
        ctx.moveTo(40,35); // 좌표이동
        // (왼쪽 눈) 35:35를 기준으로 반지름 4짜리 원을 그림
        ctx.arc(35,35,4,0,Math.PI*2,true);
        ctx.moveTo(70,35); // 좌표이동
        // (오른쪽 눈) 65:35를 기준으로 반지름 4짜리 원을 그림
        ctx.arc(65,35,4,0,Math.PI*2,true);
        // 그린 도형들의 테두리를 그림
        ctx.stroke();
    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}
</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>







2-2-2. lineTo
  - 현재 위치에서 x:y까지의 직선을 그림

좌상단에 채움 삼각형, 우하단에 테두리 삼각형 그리기



<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');
       
        // 그리기 시작
        ctx.beginPath();  
        ctx.moveTo(10,10);
        ctx.lineTo(80,10);
        ctx.lineTo(10,80);
        // 도형 채우기
        ctx.fill();

        // 그리기 시작
        ctx.beginPath();
        ctx.moveTo(90,90);
        ctx.lineTo(20,90);
        ctx.lineTo(90,20);
        // 시작점까지 선을 그어 도형닫기(완성)
        ctx.closePath();
        // 도형 테두리 그리기
        ctx.stroke();
    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}
</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>









2-2-3. arc (x, y, radius, startAngle, endAngle, anticlockwise)
  - 원을 그림

미키마우스(귀+얼굴+몸통...-_-;;;;) 그리기. 상상력이 좋아야 함...



<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');
       
        // 왼쪽 귀
        ctx.beginPath();
        ctx.arc(25,25,15,0,Math.PI*2,true);
        ctx.fill();
        // 오른쪽 귀
        ctx.beginPath();
        ctx.arc(75,25,15,0,Math.PI*2,true);
        ctx.stroke();
        // 얼굴       
        ctx.beginPath();
        ctx.arc(50,50,25,0,Math.PI*2,true);
        ctx.fill();
        // 몸통
        ctx.beginPath();
        ctx.arc(50,155,80,0,Math.PI*2,true);
        ctx.stroke();
    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}

</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>






2-2-4. quadratic and bezier curves (이차곡선, 베지어 곡선)
  - 이차곡선, 베지어 곡선 그리기
  quadraticCurveTo(cp1x, cp1y, x, y);
  bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);

2-2-4-1. 이차곡선 예제 (양쪽 뿔 그리는 부분이 이차곡선)



<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');
       
        // 얼굴
        ctx.beginPath();
        ctx.arc(50,50,25,0,Math.PI*2,true);
        ctx.stroke();

        // 왼쪽뿔
        ctx.beginPath();
        ctx.moveTo(35,30);
        ctx.quadraticCurveTo(24,18,25,0);
        ctx.moveTo(30,34);
        ctx.quadraticCurveTo(20,25,25,0);
        ctx.stroke();

        // 오른쪽 뿔
        ctx.beginPath();
        ctx.moveTo(65,30);
        ctx.quadraticCurveTo(74,18,75,0);
        ctx.moveTo(70,34);
        ctx.quadraticCurveTo(78,25,75,0);
        ctx.stroke();

        // 눈
        ctx.beginPath();
        ctx.arc(40,45,3,0,Math.PI*2,true);
        ctx.arc(60,45,3,0,Math.PI*2,true);
        ctx.fill();

        // 입
        ctx.beginPath();
        ctx.arc(50,55,10,0,Math.PI,false);
        ctx.stroke();

    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}
</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>







2-2-4-2. 베지어 곡선 예제 (유사 나이키 마크. 귀찮아서 발로 했음...)



<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');

        ctx.beginPath();
        ctx.moveTo(25,35);
        ctx.bezierCurveTo(10,85,20,85,90,10);
        ctx.moveTo(25,35);
        ctx.bezierCurveTo(20,65,30,65,90,10);
        ctx.stroke();

    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}

</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>





2-2-5. 사각형 그리기 
  rect(x, y, w, h)
  - fillRect(), strokeRect() 등이 있지만 기본적으로 사각형을 그리는 함수

그냥 의미없는 위치, 크기 증가...



<!DOCTYPE HTML>
<HTML>

<HEAD>
<script>

window.onload=function() {
    var cnvs = document.getElementById("cnvs");
    if (cnvs.getContext) {
        var ctx = cnvs.getContext('2d');

        var i=j=pos=size=1;
        while (i<=20) {
            pos  = 10+((i-1)*3);
            size = 10+i;

            ctx.beginPath();
            ctx.rect(pos,pos,size,size);

            if (i%2==0) ctx.fill();
            else        ctx.stroke();

            ++i;
        }
    }
    else alert('canvas를 지원하지 않는 브라우저입니다.');
}

</script>
</HEAD>

<BODY>
<canvas id="cnvs" width="100" height="100" style="background-color: ghostwhite; border: 1px solid black;"></canvas>
</BODY>
</HTML>








 

Posted by bloodguy
,