Search
Duplicate

HTML ํƒœ๊ทธ: canvas

๊ฐ„๋‹จ์†Œ๊ฐœ
canvas ํƒœ๊ทธ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž
ํŒ”๋งŒ์ฝ”๋”ฉ๊ฒฝ ์ปจํŠธ๋ฆฌ๋ทฐํ„ฐ
ContributorNotionAccount
์ฃผ์ œ / ๋ถ„๋ฅ˜
HTML
Javascript
Scrap
ํƒœ๊ทธ
HTML
javascript
9 more properties
ย ์ œ๊ฐ€ ํ•„์š”ํ•ด์„œ ์ •๋ฆฌํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜๋Š” Canvas ๊ณต์‹ ํ•ธ๋“œ๋ถ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๊ผญ ํ•ธ๋“œ๋ถ์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ๋ฅผ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

<canvas>

์• ๋‹ˆ๋ฉ”์ด์…˜, ๊ฒŒ์ž„ ๊ทธ๋ž˜ํ”ฝ, ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”, ์‚ฌ์ง„ ์กฐ์ž‘, ์‹ค์‹œ๊ฐ„ ๋น„๋””์˜ค ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” HTML ์š”์†Œ์ด๋‹ค.
์ฃผ๋กœ 2D ๊ทธ๋ž˜ํ”ฝ์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ, WebGL๋˜ํ•œ ์ด <canvas>๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

<canvas> ์‚ฌ์šฉ๋ฒ•

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ HTML ๋ฌธ์„œ์— ์•„๋ž˜์˜ ํƒœ๊ทธ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
canvas๋Š” ์ผ๋ฐ˜์ ์ธ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์Šคํƒ€์ผ(CSS)์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
์ฆ‰, margin, background ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
ํ•˜์ง€๋งŒ ์บ”๋ฒ„์Šค ์œ„์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์—๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
๋Œ€์ฒด๋กœ JavaScript์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์บ”๋ฒ„์Šค ์œ„์˜ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฐ๋‹ค.
<canvas> ์†์„ฑ(attribute)
โ€ข
์†์„ฑ์œผ๋กœ๋Š” ๊ธ€๋กœ๋ฒŒHTML ์†์„ฑ(id, class ๋“ฑ)์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
width, height ์†์„ฑ์„ ํ†ตํ•ด ์บ”๋ฒ„์Šค์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์„ค์ •ํ•œ๋‹ค. โ†’ DOM ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. โ†’ ๊ธฐ๋ณธ๊ฐ’์€ width=300, height=150์ด๋‹ค.
<canvas id="canvas">๋Œ€์ฒด ์ฝ˜ํ…์ธ ๋Š” ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•œ๋‹ค</canvas>
JavaScript
๋ณต์‚ฌ
JavaScript
์ดํ›„, JavaScript ํŒŒ์ผ์—์„œ <canvas> ์ฐธ์กฐ๋ฅผ ์–ป๋Š”๋‹ค.
const canvas = document.querySelector("canvas");
JavaScript
๋ณต์‚ฌ
getContext ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ Œ๋”๋ง ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌํ•œ๋‹ค.
const ctx = boardCanvas.getContext('2d');
JavaScript
๋ณต์‚ฌ
์ธ์ž๋กœ โ€˜2dโ€™๋ฅผ ์ „๋‹ฌํ–ˆ์ง€๋งŒ ๊ทธ์™ธ์—๋„ webgl, webgl2 ๋“ฑ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ค€๋น„ํ•ด์•ผํ•˜๋Š” ์‚ฌํ•ญ์ด๊ณ , ์ด์ œ JavaScript๋ฅผ ํ†ตํ•ด ์บ”๋ฒ„์Šค๋ฅผ ๋งˆ์Œ๊ป ๊ทธ๋ ค๋ณด์ž.
๊ทธ๋ฆฌ๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์บ”๋ฒ„์Šค์˜ ๋„ˆ๋น„, ๋†’์ด ๋ณ€๊ฒฝ : width, height

์ฐธ๊ณ ๋กœ JavaScript๋กœ ์บ”๋ฒ„์Šค์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
// const canvas = document.querySelector("canvas"); // const context = canvas.getContext('2d'); canvas.width = 300; canvas.height = 300; // ๋˜๋Š” context.canvas.width = 300; context.canvas.height = 300;
JavaScript
๋ณต์‚ฌ
๋‘ ์ฝ”๋“œ์˜ ์ฐจ์ด์ ์€ ์—†๋‹ค.
๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ์„ค๋ช…์€ Canvas ํ•ธ๋“œ๋ถ์— ์ž˜ ๋‚˜์™€์žˆ์œผ๋‹ˆ ํ•„์š”ํ•  ๋•Œ ํ•ธ๋“œ๋ถ์„ ์ฐพ์•„๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
ํ•˜๋‚˜ํ•˜๋‚˜ ์ „๋ถ€ ์ •๋ฆฌํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ๋‹ค.
๋Œ€์‹  ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ canvas๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€ ๋ณด๊ธฐ๋กœ ํ•˜์ž.

์˜ˆ์‹œ. ๊ฝƒ ๊ทธ๋ฆฌ๊ธฐ

โ€ข
quadraticCurveTo ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.
โ€ข
๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ๋Š” degree๊ฐ€ ์•„๋‹ˆ๋ผ radian์ด๋‹ค. ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ํŽธ์˜์„ฑ์„ ์œ„ํ•˜์—ฌ RaToDeg ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.
๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
์šฐ์„  HTML ํŒŒ์ผ์—์„œ <canvas> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
<!-- HTML ํŒŒ์ผ --> <!DOCTYPE html> <html> <head> </head> <body> <canvas id="game-board" width="600" height="600"></canvas> <script src="practice.js"></script> </body> </html>
JavaScript
๋ณต์‚ฌ
๋‹ค์Œ, JSํŒŒ์ผ์—์„œ ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ฐจ๋ก€์ด๋‹ค. ๋จผ์ € ์ปจํ…์ŠคํŠธ๋ฅผ ์–ป์–ด์˜จ๋‹ค.
/* JS ํŒŒ์ผ */ // ์ปจํ…์ŠคํŠธ ์–ป์–ด์˜ค๊ธฐ const canvas = document.querySelector("canvas"); const context = canvas.getContext('2d');
JavaScript
๋ณต์‚ฌ
๊ฝƒ์˜ ์ค‘์‹ฌ์  ์ขŒํ‘œ๋Š” (150, 150)์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.
// ๊ฝƒ์˜ ์ค‘์‹ฌ์ด ๋  ์ขŒํ‘œ๊ฐ’ ๋ณ€์ˆ˜๋กœ ์ •์˜ let width_mid = 150; let height_mid = 150; const rad = 100;
JavaScript
๋ณต์‚ฌ
save ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ดˆ๊ธฐ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•ด๋†“๋Š”๋‹ค.
save๋Š” ํ˜„์žฌ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
๊ฐ€์žฅ ์ตœ๊ทผ์— ์ €์žฅํ•ด๋†“์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” restore ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.
// ์ดˆ๊ธฐ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•ด๋†“๋Š”๋‹ค. context.save();
JavaScript
๋ณต์‚ฌ
์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์€ ๋Œ€๋ถ€๋ถ„ ๋„(degree)๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ๋””์•ˆ(radian)์ด๋‹ค.
์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ radianโ†’degree๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€๋‹ค.
function RadToDeg(angle) { return angle * Math.PI / 180; }
JavaScript
๋ณต์‚ฌ
์ด์ œ ๊ฝƒ์žŽ์„ ํ•˜๋‚˜์”ฉ ๊ทธ๋ ค์•ผํ•œ๋‹ค.
1.
๋จผ์ € beginPath ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ ๋‹ค.
function drawPetal(ctx, rad, i) { ctx.beginPath(); // ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ์žฌ์„ค์ •ํ•œ๋‹ค.
JavaScript
๋ณต์‚ฌ
2.
setTransform() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด scale()๊ณผ translate()๋ฅผ ํ•œ๋ฒˆ์— ์ง€์ •ํ•œ๋‹ค.
ctx.setTransform(1, 0, 0, 1, width_mid, height_mid);
JavaScript
๋ณต์‚ฌ
์—ฌ๊ธฐ์—์„œ transform() ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ setTransform() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค. ์ผ๋‹จ, ์บ”๋ฒ„์Šค์˜ ๊ฐ ๊ฐœ์ฒด๋Š” ์ƒ์„ฑ๋  ๋•Œ โ€œcurrent transformation matrix(ํ˜„์žฌ ๋ณ€ํ™˜ ํ–‰๋ ฌ)โ€์ด๋ผ๋Š” ๊ฒƒ์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. โ€ป ์ž์„ธํ•œ ๋‚ด์šฉ์€ MDN ๋ฌธ์„œ๋ฅผ ํ™•์ธ transform() ๋ฉ”์„œ๋“œ์˜ ํŠน์ง•์€ ์ด์ „์˜ ์‚ฌ์šฉํ•œ transform ๋ฉ”์„œ๋“œ(ํ˜น์€ rotate, scale, translate ๋ฉ”์„œ๋“œ)์— ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์•ž์—์„œ ์ด๋ฏธ scale(2, 2);๋ฅผ ์ˆ˜ํ–‰ํ•œ ์ƒํƒœ๋ผ๋ฉด
์ด๋•Œ transform ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์บ”๋ฒ„์Šค์˜ ๋ฐฐ์œจ์„ 2๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ๋ฐฐ์œจ์€ 4๊ฐ€ ๋œ๋‹ค.
context.scale(2, 2); context.tranform(2, 0, 0, 2, 0, 0); // ์ด ๋ฐฐ์œจ์€ 4๊ฐ€ ๋œ๋‹ค.
JavaScript
๋ณต์‚ฌ
ํ•˜์ง€๋งŒ setTransform ๋ฉ”์„œ๋“œ๋Š” ์ด๋ฏธ ์บ”๋ฒ„์Šค๊ฐ€ ์–ด๋–ค ๋ณ€ํ˜•์ด ์žˆ์—ˆ๋“ ๊ฐ„์— ํ˜„์žฌ ๋ณ€ํ™˜ ํ–‰๋ ฌ์„ ์žฌ์ •์˜ํ•œ๋‹ค.
context.scale(2, 2); context.setTransform(2, 0, 0, 2, 0, 0); // ์ด ๋ฐฐ์œจ์€ 2๊ฐ€ ๋œ๋‹ค.
JavaScript
๋ณต์‚ฌ
๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ๋Š” setTransform ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.
3.
๊ฝƒ์žŽ์„ ํšŒ์ „์‹œํ‚ค๋ฉฐ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ rotate ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
ctx.rotate(RadToDeg(30) * i); // ํšŒ์ „์‹œํ‚จ๋‹ค.
JavaScript
๋ณต์‚ฌ
2์—์„œ setTransform ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๋ฐ”๋กœ ์ด ํšŒ์ „์„ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ rotate ๋ฉ”์„œ๋“œ๋Š” (0, 0)์„ ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.
์ฆ‰, ๊ฝƒ์˜ ์ค‘์‹ฌ์€ (150, 150)์ธ๋ฐ ๊ฝƒ์žŽ์€ (0, 0)์„ ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „์‹œํ‚ค๋ฉฐ ๊ทธ๋ ค์•ผํ•œ๋‹ค. ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.
๋•Œ๋ฌธ์— ์›์ ์„ ๊ฝƒ์˜ ์ค‘์‹ฌ์ธ (150, 150)์œผ๋กœ ์ด๋™์‹œ์ผœ์„œ, ์ƒˆ๋กœ์šด ์›์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฝƒ์žŽ์„ ํšŒ์ „์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์•ž์—์„œ setTransform์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
4.
quadraticCurveTo ๋ฉ”์„œ๋“œ๋Š” ๋ฒ ์ง€์–ด ๊ณก์„ (Bezier Curves)๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๋ฒ ์ง€์–ด ๊ณก์„ ์„ ๋งŒ๋“ค๊ณ (quadraticCurveTo ๋ฉ”์„œ๋“œ), ํˆฌ๋ช…๋„(globalAlpha ์†์„ฑ)์™€ ์ƒ‰์ƒ(fillStyle ์†์„ฑ)์„ ์„ ํƒํ•œ ํ›„ ํ•ด๋‹น ๊ณต๊ฐ„์„ ์ฑ„์šด๋‹ค. (fill ๋ฉ”์„œ๋“œ)
ctx.moveTo(0, 0); ctx.quadraticCurveTo(rad / 2, -(rad / 2), rad, 0); ctx.quadraticCurveTo(rad / 2, +(rad / 2), 0, 0); ctx.globalAlpha = "0.8"; ctx.fillStyle = "#6633CC"; ctx.fill(); ctx.restore();
JavaScript
๋ณต์‚ฌ
์ฐธ๊ณ ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์ด 2์ฐจ ๋ฒ ์ง€์–ด ๊ณก์„ ์— ํ•ด๋‹นํ•œ๋‹ค.
์ถœ์ฒ˜ : ์œ„ํ‚ค๋ฐฑ๊ณผ
๋‘ ๊ฐœ์˜ ๊ณก์„ ์„ ๊ทธ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”์„œ๋“œ๋Š” ๋‘๋ฒˆ ํ˜ธ์ถœํ–ˆ๊ณ , ์ƒ‰์„ ์ฑ„์›Œ์ฃผ์—ˆ๋‹ค.
globalAlpha ์†์„ฑ์€ ํˆฌ๋ช…๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งˆ์ง€๋ง‰์— restore() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ €์žฅํ•ด๋†“์€ ์ปจํ…์ŠคํŠธ๋กœ ๋ณต๊ตฌํ•˜์˜€๋‹ค.
์ฐธ๊ณ ๋กœ 2์ฐจ ๋ฒ ์ง€์–ด ๊ณก์„ ์€ quadraticCurveTo ๋ฉ”์„œ๋“œ๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ณ 
3์ฐจ ๋ฒ ์ง€์–ด ๊ณก์„ ์€ bezierCurveTo ๋ฉ”์„œ๋“œ๋กœ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
โ€ป ํ™”๋ฉด์— ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์ฃผ๋Š” fill ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ตฌ์„ฑํ•ด๋†“์€ ๊ฒƒ๋“ค(๋ฒ ์ง€์–ด ๊ณก์„ , ์ƒ‰์ƒ ๋“ฑ)์ด ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ •์ƒ์ด๋‹ค.
5.
๋งˆ์ง€๋ง‰์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฝƒ์žŽ 12์žฅ์„ ๊ทธ๋ฆฐ๋‹ค.
for (let i = 1; i <= 12; i++) drawPetal(context, rad, i);
JavaScript
๋ณต์‚ฌ
์ด๋ ‡๊ฒŒ canvas๋ฅผ ์ด์šฉํ•ด์„œ ๊ฝƒ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
์‚ฌ์‹ค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ์ด๋ฏ€๋กœ ๋ฆฌํŒฉํ† ๋ง์€ ํฌ๊ธฐํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
const canvas = document.querySelector("canvas"); const context = canvas.getContext('2d'); context.canvas.width = 300; context.canvas.height = 300; let width_mid = 150; let height_mid = 150; const rad = 100; context.save(); console.log(context.getTransform()); function RadToDeg(angle) { return angle * Math.PI / 180; } function drawPetal(ctx, rad, i) { ctx.beginPath(); ctx.scale(1, 1); ctx.setTransform(1, 0, 0, 1, width_mid, height_mid); console.log(ctx.getTransform()); ctx.rotate(RadToDeg(30) * i); ctx.moveTo(0, 0); ctx.quadraticCurveTo(rad / 2, -(rad / 2), rad, 0); ctx.quadraticCurveTo(rad / 2, +(rad / 2), 0, 0); ctx.globalAlpha = "0.8"; ctx.fillStyle = "#6633CC"; ctx.fill(); ctx.restore(); } for (let i = 1; i <= 12; i++) drawPetal(context, rad, i); context.restore();
JavaScript
๋ณต์‚ฌ
์ด ์™ธ์—๋„ lineTo, arc, arcTo, fillRect, fillText ๋“ฑ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•˜๊ณ  ์žฌ๋ฏธ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์ด ์žˆ๋‹ค. ๊ผญ ์‚ฌ์šฉํ•ด๋ณด์ž.
p.s. ์—ฌ๊ธฐ์—์„œ ์ข€ ๋” ์‘์šฉํ•˜๋ฉด, ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ๋“œ๋ž˜๊ทธํ•  ๋•Œ ์›€์ง์ด๊ฒŒ ํ•˜๋Š” ๋“ฑ ์• ๋‹ˆ๋ฉ”์ด์…˜๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.