Einführung
Dies ist weniger eine Anleitung zur Verwendung von 2D-Simplex-Rauschen als vielmehr eine Suche nach einem Verständnis dafür, was sowohl in der Mathematik als auch visuell geschieht. Ich möchte den gefundenen Code lieber nicht kopieren und einfügen. Ich würde es wirklich gerne verstehen.
Ich habe meine Hausaufgaben zu diesem Thema gemacht und Stefan Gustavsons Artikel und andere Quellen viele Male gelesen . Ich habe das Gefühl, dass ich ungefähr 70% von dem verstehe, was meine Quellen sagen, aber wenn ich versuche, meiner Codeschleife manuell zu folgen, um mein Verständnis zu überprüfen, werde ich entweder daran gehängt, was die Variablen darstellen, oder die Mathematik passt einfach nicht zusammen.
Ich habe begonnen, die Variablen in dem Code, den ich gefunden habe, umzubenennen, um besser zu verstehen, was los ist. Wenn jemand mit etwas Wissen darüber, was tatsächlich passiert, den Originalcode (im Grunde Gustavsons Code) mit meinem Code vergleichen kann , wäre das am besten. Ich bin mit dem Umbenennen der Variablen jedoch noch nicht fertig, auch weil ich nicht weiterkomme.
Mein Verständnis
Angenommen, ich übergebe Pixel (2, 3) in meine Rauschfunktion. An diesem Punkt arbeite ich mit einem normalen Gitter und mein Ziel ist es, dieses normale Gitter in einen Simplex zu übersetzen. Dieser Simplex hat die Form vieler Dreiecke, da wir in 2D arbeiten, und angeblich ist dies aus verschiedenen Gründen besser.
Um diesen Punkt vom normalen Gitter in das Simplex-Gitter zu übersetzen, muss ich den Punkt entlang der diagonalen Hauptlinie skalieren. Danach interessieren mich die Dezimalstellen anscheinend nicht mehr, da ich dann die Ergebnisse auf den Boden lege und sie wieder in die Nähe des nächsten vorherigen Gitterpunkts bringe.
Jetzt werde ich die Simplex-Zelle am normalen Raster ausrichten, indem ich die Simplex-Zelle abschiebe. Warum ich all diese Arbeit mache, um zur Simplex-Zelle zu gelangen, und sie dann rückgängig mache, ist mir ziemlich unklar. Im Ernst, ich denke, der beste Weg für mich, dies zu verstehen, ist, wenn jemand in Schritten herausfinden könnte, was zum Teufel hier vor sich geht. Super verloren.
Ich bin aber nicht mit leeren Händen weggegangen. Ich habe jetzt, wie ich glaube, den Abstand zwischen dem ursprünglichen Gitterpunkt, den ich passiert habe, und dem Simplex-Punkt, den ich von diesem ursprünglichen Gitterpunkt übersetzt habe. Woo.
Ich denke, ich werde hier vorerst aufhören, nur weil ich nicht möchte, dass daraus eine riesige Textwand wird. Ich bin mir ziemlich sicher, dass der Rest davon klicken wird, sobald ich den Anfangsteil verstanden habe.
Seltsame Mathematik
Mit dem Punkt (2, 3) von früher erhalte ich Folgendes, wenn ich meinen eigenen Code auf Papier durchlaufe:
x = 2
y = 3
skewfactor = 1.830
unskewFactor = 1.479
unskewed_x = 1.520
unskewed_y = 2.520
simplexCell_i = 3
simplexCell_j = 4
x_distance0 = -1.520
y_distance0 = -1.520
i1 = 0
j1 = 1
x1 = -1.309
y1 = -2.309
x2 = -2.5207
y2 = -2.5207
ii = no idea why this isn't i2 or something like that. No idea what this is.
jj = same
Ich bin mir nicht sicher, ob das Plotten in einem Diagramm funktionieren würde, aber ich habe es versucht und es sieht so schlecht aus. Ich habe die ursprünglichen Parameter (2, 3) verwendet, simplexCell_i & j, i1, j1, x1, y1, x2 und y2. Macht visuell keinen Sinn.
Nicht nur visuell, sondern auch mathematisch. Was ist mit (2, 3), die negative Zahlen zurückgeben, die vom Chart abweichen? Was mache ich hier falsch?
quelle
x_distance0 - 1.0f + 2.0f * unskew
Teil tritt nur um eine Einheit im gequetschten Gitter vor. Aufgrund der Art und Weise, wie die Vereinfachungen angeordnet sind, sind ihre Ecken in gequetschten Gitterkoordinaten wie (i, j), entweder (i + 1, j) oder (i, j + 1) und schließlich (i + 1, j) +1). Der Versatz von (1,1) im gequetschten Gitter wird in einen Versatz von-1.0f + 2.0f * unskew
in regulären Koordinaten übersetzt. (Es ist minus, weil Sie den Vektor versetzen, der von der Ecke zum ursprünglichen Eingabepunkt zeigt. Wenn Sie also die Ecke verschieben, erhalten Sie einen negativen Versatz zu diesem Vektor.)