
// === Data-driven Geometry ===
// CSV ๋ฐ์ดํฐ โ Radial Sculpture ํํ๋ก ๋ณํ
// ๋ฐ์ดํฐ ๊ธฐ๋ฐ ๊ธฐํ ์กฐํ
let table;
let values = [];
function preload() {
// CSV ํ์ผ์ ๋ถ๋ฌ์ด
table = loadTable("data.csv", "csv", "header");
}
function setup() {
createCanvas(700, 700);
angleMode(DEGREES);
// CSV์์ ๋ฐ์ดํฐ ์ถ์ถ
for (let r = 0; r < table.getRowCount(); r++) {
let v = table.getNum(r, "value");
values.push(v);
}
}
function draw() {
background(20);
translate(width / 2, height / 2);
// ์๊ฐํ ํ๋ผ๋ฏธํฐ
let count = values.length;
let angleStep = 360 / count;
for (let i = 0; i < count; i++) {
let v = values[i];
// ๋ฐ์ดํฐ โ Geometry ๋ณํ
let radius = map(v, 0, 100, 40, 300);
let thickness = map(v, 0, 100, 4, 20);
let hue = map(v, 0, 100, 160, 360);
push();
rotate(i * angleStep);
// ์์
fill(hue, 150, 255);
noStroke();
// ๋ฐฉ์ฌํ ๊ธฐ๋ฅ (Radial Bar)
rect(0, -thickness / 2, radius, thickness, 5);
// ๋ฐ์ดํฐ ์ (์ ํ ์กฐํ ๋๋)
fill(255);
circle(radius, 0, thickness * 0.8);
pop();
}
}
โ 1) ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํจ๋ฌ๋ฉํธ๋ฆญ ์ปค๋ธ
Spline / Blob / Superformula ๋ฑ๊ณผ ๊ฒฐํฉ
โ 2) ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๊ธฐ๋ฐ Geometry
์ด๋ฏธ์ง ํฝ์
โ ๋์ด๋งต(Height field) ์์ฑ
(์: ์ผ๊ตด ์ฌ์ง โ 2D height sculpture)
โ 3) Noise + Data ๋ฏน์ค
์ค์ ๋ฐ์ดํฐ์ ๋
ธ์ด์ฆ ํํฐ๋ฅผ ์
ํ
์์ ์ โ๋ฐ์ดํฐ ์๊ณกโ ํจ๊ณผ ๋ง๋ค๊ธฐ
โ 4) Three.js๋ก ํ์ฅ
CSV ๋ฐ์ดํฐ โ 3D tube / mesh deform
(์ง์ง Procedural Modeling)
โ 5) ์ ๋๋ฉ์ด์
๋ฐ์ดํฐ๊ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ณํ๋ ๊ฒ์ฒ๋ผ
ํํ๊ฐ pulsating ํ๋๋ก ๋ง๋ค๊ธฐ