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.
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.
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 :
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!
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
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.
So,
ich habe jetzt das äquivalente Program in C umgesetzt :
#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 :
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:
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...
:-[
Mein Fehler!!!
Ich hab
local d
mit
local d%
gleichgesetzt, folgender Code funktioniert nun!
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!
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 (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.
Ocean:
Epic facepalm of death :noggin:
:good: