Bilder oben (nur drei Beispiele von vielen): Nach dem Start des Programms werden mit der Maus ein paar Linien und Punkte (Keimzellen) an beliebige Stellen des "Spielfeldes" gezeichnet, die sofort beginnen, sich zu miteinander verschmelzenden Kreisen auszudehnen und bald die ganze Fläche mit einem Muster füllen, das an sich bewegende Wellen auf Wasser erinnert. Sobald man jedoch per Maus die Parameter 1 bis 4 vorsichtig verändert, bricht schnell das Chaos aus und es entstehen Muster wie oben gezeigt, die jedoch sehr instabil sein können.Wenn man Pech hat, endet das Ganze in einem unangenehmen Flimmern des Bildes zwischen mehreren Farben, so dass man das Programm besser beendet und von vorn beginnt. Dieses Programmbeispiel zeigt einmal mehr die rasend schnelle Grafikverarbeitung von Processing.
Wachstumsfunktion 1
Der unten stehende Programmcode kann mittels Copy und Paste direkt in den leeren, geöffneten Processing Editor kopiert werden und sollte zumindest unter Windows 7 direkt nach dem Start funktionieren, wenn zusätzlich die zum Download bereitstehende Grafik eingebunden wird (siehe ganz unten).
Achtung: Das Verzeichnis, in welchem sich die Datei des Processing Quellcodes befindet (Dateiname.pde) muss den gleichen Namen wie die Quellcode-Datei besitzen.
Die grafische Benutzeroberfläche ist nicht Bestandteil von Processing und wir in diesem Programm als Grafik eingebettet. Der betreffende Steuer-Code ist im folgenden Listing enthalten. Erfahrene Programmierer können ihn problemlos zur Erzeugung eigener grafischer Oberflächen zweckentfremden. Hinweise zu den Eigenschaften des Programms und seiner Bedienung finden Sie unter dem folgenden Link:
Hinweis 1:
Auf Grund der begrenzten Zeilenbreite kann es vorkommen, dass zusätzliche, nicht vorgesehene Zeilenumbrüche auftreten, die keine Auswirkungen haben und bei Zurückkopieren in den geöffneten Processing-Editor verschwinden.
Hinweis 2:
Damit das Programm läuft, muss zusätzlich die grafische Oberfläche, die diesmal als fertige Grafik eingebunden wird, heruntergeladen werden (siehe ganz unten). Die betreffende Datei muss sich im selben Verzeichnis befinden, wie das Programm selber.
Programmcode
// Source Code: Kurt Diedrich
// Only private use
int[][] array1 = new int[500][700];
int[][] array2 = new int[1500][1500];
int[][] array3 = new int[1500][1500];
int[][] array4 = new int[1500][1500];
// int[][] array5 = new int[1500][1500];
int[][] Farbarray = new int[1024][3]; // Farbpalette
int hor;
int vert;
int threshold1 = 120;
int threshold2 = 255;
int threshold3 = 90;
int threshold4 = 60;
int threshold5 = 10;
int n;
int m;
int q;
int red ;
int green ;
int blue ;
int flag;
void setup()
{
size(862,594);
PImage img;
img = loadImage("Oberflaeche_1.jpg");
image(img, 0, 0);
// Textfeld Threshold 1
noStroke();
fill(255,255,255);
rect(736,300,40,20);
fill(0,0,0);
text(threshold1, 738, 312);
// Textfeld Threshold 2
fill(255,255,255);
rect(736,340,40,20);
fill(0,0,0);
text(threshold2, 738, 352);
// Textfeld Threshold 3
fill(255,255,255);
rect(736,380,40,20);
fill(0,0,0);
text(threshold3, 738, 392);
// Textfeld Threshold 4
threshold4 = threshold4 - 1;
noStroke();
fill(255,255,255);
rect(736,420,40,20);
fill(0,0,0);
text(threshold4, 738, 432);
fill_farbarray();
}
void draw()
{
if (mousePressed)
{
// Anzeige der Mauskoordinaten
// noStroke();
// fill(255,255,255);
// rect(720,400,100,20);
// fill(0,0,0);
// text("X: " + mouseX + " " + "Y: " +mouseY, 722, 410);
// Abfrage der Buttons
if((mouseX>735) & (mouseX<825))
{
if((mouseY>20) & (mouseY<40)) { flag = 1; }
// Threshold 1 #################################################
if((mouseX>735) & (mouseX<775) & (mouseY>60) & (mouseY<80))
{
threshold1 = threshold1 - 1;
noStroke();
fill(255,255,255);
rect(736,300,40,20);
fill(0,0,0);
text(threshold1, 738, 312);
}
if((mouseX>785) & (mouseX<825) &(mouseY>60) & (mouseY<80))
{
threshold1 = threshold1 + 1;
noStroke();
fill(255,255,255);
rect(736,300,40,20);
fill(0,0,0);
text(threshold1, 738, 312);
}
// Threshold 2 #################################################
if((mouseX>735) & (mouseX<775)&(mouseY>100) & (mouseY<120))
{
threshold2 = threshold2 - 1;
noStroke();
fill(255,255,255);
rect(736,340,40,20);
fill(0,0,0);
text(threshold2, 738, 352);
}
if((mouseX>785) & (mouseX<825)&(mouseY>100) & (mouseY<120))
{
threshold2 = threshold2 + 1;
noStroke();
fill(255,255,255);
rect(736,340,40,20);
fill(0,0,0);
text(threshold2, 738, 352);
}
// Threshold 3 #################################################
if((mouseX>735) & (mouseX<775)&(mouseY>140) & (mouseY<160))
{
threshold3 = threshold3 - 1;
noStroke();
fill(255,255,255);
rect(736,380,40,20);
fill(0,0,0);
text(threshold3, 738, 392);
}
if((mouseX>785) & (mouseX<825)&(mouseY>140) & (mouseY<160))
{
threshold3 = threshold3 + 1;
noStroke();
fill(255,255,255);
rect(736,380,40,20);
fill(0,0,0);
text(threshold3, 738, 392);
}
// Threshold 4 #################################################
if((mouseX>735) & (mouseX<775)&(mouseY>180) & (mouseY<200))
{
threshold4 = threshold4 - 1;
noStroke();
fill(255,255,255);
rect(736,420,40,20);
fill(0,0,0);
text(threshold4, 738, 432);
}
if((mouseX>785) & (mouseX<825)&(mouseY>180) & (mouseY<200))
{
threshold4 = threshold4 + 1;
noStroke();
fill(255,255,255);
rect(736,420,40,20);
fill(0,0,0);
text(threshold4, 738, 432);
}
if((mouseX>785) & (mouseX<825)&(mouseY>220) & (mouseY<240))
{
flag=0;
for(m=0;m<=499;m++)
{
for (n=0;n<=699;n++)
{
array1[m][n] =0;
array2[m][n] =0;
array3[m][n] =0;
array4[m][n] =0;
//array5[m][n] =0;
set(n, m, color(0,0,60));
}
}
}
if((mouseX>735) & (mouseX<775)&(mouseY>220) & (mouseY<240)) {flag=0; }
}
// Setzen eines "Zündungspixels"
if((mouseX<700)& (mouseX>0) & (mouseY>0) & (mouseY<499))
{ set(mouseX, mouseY, color(0, 255, 0));
array1[mouseY][mouseX]=250;
}
}
if (flag==1){calculate();}
}
void calculate()
{
for(m=0;m<=499;m++)
{
for (n=0;n<=699;n++)
{
if (array1[m][n] > threshold1) // threshold1 = 120 default, array1 = 250 by mouse
// bedingung erfüllt by default
{
if((n < 698) & (m < 498) & (n > 1) & (m > 1))
{
array2[m] [n+1] = array2[m] [n+1]+threshold5; // 10 by default
array2[m] [n-1] = array2[m] [n-1]+threshold5;
array2[m+1] [n+1] = array2[m+1] [n+1]+threshold5;
array2[m+1] [n-1] = array2[m+1] [n-1]+threshold5;
array2[m+1] [n] = array2[m+1] [n]+threshold5;
array2[m-1] [n+1] = array2[m-1] [n+1]+threshold5;
array2[m-1] [n-1] = array2[m-1] [n-1]+threshold5;
array2[m-1] [n] = array2[m-1] [n]+threshold5;
array2[m][n] = array1[m][n]; // Kopiere a1 nach a2 ????
}
}
if (array3[m][n] > 1) // Wenn array3 nicht leer. Array3 stellt für jede einzelne Zelle
// einen individuellen Timer dar, der jedesmal um 1 vermindert wird.
// Solange der Timer nicht abgelaufen ist, werden die Zellen von Array2 um trheshold3 vermindert.
// Wenn t5 > t3, dann wachsen die Werte in Array2
{
array2[m][n]= array2[m][n]-threshold3;
array3[m][n]= array3[m][n]-1;
}
if (array1[m][n] <0) {array1 [m][n] =0;} // Standard-Überlaufbremse
if (array2[m][n] <0) {array2 [m][n] =0;}
if (array3[m][n] <0) {array3 [m][n] =0;}
if (array4[m][n] <0) {array4 [m][n] =0;}
} // Next 1
} // Next 2
for(m=0;m<=499;m++)
{
for (n=0;n<=699;n++)
{
if (array2[m][n] > 250 ) // Droht Array2 überzulaufen, wird es auf tr2 zurückgesetzt. Der Timer Array3 wird neu gesetzt (Tr4)
{
array2[m][n] = threshold2; // default = 255
array3[m][n] = threshold4; //array3 ist wieder frei, so dass in Array2 neu gezeichnet werden kann
}
//Kopieren von array2 in array1
array1[m][n] = array2[m][n];
if (array4[m][n] != array1[m][n])
{
// Indirekte Bestimmung der Farben aus farbarray
if (array1[m][n] >255) {array1[m][n] = 255;}
if (array1[m][n] <0) {array1[m][n] = 0;}
red = Farbarray[array1[m][n]] [0];
green = Farbarray[array1[m][n]] [1];
blue = Farbarray[array1[m][n]] [2];
set(n, m, color(red,green,blue));
}
array4[m][n]= array2[m][n]; // Array 4 ist Vorher-Zustand. Feststellung des Unterschiedes zum vorherigen Durchlauf.
// Was hat sich geändert? Zeichne nur die Änderungen neu. Das spart Zeit.
}
}
//}
}
// #########################################################################################################
// ###### ######
// ###### Farbarray ######
// ###### ######
// #########################################################################################################
void fill_farbarray()
{
//Füllen des Farbarrays
for (n = 0; n<=3; n++) {Farbarray[n][0] = 0 ; Farbarray[n][1] = 0 ; Farbarray[n][2] = 20 ;}
/* 2 */ for (n = 4; n<=7; n++) {Farbarray[n][0] = 0 ; Farbarray[n][1] = 16 ; Farbarray[n][2] = 75 ;}
for (n = 8; n<=11; n++) {Farbarray[n][0] = 0 ; Farbarray[n][1] = 33 ; Farbarray[n][2] = 132 ;}
/* 4 */ for (n = 12; n<=15; n++) {Farbarray[n][0] = 0 ; Farbarray[n][1] = 36 ; Farbarray[n][2] = 144 ;}
for (n = 16; n<=19; n++) {Farbarray[n][0] = 0 ; Farbarray[n][1] = 39 ; Farbarray[n][2] = 157 ;}
/* 6 */ for (n = 20; n<=23; n++) {Farbarray[n][0] = 34 ; Farbarray[n][1] = 18 ; Farbarray[n][2] = 156 ;}
for (n = 24; n<=27; n++) {Farbarray[n][0] = 67 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 155 ;}
/* 8 */ for (n = 28; n<=31; n++) {Farbarray[n][0] = 80 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 155 ;}
for (n = 32; n<=35; n++) {Farbarray[n][0] = 94 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 155 ;}
/* 10 */ for (n = 36; n<=39; n++) {Farbarray[n][0] = 120 ; Farbarray[n][1] = 1 ; Farbarray[n][2] = 159 ;}
for (n = 40; n<=43; n++) {Farbarray[n][0] = 143 ; Farbarray[n][1] = 0 ; Farbarray[n][2] = 164 ;}
/* 12 */ for (n = 44; n<=47; n++) {Farbarray[n][0] = 154 ; Farbarray[n][1] = 0 ; Farbarray[n][2] = 151 ;}
for (n = 48; n<=51; n++) {Farbarray[n][0] = 164 ; Farbarray[n][1] = 0 ; Farbarray[n][2] = 139 ;}
/* 14 */ for (n = 52; n<=55; n++) {Farbarray[n][0] = 160 ; Farbarray[n][1] = 1 ; Farbarray[n][2] = 118 ;}
for (n = 56; n<=59; n++) {Farbarray[n][0] = 155 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 98 ;}
/* 16 */ for (n = 60; n<=63; n++) {Farbarray[n][0] = 155 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 72 ;}
for (n = 64; n<=67; n++) {Farbarray[n][0] = 155 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 45 ;}
/* 18 */ for (n = 68; n<=71; n++) {Farbarray[n][0] = 161 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 58 ;}
for (n = 72; n<=75; n++) {Farbarray[n][0] = 168 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 52 ;}
/* 20 */ for (n = 76; n<=79; n++) {Farbarray[n][0] = 178 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 55 ;}
for (n = 80; n<=83; n++) {Farbarray[n][0] = 189 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 58 ;}
/* 22 */ for (n = 84; n<=87; n++) {Farbarray[n][0] = 202 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 62 ;}
for (n = 88; n<=91; n++) {Farbarray[n][0] = 215 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 66 ;}
/* 24 */ for (n = 92; n<=95; n++) {Farbarray[n][0] = 222 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 68 ;}
for (n = 96; n<=99; n++) {Farbarray[n][0] = 230 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 70 ;}
/* 26 */ for (n = 100; n<=103; n++) {Farbarray[n][0] = 241 ; Farbarray[n][1] = 2 ; Farbarray[n][2] = 48 ;}
for (n = 104; n<=107; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 1 ; Farbarray[n][2] = 27 ;}
/* 28 */ for (n = 108; n<=111; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 28 ; Farbarray[n][2] = 14 ;}
for (n = 112; n<=115; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 57 ; Farbarray[n][2] = 1 ;}
/* 30 */ for (n = 116; n<=119; n++) {Farbarray[n][0] = 250 ; Farbarray[n][1] = 42 ; Farbarray[n][2] = 2 ;}
for (n = 120; n<=123; n++) {Farbarray[n][0] = 249 ; Farbarray[n][1] = 27 ; Farbarray[n][2] = 2 ;}
/* 32 */ for (n = 124; n<=127; n++) {Farbarray[n][0] = 248 ; Farbarray[n][1] = 46 ; Farbarray[n][2] = 2 ;}
for (n = 128; n<=131; n++) {Farbarray[n][0] = 248 ; Farbarray[n][1] = 65 ; Farbarray[n][2] = 3 ;}
/* 34 */ for (n = 132; n<=135; n++) {Farbarray[n][0] = 250 ; Farbarray[n][1] = 82 ; Farbarray[n][2] = 2 ;}
for (n = 136; n<=139; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 101 ; Farbarray[n][2] = 1 ;}
/* 36 */ for (n = 140; n<=143; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 122 ; Farbarray[n][2] = 1 ;}
for (n = 144; n<=147; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 146 ; Farbarray[n][2] = 1 ;}
/* 38 */ for (n = 148; n<=151; n++) {Farbarray[n][0] = 253 ; Farbarray[n][1] = 160 ; Farbarray[n][2] = 0 ;}
for (n = 152; n<=155; n++) {Farbarray[n][0] = 253 ; Farbarray[n][1] = 177 ; Farbarray[n][2] = 0 ;}
/* 40 */ for (n = 156; n<=159; n++) {Farbarray[n][0] = 255 ; Farbarray[n][1] = 186 ; Farbarray[n][2] = 26 ;}
for (n = 160; n<=163; n++) {Farbarray[n][0] = 255 ; Farbarray[n][1] = 194 ; Farbarray[n][2] = 53 ;}
/* 42 */ for (n = 164; n<=167; n++) {Farbarray[n][0] = 254 ; Farbarray[n][1] = 207 ; Farbarray[n][2] = 40 ;}
for (n = 168; n<=171; n++) {Farbarray[n][0] = 254 ; Farbarray[n][1] = 220 ; Farbarray[n][2] = 27 ;}
/* 44 */ for (n = 172; n<=175; n++) {Farbarray[n][0] = 254 ; Farbarray[n][1] = 234 ; Farbarray[n][2] = 40 ;}
for (n = 176; n<=179; n++) {Farbarray[n][0] = 254 ; Farbarray[n][1] = 248 ; Farbarray[n][2] = 53 ;}
/* 46 */ for (n = 180; n<=183; n++) {Farbarray[n][0] = 254 ; Farbarray[n][1] = 248 ; Farbarray[n][2] = 43 ;}
for (n = 184; n<=187; n++) {Farbarray[n][0] = 252 ; Farbarray[n][1] = 248 ; Farbarray[n][2] = 14 ;}
/* 48 */ for (n = 188; n<=191; n++) {Farbarray[n][0] = 240 ; Farbarray[n][1] = 249 ; Farbarray[n][2] = 50 ;}
for (n = 192; n<=195; n++) {Farbarray[n][0] = 235 ; Farbarray[n][1] = 249 ; Farbarray[n][2] = 50 ;}
/* 50 */ for (n = 196; n<=199; n++) {Farbarray[n][0] = 230 ; Farbarray[n][1] = 249 ; Farbarray[n][2] = 50 ;}
for (n = 200; n<=203; n++) {Farbarray[n][0] = 225 ; Farbarray[n][1] = 249 ; Farbarray[n][2] = 60 ;}
/* 52 */ for (n = 204; n<=207; n++) {Farbarray[n][0] = 220 ; Farbarray[n][1] = 249 ; Farbarray[n][2] = 70 ;}
for (n = 208; n<=211; n++) {Farbarray[n][0] = 215 ; Farbarray[n][1] = 245 ; Farbarray[n][2] = 70 ;}
/* 54 */ for (n = 212; n<=215; n++) {Farbarray[n][0] = 210 ; Farbarray[n][1] = 245 ; Farbarray[n][2] = 80 ;}
for (n = 216; n<=219; n++) {Farbarray[n][0] = 210 ; Farbarray[n][1] = 251 ; Farbarray[n][2] = 89 ;}
/* 56 */ for (n = 220; n<=223; n++) {Farbarray[n][0] = 222 ; Farbarray[n][1] = 252 ; Farbarray[n][2] = 105 ;}
for (n = 224; n<=227; n++) {Farbarray[n][0] = 226 ; Farbarray[n][1] = 253 ; Farbarray[n][2] = 121 ;}
/* 58 */ for (n = 228; n<=231; n++) {Farbarray[n][0] = 230 ; Farbarray[n][1] = 253 ; Farbarray[n][2] = 138 ;}
for (n = 232; n<=235; n++) {Farbarray[n][0] = 233 ; Farbarray[n][1] = 253 ; Farbarray[n][2] = 151 ;}
/* 60 */ for (n = 236; n<=239; n++) {Farbarray[n][0] = 236 ; Farbarray[n][1] = 253 ; Farbarray[n][2] = 170 ;}
for (n = 240; n<=243; n++) {Farbarray[n][0] = 241 ; Farbarray[n][1] = 254 ; Farbarray[n][2] = 214 ;}
/* 62 */ for (n = 244; n<=247; n++) {Farbarray[n][0] = 245 ; Farbarray[n][1] = 254 ; Farbarray[n][2] = 214 ;}
for (n = 248; n<=251; n++) {Farbarray[n][0] = 247 ; Farbarray[n][1] = 254 ; Farbarray[n][2] = 222 ;}
/* 64 */ for (n = 252; n<=255; n++) {Farbarray[n][0] = 255 ; Farbarray[n][1] = 0 ; Farbarray[n][2] = 255 ;}
}