
/**
์ฌ๊ฐํ์ด ์ํ ๊ถค๋๋ฅผ ๋ฐ๋ผ์ ํ๋ ์ ๋จ์๋ก ์์ฑ. ํ๋ฐฑ ์ปฌ๋ฌ ๊ต์ฐจํ๋ฉด์ ์ต์ํธ.
**/
let angle = 0; // ํ์ฌ ๊ฐ๋ ๋ณ์
let radius = 400; // ์์ ๋ฐ์ง๋ฆ
let speed = 0.069; // ํ์ ์๋
function setup() {
createCanvas(800, 800);
background(15); // ํ ๋ฒ๋ง ๊ทธ๋ฆฌ๊ธฐ
rectMode(CENTER); // ์ฌ๊ฐํ์ ๊ธฐ์ค์ ์ ์ค์์ผ๋ก ์ค์
noStroke(); // ์ธ๊ณฝ์ ์์
}
function draw() {
// 1. ์บ๋ฒ์ค ์ค์ฌ ์ขํ
let centerX = width;
let centerY = height / 2;
// 2. ์ํ ๊ฒฝ๋ก ๊ณ์ฐ (Polar to Cartesian)
// x = r * cos(theta), y = r * sin(theta)
let x = centerX + cos(angle) * radius;
let y = centerY + sin(angle) * radius;
// 3. ๊ทธ๋ฆฌ๊ธฐ ์ํ ์ ์ฅ (push/pop ํจํด ์ฌ์ฉ)
push();
// ์์น ์ด๋ ๋ฐ ํ์
translate(x, y);
// ์ฌ๊ฐํ์ด ์งํ ๋ฐฉํฅ์ ๋ฐ๋ผ๋ณด๋๋ก ํ์ (์ ์ ๊ฐ๋)
// ์์ ๊ฒฝ์ฐ ํ์ฌ ๊ฐ๋(angle)์ 90๋(HALF_PI)๋ฅผ ๋ํ๊ฑฐ๋ ๋นผ๋ฉด ์งํ ๋ฐฉํฅ์ด ๋จ
rotate(angle);
// 4. ์์ ๊ต์ฐจ ๋ก์ง
if (frameCount % 2 === 0) {
fill(60, 200, 190);
} else {
fill(15);
}
// 5. ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
rect(0, 0, 600, 400);
pop(); // ๋ณํ ์ํ ๋ณต๊ตฌ
// 6. ๊ฐ๋ ์
๋ฐ์ดํธ (ํ ๋ฐํด 2*PI ๋๋ฉด ๋ฉ์ถ๊ฑฐ๋ ๊ณ์ ๋๊ฑฐ๋ ์ ํ)
angle += speed;
// (์ต์
) ํ ๋ฐํด ๋ค ๋๋ฉด ๋ฉ์ถ๊ณ ์ถ๋ค๋ฉด ์ฃผ์ ํด์
if (angle > TWO_PI) noLoop();
}

/**
* ์ฌ๊ฐํ์ด ์์์ ์๋๋ก ๋ด๋ ค์ค๋ฉฐ ์ฌ์ธํ(Sine Wave)๋ฅผ ๊ทธ๋ฆผ
*/
let yPos = 0; // Y์ถ ์์ ์์น
let angle = 0; // ์ฌ์ธํ ๊ณ์ฐ์ ์ํ ๊ฐ๋
let amplitude = 100; // ์งํญ (์ข์ฐ๋ก ํ๋ค๋ฆฌ๋ ํญ)
let frequency = 0.06; // ์ง๋์ (๊ณก์ ์ ์ด์ดํจ)
function setup() {
createCanvas(800, 800);
background(25); // ์ด๋์ด ํ์
rectMode(CENTER);
noStroke();
}
function draw() {
// ์บ๋ฒ์ค ์ธ๋ก๊ธธ์ด + alpha ๋๋จธ๋ก ๋ฒ์ด๋๋ฉด ๋ฉ์ถค
if (yPos > height + 400) {
noLoop();
return;
}
// 1. ์ขํ ๊ณ์ฐ
// X์ขํ๋ ์ฌ์ธ๊ฐ์ ๋ฐ๋ผ ์ข์ฐ๋ก ์ง๋
let x = width / 2 + sin(angle) * amplitude;
let y = yPos;
push();
translate(x, y);
// 2. ํ์ ๊ณ์ฐ (๋ฏธ๋ถ ๊ฐ๋
ํ์ฉ)
// ์ฌ์ธ ๊ณก์ ์ ์ ์ ๊ฐ๋๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ฝ์ฌ์ธ ๊ฐ์ ์ฌ์ฉํ๊ฑฐ๋,
// ์ด์ ์ขํ์์ ์ฐจ์ด๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ์ฝ์ฌ์ธ์ผ๋ก ๊ทผ์ฌํฉ๋๋ค.
// sin(x)์ ๋ฏธ๋ถ์ cos(x)์ด๋ฏ๋ก, ์ด๋ฅผ ์ด์ฉํด ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํฉ๋๋ค.
let rotationAngle = cos(angle) * 0.5; // 0.5์ ํ์ ๊ฐ๋ ์กฐ์ ๊ณ์
rotate(rotationAngle);
// 3. ์์ ๊ต์ฐจ
if (frameCount % 2 === 0) {
fill(60, 200, 190);
} else {
fill(25);
}
// 4. ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
rect(0, 0, 200, 200);
pop();
// 5. ๋ณ์ ์
๋ฐ์ดํธ
yPos += 2; // ์๋๋ก ๋ด๋ ค๊ฐ๋ ์๋
angle += frequency; // ๊ณก์ ์ ํ๋ฆ ์๋
}