๐ŸŽ‡ Op Art Style #01

BamgasiJMยท2025๋…„ 11์›” 21์ผ

p5.js Art

๋ชฉ๋ก ๋ณด๊ธฐ
28/65
post-thumbnail

๐Ÿ“ Circular

/**
์‚ฌ๊ฐํ˜•์ด ์›ํ˜• ๊ถค๋„๋ฅผ ๋”ฐ๋ผ์„œ ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ์ƒ์„ฑ. ํ‘๋ฐฑ ์ปฌ๋Ÿฌ ๊ต์ฐจํ•˜๋ฉด์„œ ์˜ต์•„ํŠธ. 
**/

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

/**
 * ์‚ฌ๊ฐํ˜•์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ๋‚ด๋ ค์˜ค๋ฉฐ ์‚ฌ์ธํŒŒ(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; // ๊ณก์„ ์˜ ํ๋ฆ„ ์†๋„
}

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0๊ฐœ์˜ ๋Œ“๊ธ€