graphGoL
graph with game of life
rulenodeArrayedgeArrayneighborArraynRulesnodeSinitializeNodesinitializeEdgesrandomBoolplotEdgesapplyRuleslivingNeighborsruleDots
let n = 50;
let r = 200;
let rule = 1;
let nodeArray = [];
let edgeArray = [];
let neighborArray = [];
let nRules = 7;
function setup() {
c = min(windowWidth, windowHeight);
createCanvas(c, c);
r = min(width, height) / 2.5;
angleMode(DEGREES);
initializeNodes();
initializeEdges();
translate(width / 2, height / 2);
frameRate(1);
background(0);
fill(191, 214, 212);
circle(0, 0, 2 * r);
plotEdges();
ruleDots();
for (let i = 0; i < n; i++) {
nodeArray[i].display();
}
}
function draw() {
translate(width / 2, height / 2);
background(0);
ruleDots();
fill(191, 214, 212);
circle(0, 0, 2 * r);
plotEdges();
applyRules();
noStroke();
for (let i = 0; i < n; i++) {
nodeArray[i].display();
}
livingNeighbors();
}
class nodeS {
constructor(nId, a) {
this.x = r * sin((nId * 360) / n);
this.y = r * cos((nId * 360) / n);
this.alive = a;
}
display() {
if (this.alive) {
fill(255);
} else {
fill(20);
}
circle(this.x, this.y, 5);
}
}
function initializeNodes() {
for (let i = 0; i < n; i++) {
nodeArray.push(new nodeS(i, randomBool()));
}
}
function initializeEdges() {
for (let i = 0; i < n; i++) {
edgeArray[i] = [];
for (let j = 0; j < i; j++) {
edgeArray[i][i] = false;
if (i !== j) {
edgeArray[i][j] = randomBool();
}
}
}
}
function randomBool() {
a = random(0, 1);
if (round(a) === 1) {
return true;
} else {
return false;
}
}
function plotEdges() {
for (let i = 0; i < n; i++) {
for (let j = 0; j < i; j++) {
if (i != j && edgeArray[i][j]) {
if (nodeArray[i].alive && nodeArray[j].alive) {
stroke(255);
strokeWeight(2);
} else {
stroke(0);
strokeWeight(0.1);
}
line(nodeArray[i].x, nodeArray[i].y, nodeArray[j].x, nodeArray[j].y);
}
}
}
}
function applyRules() {
if (rule === 0) {
t = floor(n / 50);
for (let i = 0; i < n; i++) {
if (neighborArray[i] < t || neighborArray[i] > t) {
nodeArray[i].alive = false;
}
if (neighborArray[i] === t || neighborArray[i] === 0) {
nodeArray[i].alive = true;
}
}
}
if (rule === 1) {
t = 3;
for (let i = 0; i < n; i++) {
if (neighborArray[i] < t || neighborArray[i] > t) {
nodeArray[i].alive = false;
}
if (neighborArray[i] === t || neighborArray[i] === 0) {
nodeArray[i].alive = true;
}
}
}
if (rule === 2) {
t = 5;
for (let i = 0; i < n; i++) {
if (neighborArray[i] < t || neighborArray[i] > t) {
nodeArray[i].alive = false;
}
if (neighborArray[i] === t || neighborArray[i] === 0) {
nodeArray[i].alive = true;
}
}
}
if (rule === 3) {
for (let i = 0; i < n; i++) {
if (neighborArray[i] % 2 === 0) {
nodeArray[i].alive = true;
} else {
nodeArray[i].alive = false;
}
}
}
if (rule === 4) {
for (let i = 0; i < n; i++) {
if (neighborArray[i] % 2 === 0 && neighborArray[i] !== 0) {
nodeArray[i].alive = false;
} else {
nodeArray[i].alive = true;
}
}
}
if (rule === 5) {
t = 2;
for (let i = 0; i < n; i++) {
if (neighborArray[i] < t || neighborArray[i] > t) {
nodeArray[i].alive = false;
}
if (neighborArray[i] === t || neighborArray[i] === 0) {
nodeArray[i].alive = true;
}
}
}
if (rule === 6) {
t = 2;
for (let i = 0; i < n; i++) {
nodeArray[i].alive = false;
}
}
}
function livingNeighbors() {
for (let i = 0; i < n; i++) {
neighborArray[i] = 0;
for (let j = 0; j < n; j++) {
if (i !== j && nodeArray[j].alive && edgeArray[i][j]) {
neighborArray[i] = neighborArray[i] + 1;
}
}
}
}
function keyPressed() {
if (keyCode === 38) {
if (rule === 0) {
rule = nRules - 1;
} else {
rule--;
}
}
if (keyCode === 40) {
if (rule === nRules - 1) {
rule = 0;
} else {
rule = rule + 1;
}
}
if (keyCode === 32) {
if (n < 120) {
n = n + 10;
} else {
n = 30;
}
}
nodeArray = [];
edgeArray = [];
neighborArray = [];
setup();
}
function ruleDots() {
for (let i = 0; i < nRules; i++) {
stroke(255);
strokeWeight(1);
if (rule === i) {
fill(255);
} else {
fill(255, 255, 255, 50);
}
circle(-width / 2 + 20, -height / 2 + 20 * (i + 1), 15);
}
}