-
Notifications
You must be signed in to change notification settings - Fork 7
๐ชต 4. Canvas ๋ง์คํฐ ํด๋์ค
- canvas๋ ํด๋ผ์ด์ธํธ ํ๊ฒฝ์ ๋ฐ๋ผ gpu ๊ฐ์์ด ๋ ์๋ ์๊ณ ์๋ ์๋ ์์ง๋ง, webGL์ ๊ธฐ๋ณธ์ ์ผ๋ก GPU์์ ๋ด๋นํฉ๋๋ค.
- canvas๋ ๊ฐ๋จํ ์๊ตฌ์ฌํญ ์๋น์ค์ 2D ๊ทธ๋ํฝ ๊ตฌํ์ ์ ํฉํ๊ณ , webGL์ ์ฃผ๋ก ๊ณ ์ฑ๋ฅ 3D ๊ทธ๋ํฝ๊ณผ ๋ณต์กํ ์ํธ์์ฉ์ ์ ํฉํฉ๋๋ค.
- WebGL์ ์ํธ์์ฉ ์ด๋ฒคํธ(๋ง์ฐ์ค ํด๋ฆญ ๋ฑ)์ ์ง์ ๊ตฌํํด์ค์ผํ๋ ๋ฐ๋ฉด canvas๋ ์ด๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
- ๋ด๋ถ ๋์ ํ๋ฆ
- PATH ์ ์ :
- vector ํํ์ path ์ ๋ณด๋ฅผ ์ผ์์ ์ผ๋ก ์ ์งํ๋ค. ํน์ ์์น์ ๋ฐฉํฅ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฒกํฐ ๋ฐฉ์์ผ๋ก ์ ์ฅํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น :
- fill, stroke, fillRect, strokeRect ๋ฑ์ ํธ์ถํ๋ฉด canvas๋ ๊ฐ๊ณ ์๋ vector ์ ๋ณด๋ฅผ ๋นํธ๋งต ์ด๋ฏธ์ง ํฝ์ ๋ฐ์ดํฐ๋ก ๋ณํ๋์ด, canvas์ ๋นํธ๋งต ๋ฒํผ์ ๊ทธ๋ ค์ง๋๋ค.
- ๊ทธ๋ฆฌ๊ธฐ ์ดํ :
- ์ด ์์ ๋ถํฐ ์ด๋ฏธ์ง๋ ๋นํธ๋งต ๋ฐ์ดํฐ๋ก ๋ค๋ฃจ์ด์ง๋ค. ํ๋ํ๊ฑฐ๋ ๋ณํํ ๊ฒฝ์ฐ ๋นํธ๋งต ์ด๋ฏธ์ง๋ก์ ์กฐ์๋ฉ๋๋ค.
- PATH ์ ์ :
- ๋ฐ์ํ์ผ ๊ฒฝ์ฐ ์บ๋ฒ์ค ํฌ๊ธฐ ์กฐ์
- ์บ๋ฒ์ค์ ๋ทฐํฌํธ ํฌ๊ธฐ๋ canvas ์๋ฆฌ๋จผํธ์ width, height ์์ฑ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
- css๋ก ์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ ๋๋ ค๋ ํด์๋๋ ๊ทธ๋๋ก์ด๊ธฐ ๋๋ฌธ์ ์ขํ๊ณ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
- ํ๋ฉด ํฌ๊ธฐ๊ฐ ๋ฐ๋ ๋ canvas๋ฅผ ์ฌ๋๋๋ง ํด์ฃผ๋๊ฐ, ์๋๋ฉด ์ขํ๊ณ๋ ํจ๊ป ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅํฉ๋๋ค.
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
ctx.fillStyle = "green";
ctx.fillRect(10, 10, 150, 100);
- document.getElementById๋ ์๋ฆฌ๋จผํธ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ป์ด์ต๋๋ค.
- canvas.getContext()๋ ์๋ฆฌ๋จผํธ์ ์ปจํ
์คํธ(๋ ๋๋ง ๋ ๊ทธ๋ฆฌ๊ธฐ ๋์)๋ฅผ ์ป์ต๋๋ค.
- โ2dโ ๋งค๊ฐ๋ณ์๋ก ํธ์ถํ๋ฉด โCanvasRenderingContext2Dโ ์ธํฐํ์ด์ค๋ฅผ ์ป๊ฒ ๋๋ฉฐ, ํด๋น ๊ฐ์ฒด๋ฅผ ํตํด ์ปจํ ์คํธ ์์ฑ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- 2d ๊ทธ๋ฆฌ๊ธฐ์ ํ์ํ ์ฌ๋ฌ๊ฐ์ง ๋๊ตฌ(๋ฉ์๋)๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์บ๋ฒ์ค์ ํฌ๊ธฐ๋ 300px * 150px ๊ฐ ๊ธฐ๋ณธ ํฌ๊ธฐ์ด๋ค. html์ width์ height ์์ฑ์ ๋ณ๊ฒฝํ์ฌ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
- explore 9 ์ดํ ๋ฒ์ ์ด๋ ํ ์คํธ ๊ธฐ๋ฐ ๋ธ๋ผ์ฐ์ ๋ฑ ์๋ ๋ธ๋ผ์ฐ์ ์์๋ canvas๋ฅผ ์ง์ํ์ง ์์ ์ ์์ผ๋ฏ๋ก, ์ด์ ๋ํ ํธํ์ฑ์ ๊ณ ๋ คํ๋ค๋ฉด canvas ๋์ฒด ์ปจํ ์ธ ๋ํ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ๋์ฒด ์ปจํ
์ธ ์ฝ์
์ ๋งค์ฐ ์ฝ๋ค. ์๋ ์ฝ๋์ ๊ฐ์ด canvas ํ๊ทธ ์์ ๋์ฒด ์ปจํ
์ธ ๋ฅผ ๋ฃ์ผ๋ฉด, canvas๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ ์ปจํ
์ด๋๋ฅผ ๋ฌด์ํ๊ณ ๊ทธ ์์ ๋ด๋ถ ์ฝํ
์ธ ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
- getContext() ๋ฉ์๋์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํด js ์ฝ๋์์ canvas ํ๊ทธ ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
- canvas xormsms ๋ซ๋ ํ๊ทธ๋ฅผ ๊ผญ ํ์๋ก ํ๋ค. ๋ซ๋ ํ๊ทธ๋ฅผ ์์ฑํ์ง ์๋๋ค๋ฉด ๋ฌธ์์ ๋๋จธ์ง ๋ถ๋ถ์ด ์ปจํ ์ธ ๋ก ๊ฐ์ฃผ๋์ด ๋ณด์ด์ง ์์ ์ ์์ต๋๋ค.
- getContext() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ๊ทธ๋ฆฌ๊ธฐ ํจ์๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ ๋๋ง ์ปจํ ์คํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- 2D ๊ทธ๋ํฝ์ ๊ธฐ๋ฅด๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์บ๋ฒ์ค ๋ด 1grid์ ๋จ์๋ 1px๊ณผ ๊ฐ์ต๋๋ค.
- ์์ ์ ์ข์ธก ์๋จ(0, 0)์ ๋๋ค.
- SVG์ ๋ค๋ฅด๊ฒ canvas๋ โ์ง์ฌ๊ฐํโ ๋ํ ๋ง์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ์ธ ๋ํ๋ค์ ๋ฌด์กฐ๊ฑด ํ๋ ํน์ ํ๋ ์ด์์ path์ ์ฌ๋ฌ ์ ์ผ๋ก ์ด์ด์ง ์ ์ผ๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
- fillRect(x, y, width, height) : ์์น ๋ ์ง์ฌ๊ฐํ์ ๊ทธ๋ฆฝ๋๋ค.
- strockRect(x, y, width, height) : ์ง์ฌ๊ฐํ ์ค๊ณฝ์ ์ ๊ทธ๋ฆฝ๋๋ค.
- clearRect(x, y, width, height) : ํน์ ๋ถ๋ถ์ ์ง์ฐ๋ ์ง์ฌ๊ฐํ์ด๋ฉฐ, ์ด ์ง์์ง ๋ถ๋ถ์ ์์ ํ ํฌ๋ช ํด์ง๋๋ค.
- rect(x, y, width, height) : ํ์ฌ ์ด๋ฆฐ path์ ์ง์ฌ๊ฐํ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- path(๊ฒฝ๋ก)๋ ์ ๋ค์ ์งํฉ์ด๋ค. ์ด ์ ๋ค์ ์งํฉ์ ๊ฐ๊ฐ์ด ์ฐ๊ฒฐ๋์ด ์ฌ๋ฌ๊ฐ์ง ๋ํ, ๊ณก์ , ๋๊ป, ์ , ์ ๋ฑ์ ๋ํ๋ด๊ฒ ๋ฉ๋๋ค.
- path ์์ฑ ์์๋ ์๋์ ๊ฐ์ต๋๋ค.
- ์บ๋ฒ์ค์ ๊ทธ๋ฆด path(๊ฒฝ๋ก)๋ฅผ ๋ง๋ญ๋๋ค.
- beginPath() : ์ path๋ฅผ ์์ฑํฉ๋๋ค.
- moveTo(x, y) : path์ ๊ทธ๋ฆฌ๊ธฐ ์ง์ ์ผ๋ก ์ด๋ํฉ๋๋ค.
- lineTo(x, y) : (x, y) ์ง์ ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
- closePath() : ํ์ฌ ํ์ ๊ฒฝ๋ก์ ์์ ๋ถ๋ถ๊ณผ ์ฐ๊ฒฐ๋ ์ง์ ์ ์ถ๊ฐํฉ๋๋ค.
- ๊ตฌ์ฑํ path๋ฅผ ๊ทธ๋ฆฝ๋๋ค. ๊ฒฝ๋ก๋ค์ด ์ค์ ๋ก ๊ทธ๋ ค์ง๊ธฐ ์ํด ๋ ๋๋ง ํ์ ์ฌ๋ผ๊ฐ๋๋ค.
- stroke() : ์ค๊ณฝ์ ์ ์ด์ฉํ์ฌ ๋ํ์ ๊ทธ๋ฆฝ๋๋ค.
- ํด๋น ๋ฉ์๋ ํธ์ถ ์์๋ โ์ โ์ ๊ทธ๋ฆฐ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, path๊ฐ ๋ซํ์ง ์์ต๋๋ค.
- fill() : path์ ๋ด๋ถ๋ฅผ ์ฑ์์ ๋ด๋ถ๊ฐ ์ฑ์์ง ๋ํ์ ๊ทธ๋ฆฝ๋๋ค.
- ํด๋น ๋ฉ์๋ ํธ์ถ ์ ๋ํ์ด ์๋์ผ๋ก ๋ซํ๊ฒ ๋์ด closePath()๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค. (stroke ๋ฉ์๋์๋ ์ ์ฉ๋์ง ์์)
- stroke() : ์ค๊ณฝ์ ์ ์ด์ฉํ์ฌ ๋ํ์ ๊ทธ๋ฆฝ๋๋ค.
- ์บ๋ฒ์ค์ ๊ทธ๋ฆด path(๊ฒฝ๋ก)๋ฅผ ๋ง๋ญ๋๋ค.
- path๋ ๋ํ์ ์ด๋ฃจ๋ โํ์ pathโ ๋ค์ ์งํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
beginpath
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ์ด ํ์ path ์งํฉ์ ์ด๊ธฐํ๋๊ณ , ์ ๋ํ์ ๊ทธ๋ฆด ์ ์๊ฒ ๋ฉ๋๋ค. - arc, arcTo ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ํธ๋ ์์ ๊ทธ๋ฆฌ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
- ๋๋ก์ ๋ช ๋ น์ ์บ๋ฒ์ค ๋ด์ ์บ์ํ๊ฑฐ๋ ๊ธฐ๋ก ๊ฐ๋ฅํฉ๋๋ค.
- new Path2D() ์์ฑ์๋ ์๋ก์ด Path2D ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ ํ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋(๋ณต์ฌ๋ณธ์ ์์ฑ), SVG ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ ๋ฐ์์ ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค.
new Path2D(); // empty path object
new Path2D(path); // copy from another Path2D object
new Path2D(d); // path from SVG path data
- ๋ชจ๋ path ๋ฉ์๋๋ Path2D ๊ฐ์ฒด์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- addPath ๋ฉ์๋๋ก ๊ฒฝ๋ก๋ฅผ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ๋ ๊ฐ๊ณ ์์ต๋๋ค. ์ฌ๋ฌ ์์๋ฅผ ์ฌ์ฉํ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- addPath(path [, transform]) : ์ต์ ์ผ๋ก ๋ณํ ํ๋ ฌ(transformation matrix)์ ์ฌ์ฉํ์ฌ ํ์ฌ ๊ฒฝ๋ก์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
function draw() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
var rectangle = new Path2D();
rectangle.rect(10, 10, 50, 50);
var circle = new Path2D();
circle.moveTo(125, 35);
circle.arc(100, 35, 25, 0, 2 * Math.PI);
ctx.stroke(rectangle);
ctx.fill(circle);
}
}
- SVG Path ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ SVG์ canvas์์ ๊ฒฝ๋ก ๋ช
๋ น์ ์ฌ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
var p = new Path2D("M10 10 h 80 v 80 h -80 Z");
Note
์บ๋ฒ์ค ์ ๋ด์ฉ์ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ๋ ์ ์ ๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ง์ฝ ์บ๋ฒ์ค๋ฅผ ์์ํ ๊พธ๋ฏธ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,<canvas>
์์ ํ๊ทธ์role="presentation"
์ ๋ฃ์ด์ค์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด ์บ๋ฒ์ค ์์์ ์ค๋ช ํ๋ ๋ด์ฉ์ aria-label ์์ฑ์ ๊ฐ์ผ๋ก ๋ฃ๊ฑฐ๋, ์บ๋ฒ์ค ํ๊ทธ ์์ ๋์ฒด ๋ด์ฉ์ ๋ฃ์ด์ผ ํฉ๋๋ค.
์บ๋ฒ์ค ์ ๋ด์ฉ์ DOM์ ์ผ๋ถ๊ฐ ์๋์ง๋ง, ์ค์ฒฉ ๋์ฒด ๋ด์ฉ์ DOM์ ์ผ๋ถ๊ฐ ๋ ์ ์์ต๋๋ค.
๋ํ์ ์์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ์๋ ๋ ๊ฐ์ง ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- fillStyle = color : ๋ํ์ ์ฑ์ฐ๋ ์์ ์ค์ .
- strokeStyle = color : ๋ํ์ ์ค๊ณฝ์ ์์ ์ค์ .
-
์ฌ๊ธฐ์ color๋ CSS์ , ๊ทธ๋ผ๋์ธํธ ๊ฐ์ฒด, ํจํด ๊ฐ์ฒด ๋ฑ์ด ๋ ์ ์์ต๋๋ค.
strokeStyle
ย ๋๋ยfillStyle
ย ์์ฑ์ ์ค์ ํ๋ฉด, ์๋ก ์ค์ ๋ ๊ฐ์ด ์์ผ๋ก ๊ทธ๋ ค์ง ๋ํ์ ๊ธฐ๋ณธ ๊ฐ์ด ๋ฉ๋๋ค. ๊ฐ ๋ํ์ ๋ค๋ฅธ ์์ ์ ์ฉํ๋ ค๋ฉดยfillStyle
ย ๋๋ยstrokeStyle
ย ์์ฑ์ ๋ค์ ์ ์ฉํด์ผ ํฉ๋๋ค.ctx.fillStyle = "orange"; ctx.fillStyle = "#FFA500"; ctx.fillStyle = "rgb(255, 165, 0)"; ctx.fillStyle = "rgba(255, 165, 0, 1)"; // ์ ํํ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
-
- globalAlpah : ๊ฐ์ ํฌ๋ช ๋์ ๋ํ ์ฌ๋ฌ๊ฐ๋ฅผ ๊ทธ๋ฆด ๋ ์ ์ฉํ๋ค. ํด๋น ๋ฉ์๋๋ก ํฌ๋ช ๋๋ฅผ ์ค์ ํ๋ฉด ์ดํ๋ถํฐ ๊ทธ๋ ค์ง๋ ๋ํ์ ๋ชจ๋ ์ค์ ํ ํฌ๋ช ๋๋ก ๊ทธ๋ ค์ง๋๋ค.
-
css rgba()
๋ฅผ ์ฌ์ฉํด ๊ฐ๋ณ ๋ํ์ ํฌ๋ช ๋ ์ ์ฉ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ ์ ๊ทธ๋ฆด ๋ bitmap ์ด๋ฏธ์ง์ ํน์ง์ผ๋ก ์ ์ด ํ๋ ค์ง๋ ํจ๊ณผ๋ฅผ ๋ฐฉ์งํ๊ณ ์ถ๋ค๋ฉด ์ ๋๊นจ๋ฅผ ์ง์๋ก ์ค์ .
- transformations์๋ ๊ทธ๋ฆฌ๋๋ฅผ ์์ ์์ ๋ค๋ฅธ ์์น๋ก ์ฎ๊ธฐ๊ณ , ํ์ ํ๊ณ , ํ๋ ๋ฐ ์ถ์๊น์ง ๊ฐ๋ฅํฉ๋๋ค.
- save() : canvas์ ๋ชจ๋ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค.
- restore() : ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ canvas ์ํ๋ฅผ ๋ณต์ํฉ๋๋ค.
- canvas ์ํ๋ ์คํ์ ์์ธ๋ค. save ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ๋ง๋ค ํ์ฌ drawing ์ํ๊ฐ ์คํ ์๋ก ํธ์๋๋ค. drawing ์ํ์ ์ข
๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- translate, rotate, scale ๋ฑ
- attribute ๊ฐ : strokeStyle, fillStyle, globalAlpha, lineWidth ๋ฑ
- ํ์ฌ์ clipping path
- ๋ํ ๊ทธ๋ฆฌ๊ธฐ๊ฐ ์๋ ๊ทธ ๋ํ์ ์์ฑ๊ฐ์ด ์ ์ฅ๋๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.fillRect(0, 0, 150, 150); // ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ์ฌ๊ฐํ์ ๊ทธ๋ฆฌ๊ธฐ
ctx.save(); // ๊ธฐ๋ณธ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ
ctx.fillStyle = "#09F"; // ์ค์ ๋ณ๊ฒฝํ๊ธฐ
ctx.fillRect(15, 15, 120, 120); // ์๋ก์ด ์ค์ ์ผ๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
ctx.save(); // ํ์ฌ ์ํ ์ ์ฅํ๊ธฐ
ctx.fillStyle = "#FFF"; // ์ค์ ๋ณ๊ฒฝํ๊ธฐ
ctx.globalAlpha = 0.5;
ctx.fillRect(30, 30, 90, 90); // ์๋ก์ด ์ค์ ์ผ๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
ctx.restore(); // ์ด์ ์ํ ๋ณต์ํ๊ธฐ
ctx.fillRect(45, 45, 60, 60); // ๋ณต์๋ ์ค์ ์ผ๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
ctx.restore(); // ์ด๊ธฐ ์ํ๋ฅผ ๋ณต์ํ๊ธฐ
ctx.fillRect(60, 60, 30, 30); // ๋ณต์๋ ์ค์ ์ผ๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
}
- translate(x, y)๋ ๊ทธ๋ฆฌ๋์์ canvas์ ์์ ์ ๋ณ๊ฒฝํฉ๋๋ค.
-
์ํ ์ ์ฅ๊ณผ ๋ณต์
๊ธฐ๋ฅ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค. ์์ ์ ์ด๋ํ ํ ๋ค์ (0, 0)์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ ๋ณด๋ค, ์ํ ์คํ์ ์ ์ฅ ํ ๋ค์ restoreํ๋ ๊ฒ ์ผ๋ฐ์ ์ผ๋ก ๊ฐํธํฉ๋๋ค.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
ctx.save();
ctx.fillStyle = "rgb(" + 51 * i + ", " + (255 - 51 * i) + ", 255)";
ctx.translate(10 + j * 50, 10 + i * 50);
ctx.fillRect(0, 0, 25, 25);
ctx.restore();
}
}
}
// ์ ์ฝ๋๋ ์ฌ๊ฐํ์ ์์น๋ฅผ ์ฎ๊ฒจ ๊ทธ๋ฆด ๋ ๋ง๋ค ์บ๋ฒ์ค ์์น๋ฅผ ์ฎ๊ฒผ๋ค๊ฐ ๋ค์ restore ํด์ค๋ค.
- Path2D ๊ฒฝ๋ก๋ฅผ ์๋ ๊ฒฝ๋ก๋ก ์ฌ์ฉํ ๋์๋, ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ข์ ๋ฏ ํฉ๋๋ค.
- ๊ฐ๋์ ๋จ์๋ ๋(degree)๊ฐ ์๋ ๋ผ๋์(radian)์
๋๋ค.
radians = (Math.PI/180)*degree
- ํ์ฌ ์์ ๊ธฐ์ค์ผ๋ก ํ์ ํฉ๋๋ค.
- canvas ๋จ์๋ฅผ ์ํ์ผ๋ก x๋งํผ, ์์ง์ผ๋ก y๋งํผ ํ๋ ๋ฐ ์ถ์ํฉ๋๋ค.
- ์์๋ฅผ ์ด์ฉํด ์ถ์ ๋์นญ ์ํฌ ์๋ ์์ต๋๋ค.
-
๋ณํ ํ๋ ฌ๋ก ๋ณ๊ฒฝํ ์ฌํญ์ ์ฆ์ ์ ์ฉํ ์ ์์ต๋๋ค.
-
๋ณ๊ฒฝ ์ฌํญ์ด ๋์ ๋์ด ๋ฐ์๋ฉ๋๋ค.
-
transform(a, b, c, d, e, f)
-
a (m11)
: ์ํ์ผ๋ก ํ๋ยท์ถ์ํ๊ธฐ -
*b (m12)
: ์ํ์ผ๋ก ๋น์ค๋ฌํ ๊ธฐ์ธ์ด๊ธฐ -
c (m21)
: ์์ง์ผ๋ก ๋น์ค๋ฌํ ๊ธฐ์ธ์ด๊ธฐ -
d (m22)
: ์์ง์ผ๋ก ํ๋ยท์ถ์ํ๊ธฐ -
e (dx)
: ์ํ์ผ๋ก ์ด๋ํ๊ธฐ -
f (dy)
: ์์ง์ผ๋ก ์ด๋ํ๊ธฐ -
setTransform (a, b, c, d, e, f) : ํ์ฌ์ ๋ณํ์ ์ ์ฒด ์ด๊ธฐํํ ํ ๋ช ์ํ ๋ณํ์ผ๋ก ๋ณํํฉ๋๋ค.
- ๋ด๋ถ ๋ก์ง์์ transform์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
-
๋ณํ ํ๋ ฌ ์ ๋ํด ๋ ์์ธํ ๊ณต๋ถํด์ผ ์ ํํ๊ฒ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- canvas์ ์๋ก ๊ทธ๋ ค์ง๋ ๋ํ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ ๋ํ ์์ ๊ทธ๋ ค์ง๋๋ค. ํ์ง๋ง
globalCompositeOperation
์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๊ท์น ์ธ์ ๋ค์ํ ๋ํ ํฉ์ฑ ๋ฐฉ์์ผ๋ก ๋ํ์ ์ด์ด ๊ทธ๋ฆด ์ ์์ต๋๋ค. - ๊ธฐ์กด ๋ํ ๋ค์ ๊ทธ๋ฆฌ๊ฑฐ๋, ๋ํ์ ์ผ์ ์์ญ์ ๊ฐ๋ ค ๋ณด์ด์ง ์๊ฒ ํ๊ฑฐ๋, ์บ๋ฒ์ค์ ํน์ ๋ถ๋ถ์ ์ง์ฐ๋ ๋ฑ์ ํจ๊ณผ๋ ์ป์ ์ ์์ต๋๋ค.
globalCompositeOperation = type
//๋ํ ํฉ์ฑ ๋ฐฉ๋ฒ์ ์ค์ ํ๋ค. 26์ข
๋ฅ์ ํฉ์ฑ ๋ฐฉ๋ฒ ์ค ์ ํ ๊ฐ๋ฅํ๋ค.
- ํํ ์ฌ์ฉํ๋ ํด๋ฆฌํ ๋ง์คํฌ ๊ธฐ๋ฅ์ ๋๋ค.
- clip() : ํ์ฌ ๊ทธ๋ ค์ง๋ path๋ฅผ ํด๋ฆฌํ ์์ญ์ผ๋ก ์ค์ ํฉ๋๋ค.
- path๋ฅผ ๋ซ๊ธฐ ์ํด closePath() ๋์ clip()์ ์ฌ์ฉํ๊ณ , ๊ฒฝ๋ก๋ฅผ ์ฑ์ฐ๊ฑฐ๋ ์ค๊ณฝ์ ์ ๋ง๋๋ ๋์ ํด๋ฆฌํ ๋ง์คํฌ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
- ์์์ ์ด๊ธฐ ์ค์ ๊ฐ์ด๊ธฐ๋ ํฉ๋๋ค. ์บ๋ฒ์ค๋ ์บ๋ฒ์ค ํฌ๊ธฐ์ ๋๊ฐ์ ํฌ๊ธฐ์ ์๋ผ๋ด๊ธฐ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๋๋ค.
- ์๋ผ๋ด๊ธฐ ๊ฒฝ๋ก๋ ๋ง์คํนํ ๋ํ์ ํ๋จ์ ๊ทธ๋ฆฝ๋๋ค.
- getImageData(x, y, width, height) : ์บ๋ฒ์ค ํน์ ์์ญ์ ํฝ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- putImageData(imageData, x, y) : tnwjdgks ImageData ๊ฐ์ฒด๋ฅผ ์บ๋ฒ์ค์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค.
- data ๋ฐฐ์ด : ImageData์ data ์์ฑ. ๊ฐ ํฝ์
์ RGBA ๊ฐ์ด 1์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ฅ๋ฉ๋๋ค.
-
data[i]
๋ ๋นจ๊ฐ์,data[i+1]
์ ์ด๋ก์,data[i+2]
๋ ํ๋์,data[i+3]
์ ์ํ(ํฌ๋ช ๋)
-
- ์๋๋ ํฝ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ๋ฐฑ ํ๋๋ฅผ ์ ์ฉํ๋ ์์ ์ ๋๋ค. (chat-gpt)
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// ์บ๋ฒ์ค์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ํ ํฝ์
์กฐ์ ์์
const img = new Image();
img.src = "path/to/your/image.jpg";
img.onload = () => {
ctx.drawImage(img, 0, 0);
// ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
// ๋ชจ๋ ํฝ์
์ ์ํํ๋ฉฐ ํ๋ฐฑ ํํฐ ์ ์ฉ
for (let i = 0; i < data.length; i += 4) {
const r = data[i]; // ๋นจ๊ฐ
const g = data[i + 1]; // ์ด๋ก
const b = data[i + 2]; // ํ๋
// RGB ํ๊ท ์ ๊ณ์ฐํด ํ๋ฐฑ์ผ๋ก ๋ณํ
const avg = (r + g + b) / 3;
data[i] = avg; // ๋นจ๊ฐ
data[i + 1] = avg; // ์ด๋ก
data[i + 2] = avg; // ํ๋
}
// ์์ ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์บ๋ฒ์ค์ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ
ctx.putImageData(imageData, 0, 0);
};
๋ฐ๋ณต์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ๋น๊ฐ์์ฉ ์บ๋ฒ์ค๋ฅผ ๋ง๋ค์ด, ๋ฏธ๋ฆฌ ๊ทธ๋ ค ๋ฃ์ด๋ผ.
- ์ดํ ํ์ํ ์๊ฐ์ ๋น๊ฐ์์ฉ ์บ๋ฒ์ค์ ์ด๋ฏธ์ง๋ฅผ ์ฃผ ์บ๋ฒ์ค์ ๊ทธ๋ ค๋ฃ์ด, ๋ถํ์ํ ๋ ๋๋ง ๋ฐ๋ณต์ ์ค์ผ ์ ์์ต๋๋ค.
myCanvas.offscreenCanvas = document.createElement("canvas");
myCanvas.offscreenCanvas.width = myCanvas.width;
myCanvas.offscreenCanvas.height = myCanvas.height;
myCanvas.getContext("2d").drawImage(myCanvas.offScreenCanvas, 0, 0);
ctx.drawImage(myImage, 0.3, 0.5);
- ์ ์ฒ๋ผ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆด ๊ฒฝ์ฐ, ์ํฐ ์จ๋ฆฌ์ด์ฑ(anti-aliasing) ํจ๊ณผ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์์ ์ถ๊ฐ ์ฐ์ฐ์ ์ํํฉ๋๋ค.
- drawImage()์์ ์ฆ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ์ง ๋ง๊ณ ๋ค์ํ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์คํ์คํฌ๋ฆฐ(offscreen) ์บ๋ฒ์ค๋ฅผ ํ์ฉํ๋ฉด ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์ต๋๋ค.
- ์บ๋ฒ์ค ์์์ ์ผ๋ถ ๋ํ์ ์์ฃผ ์ด๋ํ๊ฑฐ๋ ๋ณ๊ฒฝํด์ผํ์ง๋ง, ๋ค๋ฅธ ๋ํ์ ๊ณ ์ ์์น์ ๋จ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด ๋๋ ์บ๋ฒ์ค ๋ ์ด์ด๋ฅผ ๋๋๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
<div id="stage">
<canvas id="ui-layer" width="480" height="320"></canvas>
<canvas id="game-layer" width="480" height="320"></canvas>
<canvas id="background-layer" width="480" height="320"></canvas>
</div>
- = ์ ์ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์บ๋ฒ์ค ๋ท ์ชฝ์ CSS๋ก ์ธํ ํ๋ผ.
๊ทธ ์ธ ๋ค์ํ ์ต์ ํ ๋ฐฉ๋ฒ์ MDN ๋ฌธ์์์ ์ฝ์ด๋ณผ ์ ์๋ค.
- slack ํ์คํ ์ฑ๋ ์ถ์ฒ ๊ธ
- 1. ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ๋ฐ ํ๋ก์ ํธ ๋ฌธ์ํ
- 2. ์ค์๊ฐ ํต์
- 3. ์ธํ๋ผ ๋ฐ CI/CD
- 4. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด Canvas ๊ตฌํํ๊ธฐ
- 5. ์บ๋ฒ์ค ๋๊ธฐํ๋ฅผ ์ํ ์์ CRDT ๊ตฌํ๊ธฐ
-
6. ์ปดํฌ๋ํธ ํจํด๋ถํฐ ์น์์ผ๊น์ง, ํจ์จ์ ์ธ FE ์ค๊ณ
- ์ข์ ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ๊ฐ? + Headless Pattern
- ํจ์จ์ ์ธ UI ์ปดํฌ๋ํธ ์คํ์ผ๋ง: Tailwind CSS + cn.ts
- Tailwind CSS๋ก ๋์์ธ ์์คํ ๋ฐ UI ์ปดํฌ๋ํธ ์ธํ
- ์น์์ผ ํด๋ผ์ด์ธํธ ๊ตฌํ๊ธฐ: React ํ๊ฒฝ์์ ํจ์จ์ ์ธ ์น์์ผ ์ํคํ ์ฒ
- ์น์์ผ ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ถ์ ๋ฐ ๊ณต์
- 7. ํธ๋ฌ๋ธ ์ํ ๋ฐ ์ฑ๋ฅ/UX ๊ฐ์
- 1์ฃผ์ฐจ ๊ธฐ์ ๊ณต์
- 2์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- 3์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- 4์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- 5์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- WEEK 06 ์ฃผ๊ฐ ๊ณํ
- WEEK 06 ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- WEEK 06 ์ฃผ๊ฐ ํ๊ณ