2017-02-04 6 views
0

Eine Übung in Shiffman Nature of Code fragt mich, Perlin Noise mit Processing noise() Funktion zu erstellen. Hier ist mein Code habe ich Perlin NoiseWarum ist dieses Perlin Noise-Bild weicher als das andere?

float xSpace = 0; // Signifies "space" between noise() values on the x coordinate. 
float ySpace = 0; // Signifies "space" between noise() values on the y coordinate. 


void setup(){ 
    size(500,500); 
    background(0); 
    loadPixels(); 

    for(int x = 0; x < width; x++) { 
    for(int y = 0; y < height; y++) { 
     float bright = map(noise(xSpace,ySpace),0,1,0,255); 
     pixels[(y * width) + x] = color(bright); 
     //Each pixel in the pixels[] array is a color element. 
     ySpace = ySpace + 0.01; 
    } 
    xSpace = xSpace + 0.01 ; 
    } 
    updatePixels(); 
} 

Und zu erstellen, wenn ich meinen Code ausführen, erstellt es ein Bild wie dieses

mySolution

ich an der Lösung in dem Lehrbuch aussehen. Die Lösung des Lehrbuchs und meine Lösung sind fast identisch, außer dass das Lehrbuch bei jeder Iteration der äußeren Schleife ySpace zurück auf 0 reinitialisiert.

// Textbook's solution 

     for(int x = 0; x < width; x++) { 
      ySpace = 0; 
     for(int y = 0; y < height; y++) { 
      float bright = map(noise(xSpace,ySpace),0,1,0,255); 
      pixels[(y * width) + x] = color(bright); 
      ySpace = ySpace + 0.01; 
     } 
     xSpace = xSpace + 0.01 ; 
     } 

Allerdings, wenn ich das Lehrbuch des Code ausführen, erstellt der Code eine viel glattere Bild wie dieses

textbookSolution

Warum, wenn ySpace in der äußeren Schleife neu initialisiert wird, wird das Bild kommen viel glatter als das, wenn es nicht ist? Mit anderen Worten, warum erstellt der Code des Lehrbuchs ein viel glatteres Bild als mein Code?

Ich bemerkte, dass die ySpace in meinem Code deutlich größer als die ySpace im Code des Lehrbuchs ist, sobald die for-Schleife abgeschlossen ist. Aber ich bin mir nicht sicher, ob das der Grund dafür ist, dass das Bild meines Codes nicht so glatt ist. Aus meinem Verständnis erzeugt Rauschen (x, y) 2d Perlin Noise. Wenn das Pixel auf ein Pixel angewendet wird, sollte es eine ähnliche Farbe wie die umgebenden Pixel haben, aber es sieht nicht so aus, als würde es in meinem Code vorkommen.

+1

Nicht sicher, was die Frage hier ist. Sie haben einen grundlegenden Parameter des Algorithmus geändert und sind überrascht, wenn die Ergebnisse nicht mit dem unmodifizierten Algorithmus übereinstimmen. Beachten Sie, dass der Buchcode "ySpace" nicht innerhalb der ersten Schleife "initialisiert" - it *** re *** initialisiert den Wert auf Null bei jeder Iteration der äußeren Schleife. –

+0

Ok, ich habe meinen Beitrag bearbeitet, um meinen Fehler zu korrigieren. Ist die Reinitialisierung von "ySpace" der Grund, warum das Bild des Lehrbuchs viel glatter ist als meines? –

Antwort

1

Die Funktion noise() nimmt im Wesentlichen eine 2D-Koordinate (oder eine 3D-Koordinate oder eine einzelne Zahl, aber in Ihrem Fall eine 2D-Koordinate) und gibt basierend auf dieser Koordinate eine Zufallszahl zurück. Koordinaten, die näher beieinander liegen, werden Zufallszahlen erzeugen, die näher beieinander liegen.

In diesem Sinne denken Sie darüber nach, was Ihr Code tut und was das Lehrbuch tut. Das Lehrbuch füttert eine x,y Koordinate basierend auf der Position im Fenster, was sinnvoll ist, da dort der resultierende Zufallswert gezeichnet wird.

Aber Ihr Code erhöht die y Koordinate, egal was. Dies könnte sinnvoll sein, wenn Sie nur eine einzelne Pixelspalte haben, die gerade weitergeht, aber Sie versuchen, die Pixel auf dem Bildschirm zu durchlaufen.

Verwandte Themen