


// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ ์ญ ๋ณ์ ์ ์ธ (๋ชจ๋ ํจ์์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ค์ ๊ฐ)
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
let numConcentric = 20; // ๋์ฌ์ ๊ฐ์: 20๊ฐ
let numRays = 60; // ๋ฐฉ์ฌํ ์ ๊ฐ์: 60๊ฐ
let maxRadius; // ์ต๋ ๋ฐ์ง๋ฆ ๋ณ์ ์ค์ . setup()์์ ์ค์ ๊ฐ ํ ๋น.
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// setup(): p5.js์ ์ด๊ธฐํ ํจ์. ํ๋ก๊ทธ๋จ ์์ ์ ๋ฑ ํ ๋ฒ ์คํ๋จ.
// โ ๋ชจ๋ ๊ทธ๋ฆผ์ ์ฌ๊ธฐ์ ํ ๋ฒ๋ง ๊ทธ๋ฆฝ๋๋ค.
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
function setup() {
// ์บ๋ฒ์ค ํฌ๊ธฐ ์ค์ : ๊ฐ๋ก 1080px ร ์ธ๋ก 1080px (์ ์ฌ๊ฐํ)
createCanvas(1080, 1080);
// ์ต๋ ๋ฐ์ง๋ฆ ๊ณ์ฐ: ์บ๋ฒ์ค ๊ฐ๋ก ๋๋น(width)์ 45% โ ์ฌ๋ฐฑ ํ๋ณด (10%๋ ํ
๋๋ฆฌ ๊ณต๊ฐ)
// ์: width=1080 โ maxRadius = 1080 ร 0.45 = 486px
maxRadius = width * 0.45;
// ์บ๋ฒ์ค ์ค์ฌ ์ขํ โ ๋ฐ๋ณต ์ฌ์ฉ๋๋ฏ๋ก ๋ณ์๋ก ์ ์ฅ (์ฝ๋ ๊ฐ๋
์ฑ โ, ์ฑ๋ฅ โ)
let cx = width / 2; // ์ค์ฌ x = 1080 / 2 = 540
let cy = height / 2; // ์ค์ฌ y = 1080 / 2 = 540
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ๋ฐฐ๊ฒฝ์ ์ค์ : RGB + Alpha (ํฌ๋ช
๋)
// (40, 30, 40) โ ์ง์ ๋ณด๋ผ-๋จ์ ๊ณ์ด, alpha ์์ โ ์์ ๋ถํฌ๋ช
// โ ์ ์ฒด ์บ๋ฒ์ค๋ฅผ ์ด ์์ผ๋ก ์ฑ์
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
background(40, 30, 40);
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ๋์ฌ์ ๊ทธ๋ฆฌ๊ธฐ
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ๋ํ ๋ด๋ถ๋ฅผ ์น ํ์ง ์์ (์ ํ
๋๋ฆฌ๋ง)
noFill();
// ์ ์์: (R=100, G=90, B=100) โ ํ์ ๊ณ์ด์ ์ฐ๋ณด๋ผ, alpha=180 โ ์ฝ๊ฐ ๋ฐํฌ๋ช
stroke(100, 90, 100, 180);
// ์ ๋๊ป: 0.5px
strokeWeight(0.5);
// ๋์ฌ์ 20๊ฐ ๋ฐ๋ณต ์์ฑ: i = 1 ~ 20
for (let i = 1; i <= numConcentric; i++) {
// map(๊ฐ, ์ต์์
๋ ฅ, ์ต๋์
๋ ฅ, ์ต์์ถ๋ ฅ, ์ต๋์ถ๋ ฅ):
// i๊ฐ 1 โ r = 20px, i๊ฐ 20 โ r = maxRadius(=486px)๊ฐ ๋๋๋ก ๋น์จ ๋ณํ
// โ ์์ ์๋ถํฐ ํฐ ์๊น์ง ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฐ์น
let r = map(i, 1, numConcentric, 20, maxRadius);
// circle(์ค์ฌx, ์ค์ฌy, ์ง๋ฆ) โ ๋ฐ์ง๋ฆ(r)์ 2๋ฐฐ๋ฅผ ์ง๋ฆ์ผ๋ก ์ ๋ฌ
// (p5.js์ circle ํจ์๋ ์ง๋ฆ(diameter)์ ๋ฐ์, ๋ฐ์ง๋ฆ(radius) ์๋!)
circle(cx, cy, r * 2);
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ค์ฌ๋ถ ๊ฐ์กฐํ๋ ์
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ๋ํ ๋ด๋ถ๋ฅผ ์น ํ์ง ์์ (์ ํ
๋๋ฆฌ๋ง)
noFill();
// ํฐ์ ๊ณ์ด, alpha=120
stroke(255, 255, 255, 120);
// ์ ๋๊ป๋ฅผ 1.5px๋ก ์ฝ๊ฐ ๊ฐ์กฐ
strokeWeight(1.5);
// ๊ณ ์ ๋ ํฌ๊ธฐ(์ง๋ฆ 60px)์ ์์ ์ค์ฌ์ ๊ทธ๋ฆผ
// โ ๋ฐ์ง๋ฆ 30px, ์ฆ ์ค์ฌ์์ 30px ์ด๋ด๋ ๋น์๋ (๋ค๋ฅธ ์์์ ๊ฒน์นจ ๋ฐฉ์ง)
circle(cx, cy, 60);
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ๋ฐฉ์ฌํ ์ (rays)๊ณผ ๊ทธ ์์ ์ (circles) ๊ทธ๋ฆฌ๊ธฐ
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ ๊ฐ์(numRays=60)๋งํผ ๋ฐ๋ณต
for (let i = 0; i < numRays; i++) {
// ํ์ฌ ์ ์ ๊ธฐ์ค ๊ฐ๋ ๊ณ์ฐ:
// i=0 โ 0 rad (โ 0ยฐ), i=59 โ ์ฝ 6.18 rad (โ 354ยฐ), i=60์ด๋ฉด 2ฯ(360ยฐ)
// map(i, 0, 60, 0, TWO_PI) โ 60๋ฑ๋ถ๋ ์ํ ๋ฐฐ์ด
let baseAngle = map(i, 0, numRays, 0, TWO_PI);
// ์ด ์ ์ ์ ์ฒด ๊ธธ์ด: 30px(์ค์ฌ ์ ํ
๋๋ฆฌ ๋ฐ๊นฅ) ~ maxRadius(486px) ์ฌ์ด ๋๋ค
// โ ์ค์ฌ์ ๊ฒน์น์ง ์๊ณ , ์บ๋ฒ์ค ๋ฐ์ผ๋ก ๋๊ฐ์ง๋ ์์
let len = random(30, maxRadius);
// ์ ์ ๋์ ์ขํ ๊ณ์ฐ (์ผ๊ฐํจ์: x = cosฮธ * r, y = sinฮธ * r)
let x2 = cx + cos(baseAngle) * len;
let y2 = cy + sin(baseAngle) * len;
// โโโโโ ์ ๊ทธ๋ฆฌ๊ธฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ ์์: (200,200,220), alpha=150
stroke(200, 200, 220, 150);
// ์ค์ฌ(cx,cy)์์ ๋์ (x2,y2)๊น์ง ์ง์ ๊ทธ๋ฆฌ๊ธฐ
line(cx, cy, x2, y2);
// โโโโโ ์ ์์ ์ (circles) ๊ทธ๋ฆฌ๊ธฐ โโโโโโโโโโโโโโโโโโโโโโโ
// ์ด ์ ์์ ๊ทธ๋ฆด ์ ๊ฐ์: 3~7๊ฐ ์ฌ์ด ๋๋ค (int()๋ก ์์์ ๋ฒ๋ฆผ โ 3,4,5,6,7)
let steps = int(random(3, 8));
// ์ ์๋ ์ ํ
๋๋ฆฌ๋ฅผ ๊ทธ๋ฆฌ์ง ์์ (์ฑ์ฐ๊ธฐ๋ง)
noStroke();
// ์ ์ ์ ์์ ๊ท ๋ฑํ ๋ฐฐ์น: j = 1 ~ steps
for (let j = 1; j <= steps; j++) {
// t = j / (steps + 1):
// ์: steps=4 โ t = 1/5, 2/5, 3/5, 4/5 โ ์ ์ 20%, 40%, 60%, 80% ์ง์
// โ ์์์ (0)๊ณผ ๋์ (1)์ ๊ฑด๋๋ฐ์ด ์ค์ฌ/๋์ ๊ฒน์น์ง ์์
let t = j / (steps + 1);
// ์ค์ฌ์ผ๋ก๋ถํฐ์ ์ค์ ๊ฑฐ๋ฆฌ = ์ ์ฒด ๊ธธ์ด(len) ร ๋น์จ(t)
let distance = len * t;
// โ ๏ธ ์ค์ฌ์์ 30px ์ด๋ด๋ ๊ฑด๋๋ โ ์ค์ฌ ๊ฐ์กฐ ์๊ณผ ๊ฒน์น์ง ์๊ฒ
if (distance < 30) continue;
// ์ ์ ํฌ๊ธฐ: ์ง๋ฆ 2~8px ์ฌ์ด ๋๋ค
let size = random(2, 8);
// ์ ์ ์์:
// random(100) โ 0~100 ์ฌ์ด ๋์, 85๋ณด๋ค ํฌ๋ฉด(15% ํ๋ฅ ) ๋ฐ๋ปํ ๋
ธ๋์,
// ์๋๋ฉด(85% ํ๋ฅ ) ํฐ์ ๊ณ์ด
let col =
random(100) > 85
? color(220, 180, 80, 200) // ๋
ธ๋์: R=220, G=180, B=80, alpha=200
: color(240, 240, 240, 180); // ๊ฑฐ์ ํฐ์, alpha=180
// ์ ์ ์ ๋ ์ขํ ๊ณ์ฐ (์ค์ฌ + ๋ฐฉํฅร๊ฑฐ๋ฆฌ)
let px = cx + cos(baseAngle) * distance;
let py = cy + sin(baseAngle) * distance;
// ์ ์์ ์ ์ฉ
fill(col);
// ์ ๊ทธ๋ฆฌ๊ธฐ: circle(์ค์ฌx, ์ค์ฌy, ์ง๋ฆ)
circle(px, py, size);
}
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ฃผ์ ํด์ ์ ์คํํ๋ฉด ํ์ผ ์ ์ฅ
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// save("infographic_style_01.png");
}
function draw() {
// ์ด ํจ์๊ฐ ๋น์ด ์์ผ๋ฏ๋ก, setup()์์ ๊ทธ๋ฆฐ ์ด๋ฏธ์ง๊ฐ ๊ณ ์ ๋์ด ์ ์ง๋จ.
// ์ ๋๋ฉ์ด์
์์, CPU ๋ถํ ์์, ์์ ํ ์ ์ง ํ๋ฉด.
}
let numConcentric = 20;
let numRays = 60;
let maxRadius;
let rotationAngle = 0;
let rayData = []; // ๊ฐ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
function setup() {
createCanvas(1080, 1080);
maxRadius = width * 0.45;
// ๊ฐ ์ ์ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ ์์ฑ
for (let i = 0; i < numRays; i++) {
let baseAngle = map(i, 0, numRays, 0, TWO_PI);
let len = random(30, maxRadius);
// ์ด ์ ์์ ๊ทธ๋ ค์ง ์๋ค์ ์ ๋ณด
let circles = [];
let steps = int(random(3, 8));
for (let j = 1; j <= steps; j++) {
let t = j / (steps + 1);
let distance = len * t; // ์ค์ฌ์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ
// ์ค์ฌ์์ 30px ์ด๋ด๋ฉด ์ ์ธ
if (distance < 30) continue;
circles.push({
distance: distance,
size: random(2, 8),
color:
random(100) > 85
? color(220, 180, 80, 200)
: color(240, 240, 240, 180),
});
}
rayData.push({
baseAngle: baseAngle,
length: len,
circles: circles,
});
}
}
function draw() {
background(40, 30, 40);
// ๋์ฌ์ ๊ทธ๋ฆฌ๊ธฐ
noFill();
stroke(100, 90, 100, 180);
strokeWeight(0.5);
for (let i = 1; i <= numConcentric; i++) {
let r = map(i, 1, numConcentric, 20, maxRadius);
circle(width / 2, height / 2, r * 2);
}
// ์ค์ฌ๋ถ ๊ฐ์กฐ
noFill();
stroke(255, 255, 255, 100);
strokeWeight(1.5);
circle(width / 2, height / 2, 60);
// ํ์ ๊ฐ๋ ์
๋ฐ์ดํธ
rotationAngle = (millis() * 0.05) / 1000;
let cx = width / 2;
let cy = height / 2;
// ์ ์ฅ๋ ๋ฐ์ดํฐ๋ก ์ ๊ณผ ์ ๊ทธ๋ฆฌ๊ธฐ
for (let ray of rayData) {
let angle = ray.baseAngle + rotationAngle;
// ์ ๋์ ๊ณ์ฐ
let x2 = cx + cos(angle) * ray.length;
let y2 = cy + sin(angle) * ray.length;
// ์ ๊ทธ๋ฆฌ๊ธฐ
stroke(200, 200, 220, 150);
line(cx, cy, x2, y2);
// ์๋ค ๊ทธ๋ฆฌ๊ธฐ
noStroke();
for (let c of ray.circles) {
let px = cx + cos(angle) * c.distance;
let py = cy + sin(angle) * c.distance;
fill(c.color);
circle(px, py, c.size);
}
}
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ์ ์ญ ์์ ๋ฐ ๋ณ์ ์ ์ธ
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
const NUM_RAYS = 60;
const NUM_CONCENTRIC = 20;
const ROTATION_SPEED = 0.0002;
let MAX_RADIUS;
let rays = [];
let concentricCircles;
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// ConcentricCircles ํด๋์ค ์ ์
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class ConcentricCircles {
constructor(numCircles, maxRadius) {
this.numCircles = numCircles;
this.maxRadius = maxRadius;
}
draw(centerX, centerY) {
noFill();
for (let i = 1; i <= this.numCircles; i++) {
const radius = map(i, 1, this.numCircles, 20, this.maxRadius);
const alpha = map(i, 1, this.numCircles, 150, 180);
stroke(100, 90, 100, alpha);
strokeWeight(0.5);
ellipse(centerX, centerY, radius * 2, radius * 2);
}
stroke(255, 255, 255, 100);
strokeWeight(1.5);
ellipse(centerX, centerY, 60, 60);
}
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// Ray ํด๋์ค ์ ์
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
class Ray {
constructor(baseAngle, maxRadius) {
this.baseAngle = baseAngle;
this.length = random(30, maxRadius);
this.dots = this._createDots();
}
_createDots() {
const dots = [];
const steps = int(random(3, 8));
for (let j = 1; j <= steps; j++) {
const t = j / (steps + 1);
const distance = this.length * t;
if (distance < 30) continue;
dots.push({
distance: distance,
size: random(2, 8),
dotColor:
random(100) > 85
? color(220, 180, 80, 200)
: color(240, 240, 240, 180),
});
}
return dots;
}
draw(centerX, centerY, rotation) {
const currentAngle = this.baseAngle + rotation;
const endX = centerX + cos(currentAngle) * this.length;
const endY = centerY + sin(currentAngle) * this.length;
stroke(200, 200, 220, 150);
strokeWeight(1);
line(centerX, centerY, endX, endY);
noStroke();
for (const dot of this.dots) {
const dotX = centerX + cos(currentAngle) * dot.distance;
const dotY = centerY + sin(currentAngle) * dot.distance;
fill(dot.dotColor);
ellipse(dotX, dotY, dot.size, dot.size);
}
}
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// p5.js ๋ฉ์ธ ํจ์
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
function setup() {
createCanvas(1080, 1080);
MAX_RADIUS = width * 0.45;
concentricCircles = new ConcentricCircles(NUM_CONCENTRIC, MAX_RADIUS);
for (let i = 0; i < NUM_RAYS; i++) {
const angle = map(i, 0, NUM_RAYS, 0, TWO_PI);
rays.push(new Ray(angle, MAX_RADIUS));
}
frameRate(60);
}
function draw() {
background(40, 30, 40);
const currentRotation = millis() * ROTATION_SPEED;
const centerX = width / 2;
const centerY = height / 2;
concentricCircles.draw(centerX, centerY);
for (const ray of rays) {
ray.draw(centerX, centerY, currentRotation);
}
}