import SpringGUI.*; // todo : System.arraycopy(); nachsehen // diamondSquareAni // eine Animation auf Grundlage des Diamond-Square-Algorithmus // von marek lode // erstellt: 20.-22. Dezember 2006 SpringGUI gui; // This is our instance of SpringGUI on which we will call all GUI related methods. int groesse = 256; // wird eine potenz von 2 (2,4,8,16,32...) angegeben, ist die Animation kachelbar boolean schleife = false; // gleich mit der Animation beginnen? => mit Linker Maustaste umschalten boolean weichgrau = false; // true: 255 grautoene ; false: slim oder 5 grautoene => mit rechter Maustaste umschalten boolean blassUndSchnell = true; // betrifft den '255 grautoene'-Modus => mit 'B' auf dem Keyboard umschalten boolean slim = true; // =>mit 'G' auf dem Keyboard umschalten // wie radio1 color farbe1 = color(47,35,25); color farbe2 = color(0,0,0); color farbe3 = color(205,130,0); color farbe4 = color(255,215,50); color farbe7 = farbe1; color farbe6 = farbe2; color farbe5 = farbe3; // wert1: anzahl der Bilder zwischen den Keyframes der Animation // wert2: Kantenlaenge, wird auf ein 2^n vergroessert // wert3: rauhheit // wert4: random-Seed diamondSquare3D ds = new diamondSquare3D( 30, groesse, 0, int(random(-1000000,1000000)) ); void setup() { size(groesse+100, groesse, JAVA2D); frameRate(12); if (!schleife) noLoop(); background(200,200,200); gui = new SpringGUI(this); // <--- this line MUST be placed before gui can be used. gui.addCheckbox("playCheckbox", "Play", groesse+20, 20, 60, 20); // create a Checkbox named "playCheckbox" if (schleife) gui.setState("playCheckbox", true); else gui.setState("playCheckbox", false); // create 4+2 Radiobuttons belonging to the group "group1" gui.addRadiobutton("radio1", "glut", "group1", groesse+20, 50, 60, 20); gui.addRadiobutton("radio2", "gruen", "group1", groesse+20, 70, 60, 20); gui.addRadiobutton("radio5", "grau", "group1", groesse+20, 100, 60, 20); gui.addRadiobutton("radio6", "beige", "group1", groesse+20, 120, 65, 20); gui.addRadiobutton("radio10", "original", "group1", groesse+20, 150, 60, 20); gui.addRadiobutton("radio11", "kontrast", "group1", groesse+20, 170, 65, 20); gui.setState("radio1", true); // select Radiobutton 1 gui.setBackground("playCheckbox", 200,200,200); gui.setBackground("radio1", 200,200,200); gui.setBackground("radio2", 200,200,200); gui.setBackground("radio5", 200,200,200); gui.setBackground("radio6", 200,200,200); gui.setBackground("radio10", 200,200,200); gui.setBackground("radio11", 200,200,200); } void draw() { ds.zeichnen(); } // this method is called whenever an event takes place: void handleEvent(String[] parameters) { if ( parameters[1].equals("playCheckbox") ) { if ( parameters[2].equals("selected") ) loop(); if ( parameters[2].equals("deselected") ) noLoop(); } if ( parameters[0].equals("Radiobutton") ) { if ( parameters[2].equals("selected") ) { if ( parameters[1].equals("radio1") ) { // glut // println("radio1"); farbe1 = color(47,35,25); farbe2 = color(0,0,0); farbe3 = color(205,130,0); farbe4 = color(255,215,50); farbe5 = farbe3; farbe6 = farbe2; farbe7 = farbe1; slim=true; weichgrau = false; } // if radio1 if ( parameters[1].equals("radio2") ) { // gruen // println("radio2"); farbe1 = color(239,242,219); farbe2 = color(221,231,165); farbe3 = color(175,184,112); farbe4 = color(77,91,17); farbe5 = farbe3; farbe6 = farbe2; farbe7 = farbe1; slim=true; weichgrau = false; } // if radio2 if ( parameters[1].equals("radio5") ) { // grau // println("radio4"); farbe1 = color(20); farbe2 = color(50); farbe3 = color(120); farbe4 = color(150); farbe5 = color(220); farbe6 = color(255); weichgrau = false; slim=false; } // if radio5 if ( parameters[1].equals("radio6") ) { // beige // println("radio4"); farbe1 = color(90,82,20); farbe2 = color(180,179,102); farbe3 = color(242,248,168); farbe4 = farbe3; farbe5 = farbe3; farbe6 = color(250,250,255); weichgrau = false; slim=false; } // if radio6 if ( parameters[1].equals("radio10") ) { // original // println("radio5"); blassUndSchnell=true; weichgrau = true; } // if radio10 if ( parameters[1].equals("radio11") ) { // kontrast // println("radio6"); blassUndSchnell=false; weichgrau = true; } // if radio11 redraw(); } // if selected } // if radiobutton } // handleEvent public class diamondSquare3D { public int zwischenschritte; private int schritt; private int bilderzaehler; private int breite; private int anzBreite; private int seed; private int koernung; private color[][] feld_1, feld_2, feld_3, feld_4; // konstruktor public diamondSquare3D(int zwischenschritte, int anzBreite, int koernung, int seed) { this.zwischenschritte = zwischenschritte; this.breite = 2; while ( this.breite < anzBreite ) this.breite *= 2; this.breite += 1; this.anzBreite = anzBreite; this.koernung = koernung; this.seed = seed; feld_1 = new color[breite+1][breite+1]; feld_2 = new color[breite+1][breite+1]; feld_3 = new color[breite+1][breite+1]; feld_4 = new color[breite+1][breite+1]; this.bilderzaehler = 0; diamondSquare(); bilderzaehler++; diamondSquare(); bilderzaehler++; diamondSquare(); bilderzaehler++; diamondSquare(); bilderzaehler++; this.schritt = 1; //println("breite: " + breite + " anzBreite: " + anzBreite); } // konstruktor private float interpoliere(int tx, int x1, int y1, int x2, int y2) { // einfacher Streckenzug (2bilder). siehe http://de.wikipedia.org/wiki/Spline-Interpolation float f = float(y2-y1)/float(x2-x1); return (f *tx) + y1 - (f *x1); } private float cubicInterpolate( int y0,int y1, int y2,int y3,int schritt) { // kubisch interpolieren: http://local.wasp.uwa.edu.au/~pbourke/other/ float mu = (schritt/float(zwischenschritte)); float a0,a1,a2,a3,mu2; mu2 = mu*mu; a0 = y3 - y2 - y0 + y1; a1 = float(y0 - y1) - a0; a2 = y2 - y0; a3 = y1; return(a0*mu*mu2+a1*mu2+a2*mu+a3); } private float CosineInterpolate( float y1, float y2, float mu) { float mu2; mu2 = (1-cos(mu*PI))/2; return(y1*(1-mu2)+y2*mu2); } public void zeichnen() { if ( schritt>zwischenschritte ) { schritt=1; for (int j=0; jmax ) max=feldf[j][i]; else if ( feldf[j][i]= 2){ for (int i=0; i < ( (breite-1)/b ); i++){ // diamondStep. alle quadrat nehmen und mittelpkt auslenken for (int j=0; j< ( (breite-1)/b ); j++){ aktX = (i*b); aktY = (j*b); farbe = ( feldf[aktX][aktY] + feldf[aktX+b][aktY] + feldf[aktX][aktY+b] + feldf[aktX+b][aktY+b] ) / 4; if ( (b+koernung)*1.41421356f < abstand ) { offset = ((float)(random( (-b-koernung)*1.41421356f , (b+koernung)*1.41421356f ))); } else { int endwert = abstand+(abstand/b); offset = ((float)(random( -endwert , endwert )) ); } feldf[aktX+bh][aktY+bh] = farbe + offset; if (feldf[aktX+bh][aktY+bh]>max) max=feldf[aktX+bh][aktY+bh]; if (feldf[aktX+bh][aktY+bh]max) max=feldf[aktX+bh][aktY]; if (feldf[aktX+bh][aktY]max) max=feldf[aktX][aktY+bh]; if (feldf[aktX][aktY+bh] 2 ) feld_4[i][j] = grau; else { // wird nur für den Anfang gebraucht, siehe zeichnen()->felder umschichten if ( bilderzaehler == 0 ) feld_1[i][j] = grau; if ( bilderzaehler == 1 ) feld_2[i][j] = grau; if ( bilderzaehler == 2 ) feld_3[i][j] = grau; } // if } // for } // for // println("feld " + bilderzaehler); } // diamondSquare() } // class diamondSquare3D