xxxxxxxxxx
147
const TRIES = 2.5
const RELAX = 1;
const SHRINK = 0.8
const INITIAL_R = 0.05;
let SIZE;
let tex;
function setup() {
// SIZE = 1080;
SIZE = min(windowWidth, windowHeight);
createCanvas(SIZE, SIZE);
initialize();
grow();
}
let nodes, open_nodes;
function initialize() {
const size = floor(1 / (INITIAL_R * 2));
nodes = new Array(size).fill(null).map(() =>
new Array(size).fill(null).map(() => []));
const initial_node = createNode(0.5, 0.5, INITIAL_R, .25, null);
open_nodes = [initial_node];
colorMode(RGB, 1);
background(0);
noFill();
drawNode(initial_node);
}
const pad_y = 0;
const pad_x = 0;
function createNode(x, y, r, dir, parent) {
if (x < pad_x || x >= 1 - pad_x || y < pad_y || y >= 1 - pad_y)
return null;
const size = nodes.length;
const x_i = floor(x * size);
const y_i = floor(y * size);
for (let c_x=max(0, x_i - 1); c_x <= min(x_i + 1, size - 1); c_x++)
for (let c_y=max(0, y_i - 1); c_y <= min(y_i + 1, size - 1); c_y++)
if (nodes[c_x][c_y].some(n => n != parent &&
sqrt(pow(n.x - x, 2) + pow(n.y - y, 2)) < (r + n.r) * RELAX)
)
return null;
const node = {
x, y, r,
dir,
parent,
depth: parent ? parent.depth + 1 : 0,
picked: 0,
}
nodes[x_i][y_i].push(node);
return node;
}
function grow() {
// console.time();
if (open_nodes.length) {
const node = open_nodes.shift();
let new_node;
let its = 0;
let new_vel = node.picked == 0
? node.vel
: 0
const new_r = node.r * SHRINK
// const new_r = random(INITIAL_R);
do {
let new_dir = node.dir + its / TRIES //dir + new_vel;
const new_x = node.x + cos(new_dir * TAU) * (node.r + new_r);
const new_y = node.y + sin(new_dir * TAU) * (node.r + new_r);
new_node = createNode(new_x, new_y, new_r, new_dir, node);
its++
}while(new_node == null && its < TRIES);
node.picked++;
if (new_node) {
open_nodes.push(new_node);
drawNode(new_node);
if (!open_nodes.includes(node)) open_nodes.push(node);
}
// else if (node.parent && !open_nodes.includes(node.parent)) open_nodes.push(node.parent);
// if (node.picked == 0)
// if (new_node)
// return new_node;
}
// console.timeEnd();
}
function drawNode(node) {
stroke("white");
strokeWeight(1);
noFill();
circle(
node.x * width,
node.y * height,
node.r * 2 * width,
);
}
function keyPressed() {
if (key === 'f')
toggleFullscreen()
if (key === 'r')
initialize()
if (key == 'Enter') {
save();
}
}
function draw() {
for (let i=0; i<100; i++) {
const node = grow();
// if (node) drawNode(node);
}
// if (open_nodes.length == 0) {
// save();
// // initialize();
// }
}
function cosn(v) {
return 0.5 + 0.5 * cos(v * TAU);
}