Diese Seite hält Code und zusätzliche Hilfsmittel bereit.
// p5js Beispiel "Wolfram CA"
// https://p5js.org/examples/
// verändert sci
let w = 10;
let zellen; // 1D-Array, wird mit Nullen und Einsen gefüllt
let generation = 0;
let regelset = [0, 1, 0, 1, 1, 0, 1, 0]; // 1D-Array zum Speichern des Regelsets, z.B. [0,1,1,0,1,1,0,1]
function setup() {
createCanvas(640, 400);
zellen = Array(floor(width / w));
for (let i = 0; i < zellen.length; i++) {
zellen[i] = 0;
}
// zum Start wird in der 0. Generation nur die mittlere Zelle auf Status "1" geseetzt
zellen[zellen.length/2] = 1;
}
function draw() {
for (let i = 0; i < zellen.length; i++) {
if (zellen[i] === 1) {
fill(200);
} else {
fill(51);
noStroke();
rect(i * w, generation * w, w, w);
}
}
if (generation < height/w) {
generieren();
}
}
// generiert die nächste Generation
function generieren() {
let nextgen = Array(zellen.length);
// Für jede Zelle Status festlegen, aufgrund des Vorfahren und dessen Nachbarn.
// Randzellen ignorieren, da diese nur einen Nachbarn haben.
for (let i = 1; i < zellen.length-1; i++) {
let links = zellen[i-1]; // Status des linken Nachbarn auslesen
let ich = zellen[i]; // Status des Vorfahren auslesen
let rechts = zellen[i+1]; // Status des rechten Nachbarns auslesen
nextgen[i] = regeln(links, ich, rechts); // neuer Status aufgrund dieser Dreiernachbarschaft bestimmen
}
// die aktuelle Generation wird zur aktuellen generation
zellen = nextgen;
generation = generation + 1;
}
// Funktion enthält die Wolfram Regeln und liefert den passenden Wert zurück | umständlich programmiert - aber anschaulich
function regeln(a, b, c) {
if (a == 1 && b == 1 && c == 1) {
return regelset[0];
}
if (a == 1 && b == 1 && c == 0) {
return regelset[1];
}
if (a == 1 && b == 0 && c == 1) {
return regelset[2];
}
if (a == 1 && b == 0 && c == 0) {
return regelset[3];
}
if (a == 0 && b == 1 && c == 1) {
return regelset[4];
}
if (a == 0 && b == 1 && c == 0) {
return regelset[5];
}
if (a == 0 && b == 0 && c == 1) {
return regelset[6];
}
if (a == 0 && b == 0 && c == 0) {
return regelset[7];
}
return 0;
}
// p5js Beispiel "Game of Life"
// https://p5js.org/examples/
// verändert sci
let w;
let spalten;
let zeilen;
let brett;
let next;
function setup() {
frameRate(10);
createCanvas(720, 400);
w = 20;
// Aanzahl Spalten und Zeilen berechnen
spalten = floor(width / w);
zeilen = floor(height / w);
// schrullige Art 2D-Array in JS zu generieren
brett = new Array(spalten);
for (let i = 0; i < spalten; i++) {
brett[i] = new Array(zeilen);
}
// dito., für ein zweites 2D-Array
next = new Array(spalten);
for (i = 0; i < spalten; i++) {
next[i] = new Array(zeilen);
}
init();
}
function draw() {
background(255);
generieren();
for ( let i = 0; i < spalten; i++) {
for ( let j = 0; j < zeilen; j++) {
if ((brett[i][j] == 1)) {
fill(0);
} else {
fill(255);
}
stroke(0);
rect(i * w, j * w, w-1, w-1);
}
}
}
// Brett bei Mausklick zurücksetzen
function mousePressed() {
init();
}
// Brettzellen zufällig füllen
function init() {
for (let i = 0; i < spalten; i++) {
for (let j = 0; j < zeilen; j++) {
// Randzellen mit Nullen füllen, die restlichen Zellen mit Zufallszahl [0, 1]
if (i == 0 || j == 0 || i == spalten-1 || j == zeilen-1) {
brett[i][j] = 0;
} else {
brett[i][j] = floor(random(2));
}
next[i][j] = 0;
}
}
}
// Neue Generation erstellen
function generieren() {
// durch alle Zellen iterieren und direkte Nachbarn checken
for (let x = 1; x < spalten - 1; x++) {
for (let y = 1; y < zeilen - 1; y++) {
// alle Werte des 3x3 Felder grossen Spots aufadieren
let nachbarn = 0;
for (let i = -1; i <= 1; i++) {
for (let j = -1; j <= 1; j++) {
nachbarn = nachbarn + brett[x+i][y+j];
}
}
// kleiner Trick: Wert der zentralen Zelle subtrahieren, da in vorherige for-Schleife aufsummiert
nachbarn = nachbarn - brett[x][y];
// Überlebensregeln anwenden
if ((brett[x][y] == 1) && (nachbarn < 2)) { // Einsamkeit
next[x][y] = 0;
} else if ((brett[x][y] == 1) && (nachbarn > 3)) { // Überpopulation
next[x][y] = 0;
} else if ((brett[x][y] == 0) && (nachbarn == 3)) { // Geburt
next[x][y] = 1;
} else { // Überleben
next[x][y] = brett[x][y];
}
}
}
// Swap! | Tausch!
let temp = brett;
brett = next;
next = temp;
}
// Langton's Ant
// https://thecodingtrain.com/challenges/89-langtons-ant by D. Shiffman
// angepasst sci
let gitter;
let x;
let y;
let richtung;
let ANTNORD = 0;
let ANTOST = 1;
let ANTSUED = 2;
let ANTWEST = 3;
function setup() {
createCanvas(400, 400);
background(245);
gitter = mache2DArray(width, height);
x = width / 2;
y = height / 2;
richtung = ANTNORD;
}
function dreheRechts() {
richtung++;
if (richtung > ANTWEST) {
richtung = ANTNORD;
}
}
function dreheLinks() {
richtung--;
if (richtung < ANTNORD) {
richtung = ANTWEST;
}
}
function bewegeVorwaerts() {
if (richtung == ANTNORD) {
y--;
} else if (richtung == ANTOST) {
x++;
} else if (richtung == ANTSUED) {
y++;
} else if (richtung == ANTWEST) {
x--;
}
if (x > width - 1) {
x = 0;
} else if (x < 0) {
x = width - 1;
}
if (y > height - 1) {
y = 0;
} else if (y < 0) {
y = height - 1;
}
}
function draw() {
strokeWeight(1);
for (let n = 0; n < 100; n++) {
let status = gitter[x][y];
if (status == 0) {
dreheRechts();
gitter[x][y] = 1;
} else if (status == 1) {
dreheLinks();
gitter[x][y] = 0;
}
stroke(255);
if (gitter[x][y] == 1) {
stroke(0);
}
point(x, y);
bewegeVorwaerts();
}
}
function mache2DArray(spalten, zeilen) {
let arr = new Array(spalten);
for (let i = 0; i < arr.length; i++) {
arr[i] = new Array(zeilen);
for (let j = 0; j < arr[i].length; j++) {
arr[i][j] = 0;
}
}
return arr;
}
Braitenberg Vehikel ohne Sensorik, d.h. mit konstanter Geschwindigkeit:
640'000 Berechnungsschritte in 320 Bildern im Zeitraffer:
fs in ksw