<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Perlin-Noise</id>
	<title>Perlin-Noise - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Perlin-Noise"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Perlin-Noise&amp;action=history"/>
	<updated>2026-06-08T02:20:09Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Perlin-Noise&amp;diff=1736864&amp;oldid=prev</id>
		<title>imported&gt;Ugnil: Minetest heißt jetzt anders</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Perlin-Noise&amp;diff=1736864&amp;oldid=prev"/>
		<updated>2026-04-02T11:23:52Z</updated>

		<summary type="html">&lt;p&gt;Minetest heißt jetzt anders&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Datei:Perlin noise.jpg|mini|Zweidimensionales Perlin Noise]]&lt;br /&gt;
[[Datei:2D sample of Perlin noise.png|mini|Fraktales Rauschen durch Überlagern mehrerer Frequenzen]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Perlin Noise&amp;#039;&amp;#039;&amp;#039; ist eine [[Rauschen (Physik)|Rauschfunktion]] auf der Basis von pseudozufälligen [[Gradient]]enwerten an Gitterpunkten. Diese [[Textursynthese]] geht auf [[Ken Perlin]] zurück, der sie 1982 für den Film [[Tron (Film)|Tron]] entwickelte, wofür er 1997 einen [[Oscar/Technische Verdienste#1990 bis 1999|Oscar]] erhielt. Perlin Noise wird häufig in der [[Bildsynthese]] eingesetzt, um natürliche Phänomene wie Wolken, Landschaftstopologien oder Wasser zu simulieren.&lt;br /&gt;
&lt;br /&gt;
In vielen [[Open-World-Spiel]]en, z. B. [[Minecraft]] oder [[Luanti]], wird Perlin-Noise verwendet, um Landschaften zu generieren.&lt;br /&gt;
&lt;br /&gt;
Im einfachen Fall erhält man eine unregelmäßig wellenförmig verlaufende [[Funktion (Mathematik)|Funktion]] in einer oder mehreren Dimensionen, deren [[Frequenz]] sich aus dem [[Abstand]] der Gitterpunkte ergibt. Perlin Noise kann als [[Fraktal|fraktale]] Funktion dargestellt werden, indem man mehrere einfache Rauschfunktionen verschiedener Frequenzen (typischerweise mit dem Faktor 2 zur vorhergehenden) definiert und durch Addition der Funktionswerte überlagert.&lt;br /&gt;
&lt;br /&gt;
Die Größe der zufälligen Variationen, die bei natürlichen Phänomenen vorkommen, hängt vom Maßstab ab, in dem diese Phänomene betrachtet werden. Durch Ändern der [[Frequenz]] des Rauschens kann man unterschiedliche [[Textur (Oberflächenattribut)|Texturen]] erhalten. Die Eigenschaft, dass sich wiederholende Muster in unterschiedlichen Maßstäben vorkommen, wird als [[Selbstähnlichkeit]] bezeichnet und ist für viele Phänomene in Wissenschaft und Natur grundlegend. Mittels Perlin Noise kann man Zufallsrauschen erzeugen, das auf verschiedenen Skalen selbstähnlich ist, und somit zufällige [[Fraktal|fraktale]] Objekte modellieren.&lt;br /&gt;
&lt;br /&gt;
== Definition ==&lt;br /&gt;
Perlin Noise ist ein [[Textursynthese#Prozedurale Verfahren|prozedurales]] Gradientrauschen. Es werden regelmäßig angeordnete ([[Äquidistanz (Geometrie)|äquidistante]]) Gitterpunkte festgelegt, und jedem wird ein [[Pseudozufällig|pseudozufälliger]] [[Gradient (Mathematik)|Gradient]] zugeordnet, dem die Rauschfunktion in der Nähe dieses Gitterpunktes folgt. Diese Gradienten müssen konstant sein, damit die Textur nicht bei jedem Zugriff anders aussieht. Sie werden entweder vorab in einem [[Feld (Datentyp)|Array]] gespeichert oder bei jedem Zugriff per [[Pseudozufällige Funktion|Pseudozufallsfunktion]] aus den ganzzahligen Koordinatenwerten des Gitterpunkts berechnet.&lt;br /&gt;
&lt;br /&gt;
Zwischen den Werten, die sich für die nächstgelegenen Gitterpunkte ergeben, wird [[Interpolation (Mathematik)|interpoliert]], wodurch man je nach Wahl der Interpolationsfunktion eine einmal oder sogar zweimal [[Differenzierbarkeit#Stetige Differenzierbarkeit und höhere Ableitungen|stetig differenzierbare]] Rauschfunktion erhalten kann.&lt;br /&gt;
&lt;br /&gt;
Für fraktales Rauschen überlagert (addiert) man mehrere verschiedene Rauschfunktionen mit verschiedenen Frequenzen (Gitterteilungen). Bei der höchsten Frequenz sollte der Abstand der Gitterpunkte nicht kleiner als der zweifache [[Pixel]]abstand sein, da höhere Frequenzen nur noch zu [[Alias-Effekt]]en führen würden. Je niedriger die Frequenz, desto größer ist der Bereich, über den interpoliert wird, was einen flacheren Gradienten der Rauschfunktion ergibt. Deshalb macht man meist die [[Amplitude]] des Rauschens von der Gittergröße, d.&amp;amp;nbsp;h. dem Abstand der Gitterpunkte, abhängig.&lt;br /&gt;
&lt;br /&gt;
== Eine Dimension ==&lt;br /&gt;
Um Perlin Noise in einer Dimension zu generieren, ordnet man jedem [[Ganze Zahl|ganzzahligen]] [[Koordinatensystem|Koordinatenwert]] &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; einen pseudozufälligen [[Gradient]]en &amp;lt;math&amp;gt;g_i&amp;lt;/math&amp;gt; (eine [[Steigung]]) der Funktion zu. In der Umgebung des Punkts &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, wenn also &amp;lt;math&amp;gt;x \approx i&amp;lt;/math&amp;gt;, folgt der Rausch[[funktionswert]] näherungsweise der [[Lineare Funktion|linearen Funktion]] &amp;lt;math&amp;gt;f_i(x) = (x-i)\cdot g_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für einen Punkt &amp;lt;math&amp;gt;x \in \R&amp;lt;/math&amp;gt; zwischen zwei ganzzahligen Punkten &amp;lt;math&amp;gt;i &amp;lt; x &amp;lt; j = i+1&amp;lt;/math&amp;gt; wird zwischen den Funktionswerten &amp;lt;math&amp;gt;f_i(x)&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;f_j(x)&amp;lt;/math&amp;gt; interpoliert:&lt;br /&gt;
:&amp;lt;math&amp;gt;f(x) = f_i(x) h(j-x) + f_j(x) (1-h(j-x)); \quad i \le x &amp;lt; j, \; h(0) = 0, \, h(1) = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diese Interpolation ist in der Regel nicht linear über dem [[Abstand]] &amp;lt;math&amp;gt;j-x&amp;lt;/math&amp;gt;, weil sonst die [[Ableitung (Mathematik)|Ableitung]] der Funktion an den ganzzahligen Punkten nicht [[Stetige Funktion|stetig]] wäre. Stattdessen wird eine Interpolationsfunktion &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; verwendet, deren Ableitung an den Punkten &amp;#039;&amp;#039;0&amp;#039;&amp;#039; und &amp;#039;&amp;#039;1&amp;#039;&amp;#039;, also bei &amp;lt;math&amp;gt;x=i&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;x=j&amp;lt;/math&amp;gt;, gleich Null ist. Ursprünglich verwendete Ken Perlin [[Kubisch Hermitescher Spline|kubisch hermitesche Splines]] wie etwa &amp;lt;math&amp;gt;h(x) = 3x^2-2x^3&amp;lt;/math&amp;gt;, aber weil es oft wünschenswert ist, dass &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; überall eine stetige zweite [[Ableitung (Mathematik)|Ableitung]] hat, schlug er später [[Polynom]]e vom Grad 5 vor, die das ermöglichen.&lt;br /&gt;
&lt;br /&gt;
== Zwei Dimensionen ==&lt;br /&gt;
[[Datei:PerlinNoiseInterpolated.png|mini|Gitter mit Gradientenvektoren und resultierender Rauschfunktion]]&lt;br /&gt;
&lt;br /&gt;
Auf die zu texturierende Oberfläche wird ein [[Gitter (Geometrie)|Quadratgitter]] gelegt. Jedem Gitterpunkt &amp;lt;math&amp;gt;q_{i,j}&amp;lt;/math&amp;gt; ist ein [[2D|zweidimensionaler]], [[Pseudozufall|pseudozufälliger]], in der Regel normierter Gradientenvektor &amp;lt;math&amp;gt; \vec g_{i,j}&amp;lt;/math&amp;gt; zugeordnet. Nahe einem Gitterpunkt folgt der Funktionswert wie im eindimensionalen Fall einer linearen Funktion ([[Schiefe Ebene]]), deren Steigung vom Gradientenvektor gegeben ist, wobei auch hier der Wert am Gitterpunkt Null ist.&amp;lt;ref&amp;gt;Stefan Gustavson, Linköping University: [https://weber.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf Simplex noise demystified]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um für einen Punkt &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; den Wert &amp;lt;math&amp;gt;f(p)&amp;lt;/math&amp;gt; der Rauschfunktion zu ermitteln, wird zunächst die Zelle des Quadratgitters bestimmt, in die er fällt. &amp;lt;math&amp;gt;q_{i,j}&amp;lt;/math&amp;gt; sei die linke untere Ecke. Für jeden Eckpunkt &amp;lt;math&amp;gt;q_{m,n}&amp;lt;/math&amp;gt; dieser Zelle berechnet man das [[Skalarprodukt]] des Gradientenvektors mit dem Vektor von &amp;lt;math&amp;gt;q_{m,n}&amp;lt;/math&amp;gt; zu &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;s_{m,n}=\vec g_{m,n}\cdot(p-q_{m,n}); \quad m = i,i+1, \; n = j,j+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Diese vier Werte werden nun [[Interpolation (Mathematik)|interpoliert]] mittels einer Überblendfunktion &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, die von &amp;lt;math&amp;gt;h(0) = 0&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;h(1) = 1&amp;lt;/math&amp;gt; ansteigt:&lt;br /&gt;
:&amp;lt;math&amp;gt;f_0(p) = s_{i,j} \cdot h(1-x) + s_{i+1,j} \cdot h(x)&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;f_1(p) = s_{i,j+1} \cdot h(1-x) + s_{i+1,j+1} \cdot h(x)&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;f(p) = f_0(p) \cdot h(1-y) + f_1(p) \cdot h(y)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Dabei sind &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; die Koordinaten von &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; bezüglich des linken unteren Gitterpunkts &amp;lt;math&amp;gt;q_{i,j}&amp;lt;/math&amp;gt;, normiert auf &amp;lt;math&amp;gt;x,y \in [0,1]&amp;lt;/math&amp;gt;. In der Regel wird das Gitter zur Vereinfachung der Rechnung normiert und an den Koordinatenachsen ausgerichtet, so dass &amp;lt;math&amp;gt;q_{i,j} = (i,j)&amp;lt;/math&amp;gt;, und der Punkt, an dem die Rauschfunktion auszuwerten ist, wird vor der Berechnung zu &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; transformiert (durch multiplizieren seiner Komponenten mit der Frequenz). Dann sind &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; einfach die Komponenten von &amp;lt;math&amp;gt;p-q_{i,j}&amp;lt;/math&amp;gt;. Allgemeiner gilt:&lt;br /&gt;
:&amp;lt;math&amp;gt;x = \frac{(q_{i+1,j}-q_{i,j}) \cdot (p-q_{i,j})}{(q_{i+1,j}-q_{i,j})^2}, \; y = \frac{(q_{i,j+1}-q_{i,j}) \cdot (p-q_{i,j})}{(q_{i,j+1}-q_{i,j})^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als Überblendfunktion kann die smoothstep-Funktion &amp;lt;math&amp;gt;h(x) = x^2(3-2x)&amp;lt;/math&amp;gt; dienen, mit der die erste Ableitung der Rauschfunktion an den Grenzen der Zellen stetig ist. Weil je nach Anwendungsfall der Übergang noch ungleichmäßig aussehen kann, wird oft die Funktion 5. Grades &amp;lt;math&amp;gt;h(x) = x^3(6x^2-15x+10)&amp;lt;/math&amp;gt; verwendet, mit der auch die zweite Ableitung stetig ist, d.&amp;amp;nbsp;h., wenn man die Rauschfunktion &amp;lt;math&amp;gt;f(p)&amp;lt;/math&amp;gt; als Fläche über der &amp;lt;math&amp;gt;x,y&amp;lt;/math&amp;gt;-Ebene darstellt, ändert sich ihre Krümmung nirgends sprunghaft. Für beide gilt &amp;lt;math&amp;gt;h(1-x) = 1-h(x)&amp;lt;/math&amp;gt;, so dass man die Funktion nur zweimal (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; mal in &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Dimensionen) auswerten muss.&lt;br /&gt;
&lt;br /&gt;
== Mehr Dimensionen ==&lt;br /&gt;
Das Verfahren kann auf beliebig viele Dimensionen verallgemeinert werden. In &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Dimensionen muss man entsprechend die Skalarprodukte an den &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; Ecken eines Hyperwürfels berechnen und interpolieren. Der Rechenaufwand wächst also exponentiell mit der Zahl der Dimensionen. Um dem abzuhelfen, stellte Perlin im Jahr 2001 den Nachfolger [[Simplex Noise]] vor, welcher in &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Dimensionen nur &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; Gitterpunkte an den Ecken eines [[Simplex (Mathematik)|Simplex]] auswertet.&lt;br /&gt;
&lt;br /&gt;
== Bestimmung der Gradienten ==&lt;br /&gt;
Um den Gradientenvektor an einem Gitterpunkt zu erhalten, werden zunächst die Koordinaten des Gitterpunkts [[Hashfunktion|gehasht]]. Entweder berechnet man die Komponenten des Gradientenvektors direkt aus dem Hash, oder der Hash dient als Index, um einen Gradientenvektor aus einer vorberechneten Tabelle auszulesen.&lt;br /&gt;
&lt;br /&gt;
Die originale [[Implementierung]] von Ken Perlin nutzt als Hashfunktion ein Feld &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; mit 512 Elementen, das eine Zufallspermutation der Zahlen 0 bis 255 zweimal nacheinander enthält; es ist &amp;lt;math&amp;gt;P_i = P_{i+256}&amp;lt;/math&amp;gt;. Die Koordinaten &amp;lt;math&amp;gt;i,j,k,\cdots&amp;lt;/math&amp;gt; des Gitterpunkts werden modulo 256 als Indizes genommen (durch [[Bitweiser Operator#UND|bitweises UND]] mit der Konstante 255, das schneller ist als eine Division):&lt;br /&gt;
:&amp;lt;math&amp;gt;a_1 = P_{i \bmod 256}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;a_2 = P_{a_1 + (j \bmod 256)}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;a_3 = P_{a_2 + (k \bmod 256)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Der Hashwert ist dann &amp;lt;math&amp;gt;a_n&amp;lt;/math&amp;gt; im &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-dimensionalen Fall. Statt der Addition kann man auch das [[Bitweiser Operator#XOR|bitweise XOR]] nutzen, dann muss &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; nur 256 Elemente haben (&amp;lt;math&amp;gt;a_2 = P_{a_1 \oplus (j \bmod 256)}&amp;lt;/math&amp;gt;), oder die Modulodivision wird erst nach der Addition gemacht (&amp;lt;math&amp;gt;a_2 = P_{(a_1 + j) \bmod 256}&amp;lt;/math&amp;gt;). Man kann außerdem einen Schritt des Hashverfahrens einsparen, indem man bereits mit &amp;lt;math&amp;gt;a_2 \oplus (k \bmod 256)&amp;lt;/math&amp;gt; (im dreidimensionalen Fall) das Feld mit den Gradientenvektoren indiziert, welches dann entsprechend 256 Vektoren enthält, die zufällig permutiert sind.&lt;br /&gt;
&lt;br /&gt;
Dieses Hashverfahren durch Feldzugriff ergibt allerdings eine periodische Textur, die sich alle 256 Gitterpunkte wiederholt. In der Regel fällt das aber nicht auf, denn wenn der Bildausschnitt so groß ist, dass mehr als eine Periode zu sehen ist, dann ist das Rauschen bereits so feinkörnig, dass der Betrachter es kaum noch im Einzelnen auflösen kann. Auch werden meist mehrere Rauschfunktionen mit unterschiedlicher Frequenz überlagert, was die Periode noch besser unkenntlich macht.&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Das folgende [[Computerprogramm]] in der [[Programmiersprache]] [[C++]] zeigt eine einfache, nicht auf Effizienz ausgelegte Implementierung des zweidimensionalen Perlin Noise.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Diese Funktion interpoliert zwischen a0 bei x=0 und a1 bei x=1. x muss im Intervall [0, 1] liegen.&lt;br /&gt;
float interpolate(float a0, float a1, float x)&lt;br /&gt;
{&lt;br /&gt;
    float g; // Gewicht für die Interpolation&lt;br /&gt;
    //g = x; // lineare Interpolation; ergibt stetiges, aber nicht differenzierbares Rauschen&lt;br /&gt;
    g = (3.0 - x * 2.0) * x * x; // kubische Interpolation mit dem Polynom 3 * x^2 - 2 * x^3&lt;br /&gt;
    //g = ((x * (x * 6.0 - 15.0) + 10.0) * x * x * x); // Interpolation mit dem Polynom 6 * x^5 - 15 * x^4 + 10 * x^3&lt;br /&gt;
    return (a1 - a0) * g + a0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Datentyp für zweidimensionale Vektoren&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
    float x, y;&lt;br /&gt;
} vector2;&lt;br /&gt;
&lt;br /&gt;
// Diese Funktion erzeugt den pseudozufälligen Gradientenvektor für den Gitterpunkt (ix,iy)&lt;br /&gt;
vector2 randomGradient(int ix, int iy)&lt;br /&gt;
{&lt;br /&gt;
    const unsigned w = 8 * sizeof(unsigned);&lt;br /&gt;
    const unsigned s = w / 2;&lt;br /&gt;
    unsigned a = ix, b = iy;&lt;br /&gt;
    a *= 3284157443;&lt;br /&gt;
    b ^= a &amp;lt;&amp;lt; s | a &amp;gt;&amp;gt; w-s;&lt;br /&gt;
    b *= 1911520717;&lt;br /&gt;
    a ^= b &amp;lt;&amp;lt; s | b &amp;gt;&amp;gt; w-s;&lt;br /&gt;
    a *= 2048419325;&lt;br /&gt;
    float random = a * (3.14159265 / ~(~0u &amp;gt;&amp;gt; 1)); // Erzeugt eine Zufallszahl im Intervall [0, 2 * Pi]&lt;br /&gt;
    vector2 v;&lt;br /&gt;
    v.x = cos(random);&lt;br /&gt;
    v.y = sin(random);&lt;br /&gt;
    return v; // v hat den Betrag 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Diese Funktion berechnet das Skalarprodukt von Abstandsvektor und Gradientenvektor&lt;br /&gt;
float dotGridGradient(int ix, int iy, float x, float y)&lt;br /&gt;
{&lt;br /&gt;
    vector2 grad = randomGradient(ix, iy);&lt;br /&gt;
    // Berechne den Abstandsvektor:&lt;br /&gt;
    float dx = x - (float) ix;&lt;br /&gt;
    float dy = y - (float) iy;&lt;br /&gt;
    return dx * grad.x + dy * grad.y; // Skalarprodukt&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Diese Funktion berechnet den Wert des Perlin noise für den Punkt (x, y)&lt;br /&gt;
// Das Ergebnis liegt im Intervall [-1/sqrt(2), 1/sqrt(2)]&lt;br /&gt;
float perlin(float x, float y)&lt;br /&gt;
{&lt;br /&gt;
    // Bestimme die Koordinaten der vier Ecken der Gitterzelle:&lt;br /&gt;
    int x0 = (int) floor(x);&lt;br /&gt;
    int x1 = x0 + 1;&lt;br /&gt;
    int y0 = (int) floor(y);&lt;br /&gt;
    int y1 = y0 + 1;&lt;br /&gt;
&lt;br /&gt;
    // Bestimme die Abstände von den Gitterpunkten für die Interpolation:&lt;br /&gt;
    float sx = x - (float)x0;&lt;br /&gt;
    float sy = y - (float)y0;&lt;br /&gt;
&lt;br /&gt;
    // Interpoliere zwischen den Skalarprodukten an den vier Ecken:&lt;br /&gt;
    float n0, n1, ix0, ix1;&lt;br /&gt;
    n0 = dotGridGradient(x0, y0, x, y);&lt;br /&gt;
    n1 = dotGridGradient(x1, y0, x, y);&lt;br /&gt;
    ix0 = interpolate(n0, n1, sx);&lt;br /&gt;
    n0 = dotGridGradient(x0, y1, x, y);&lt;br /&gt;
    n1 = dotGridGradient(x1, y1, x, y);&lt;br /&gt;
    ix1 = interpolate(n0, n1, sx);&lt;br /&gt;
&lt;br /&gt;
    return interpolate(ix0, ix1, sy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Ken Perlin: [https://mrl.cs.nyu.edu/~perlin/doc/oscar.html Noise and Turbulence]&lt;br /&gt;
* Dave Mount, University of Maryland: [https://www.cs.umd.edu/class/fall2019/cmsc425/handouts/lect14-perlin.pdf Procedural Generation: Perlin Noise]&lt;br /&gt;
* Scratchapixel: [https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/perlin-noise-part-2 Perlin Noise: Part 2]&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Algorithmus (Computergrafik)]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Ugnil</name></author>
	</entry>
</feed>