Perlin Noise

Previous topic - Next topic

CptnRoughnight

Hi,
ich beschäftige mich für mein OpenPandora Spiel mit Perlin Noise, möchte den Algo verwenden um die Landschaft zu generieren.
Allerding hapert es an der Umsetzung der Berechnung. Schon der 1D-Noise Algo funzt nicht.

Code (glbasic) Select

x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);


Diesen Code hab ich versucht mittels GLBasic Befehle umzusetzen.

Code (glbasic) Select

FUNCTION Noise#:n%
LOCAL d#
d = bXOR(ASL(n,13),n)

RETURN (1.0 - bAND((d * (d * d * 15731 + 789221) + 1376312627),2147483647) / 1073741824.0)
ENDFUNCTION


Wenn ich mir mittels der Funktion ein Array fülle und die resultierende Linie (Noise gibt Y-Abweichung an) zeichnen lasse,
dann bekomm ich nur im 1. Arrayfeld eine Abweichung, ansonsten sind es die gleichen Werte.
Hab ich die falschen Befehle genommen?

Das Füllen des Array&Zeichnen :

Code (glbasic) Select

FOR x= 0 TO 100
map[x] = INTEGER(Noise(x))*10
DRAWRECT x*10,100+map[x],10,10,RGB(0,0,255)
NEXT


p.s. das ist alles noch quick&dirty um den Algo zu testen. :)

Ich hoffe auf Hilfe!

kanonet

Habe mal kurz nach dem original code gesucht, dort ist x ein int, du kannst also bei dir d nicht zu einem # (ist ein float) machen. Aber generell kenne ich mich mit Perlin noise nicht aus, wäre es nicht vielleicht einfacher und besser stattdessen ein bereits funktionierendes Stück GLB Code zu nutzen? Z.B. das hier: http://www.glbasic.com/forum/index.php?topic=9014.msg76927
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

CptnRoughnight

Danke für den Hinweis, daran lag es aber nicht. :)

Simplex hab ich mir angeschaut und bleibt im Hinterkopf.

Mir gehts vorallem darum den Algo in GLBasic umzusetzen, den Lerneffekt dabei.

CptnRoughnight

So,

ich habe jetzt das äquivalente Program in C umgesetzt :

Code (glbasic) Select

#include <math.h>
#include <stdio.h>

float noise(int x)
{
x=(x<<13)^x;

return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}

int main(void)

{
int i;

for(i=0;i<=10;i++)
printf("X(%i)\t = %f \n",i,noise(i));

getchar();
return 0;
}


Ausgabe :
Code (glbasic) Select

X(0)     = -0.281791
X(1)     = -0.226373
X(2)     = 0.293633
X(3)     = -0.257185
X(4)     = 0.585761
X(5)     = -0.712941
X(6)     = 0.311297
X(7)     = 0.123063
X(8)     = -0.813056
X(9)     = -0.032470
X(10)    = 0.929408


Meine GLBasic Ausgabe sieht folgendermaßen aus:

Code (glbasic) Select

X(0)     = -0.2817910193
X(1)     = 1
X(2)     = 1
X(3)     = 1
X(4)     = 1
X(5)     = 1
X(6)     = 1
X(7)     = 1
X(8)     = 1
X(9)     = 1
X(10)   = 1


Ich müsste jetzt raten woran das liegt, der erste Wert wird ja richtig berechnet. Kann es evtl. sein das die bAnd Befehle keine floats bearbeiten und daher der Fehler kommt. Oder hab ich die falschen Befehle verwendet? Aus meiner Sicht müssten es zwei identische Programme sein. Ich komm echt nicht weiter...

CptnRoughnight

 :-[

Mein Fehler!!!

Ich hab

Code (glbasic) Select

local d


mit

Code (glbasic) Select

local d%


gleichgesetzt, folgender Code funktioniert nun!

Code (glbasic) Select

FUNCTION Noise#:n%
LOCAL d%
d = bXOR(ASL(n,13),n)

RETURN (1.0 - (bAND((d * (d * d * 15731 + 789221) + 1376312627),2147483647)) / 1073741824.0)
ENDFUNCTION



wobei der Schritt mit d nicht sein muss.

Sry für Mehrfachpost... Nun kanns losgehen!

CptnRoughnight

Hi,

ich bin nach der Auflistung vorgegangen :
http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren#Bitweises_exklusives_ODER_.28XOR.29_.5E

Und das ist identisch mit der Erklärung auf XNA.mag :

Quote
zur Erklärung:
"<<" ist der Left-Shift-Operator
"^" ist ein binäres XOR
"&" ist ein binäres AND
"0x7fffffff" ist die Hez-Zahl für 2.147.483.647, also Int32.MaxValue
15731, 789221, 1376312627 sind hohe Primzahlen
1073741824.0f ist (Int32.MaxValue + 1) / 2
Diese Funktion liefert Zahlen von -1 bis 1 zurück, die schön zufällig aussehen Smile

Und die äquivalente Funktion ist doch bXOR, oder täusche ich mich da. Ein exklusives Oder auf Bitebene.

Schranz0r

Ocean:

Epic facepalm of death   :noggin:






:good:
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard