Author Topic: Perlin Noise  (Read 3563 times)

Offline CptnRoughnight

  • Mr. Polyvector
  • ***
  • Posts: 114
    • View Profile
Perlin Noise
« on: 2013-Sep-11 »
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!
Es ist kein Mond....

A young band from Thuringia with a lot of potential :
http://youtu.be/diMBlNspsD8

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1137
    • View Profile
    • My GLBasic code archiv
Re: Perlin Noise
« Reply #1 on: 2013-Sep-11 »
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

Offline CptnRoughnight

  • Mr. Polyvector
  • ***
  • Posts: 114
    • View Profile
AW: Perlin Noise
« Reply #2 on: 2013-Sep-11 »
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.
Es ist kein Mond....

A young band from Thuringia with a lot of potential :
http://youtu.be/diMBlNspsD8

Offline CptnRoughnight

  • Mr. Polyvector
  • ***
  • Posts: 114
    • View Profile
Re: Perlin Noise
« Reply #3 on: 2013-Sep-11 »
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...
Es ist kein Mond....

A young band from Thuringia with a lot of potential :
http://youtu.be/diMBlNspsD8

Offline CptnRoughnight

  • Mr. Polyvector
  • ***
  • Posts: 114
    • View Profile
Re: Perlin Noise
« Reply #4 on: 2013-Sep-11 »
 :-[

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!
Es ist kein Mond....

A young band from Thuringia with a lot of potential :
http://youtu.be/diMBlNspsD8

Offline CptnRoughnight

  • Mr. Polyvector
  • ***
  • Posts: 114
    • View Profile
Re: Perlin Noise
« Reply #5 on: 2013-Sep-12 »
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.
Es ist kein Mond....

A young band from Thuringia with a lot of potential :
http://youtu.be/diMBlNspsD8

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5116
  • O Rly?
    • View Profile
Re: Perlin Noise
« Reply #6 on: 2013-Sep-18 »
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