Zitat: Als grundlegende Erklärung ist der Artikel von Lyr jedenfalls recht gut zu gebrauchen und ich bin froh, dass ich den entdeckt hab. Naja das ist in meinen Augen auch das was das Wiki sein sollte. Für komplette Sourcecodes und dergleichen ist das Wiki meines Erachtens nicht unbedingt geeignet weils ja nicht mal solche Sachen wie Syntax Highlighting ohne viel Aufwand gibt.
Ich kann dir wennst willst meinigen Source dazu geben, der is allerdings in C++.
Zitat: Rand liefert hier einen Wert für eine 1 Dimensionale Positionsangabe (X - Ganzzahl) einen Wert zwischen -1 und 1.
Soll bedeuten, dass als Eingabe ein Integer (am besten ohne Vorzeichen ... wie hieß der noch mal in Delphi? :-) ) erwartet wird und die Ausgabe ein float im Bereich [-1|1] ist.
Das "-" beim "X - Ganzzahl" ist also ein Bindestrich kein Minus.
Wobei mir grad auffällt das der Source dazu eh ned ganz stimmen dürfte. Hab den Teil damals von irgendwo her versucht in Delphi zu übersetzen aber offenbar war diese Quelle nicht ganz so toll oder ich war damals zu dumm das richtig zu übersetzen ... . Also das Round kommt mir etwas komisch vor, weiß leider nimmer wieso ich das gemacht habe. Hier zur Sicherheit noch mal ne Erklärung in Prosa :-):
(x * (x * x * 15731 + 789221) + 1376312589) ist einfach ne Funktion mit groooßen Primzahlen (einfach aus ner Primzahlentabelle irgendwelche Werte nehmen, bleibt sich ziemlich egal).
and $7fffffff auf eine (positive) 32 Bit-Zahl bringen, wenn man unsigned integer verwendet kann man das auch weg lassen wenn man dafür mit $80000000 dividiert anstatt mit 1073741824 (= $40000000) wie im Artikel. Das Ergebniss dieser Division muss nun natürlich ein float sein weshalb man in C(++) auch 1073741824.0f (f steht für float-Zahl) schrieben sollte und nicht die Hex-Schreibweise. Wie das mit den Datentypen in Delphi so gehandhabt wird weiß ich ned so genau.
Und noch ein kleiner Hinweis am Rande für ein schöneres Perlin Noise. Im Artikel steht was von linearer Interpolation, ist zwar ausreichend aber nicht soo toll. Ich verwende da eine quadratische Interpolation die schon sehr nah an eine cos-Interpolation kommt ... hier (wie solls auch anders sein) der C++ Code dafür :-):
Code: V1 und V2 ... zu interpolierende Werte Step ... Wert im Bereich 0 bis 1 float Interpolate( float V1, float V2, float Step) { float Fact; if( Step > 0.5f ) { Fact = (1.0f - Step); Fact = Fact * Fact * 2.0f; } else { Fact = 1.0f - Step * Step * 2.0f; } return V1 * Fact + V2 * (1.0f - Fact); }
Die ganzen Interpolationsfunktionen wollt ich eigentlich in nen eigenen Bereich geben weil es ja nicht nur für Perlin Noise zu gebrauchen ist ...
Hoffe etwas mehr Klarheit in das ganze gebracht zu haben. Und ich würd mich freuen wenn du meine Fremdsprachenfehler die ich bei Delphi begangen habe etwas aufklären könntest :-).
|