1D Perlin Noise

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    1D Perlin Noise

    Ich spiele seit heute Mittag mit verschiedenen Kurven (z.b. Sinus-Kurve), jetzt wollte ich mich mal an Perlin-Noise ranwagen, da damit ja auch solche "Kurven" generiert werden können.
    Das ganze sollte in einer Dimension ablaufen. Ich will eine Funktion haben, die mir den Wert von Koordinate-X zurückgibt. Ich will also z.B. so darauf zugreifen können:

    VB.NET-Quellcode

    1. perlinNoise.getValue(5)

    So könnte ich damit z.B. ein Array füllen mit dem ich dann das ganze zeichnen könnte.

    Ich habe im Internet schon gesucht, finde aber nicht viel für VB.NET und wenn, dann nur für 2 Dimensionen.
    Ein Code-Snippet ware sehr gut, eine Erklärung dazu noch besser.

    Mfg
    Ich kann dir diese Seite hier ans Herz legen:
    freespace.virgin.net/hugo.elias/models/m_perlin.htm

    Die habe ich damals benutzt, um prozeduales Terrain zu generieren. Lies es dir mal durch ;)

    MfG
    Lies dir doch die Seite durch, die ich dir eben gepostet habe. Auf der ist alles wirklich gut dokumentiert, sogar ein Pseudocode für eine eindimensionale Perlin Noise Funktion ist mit dabei...



    MfG
    Okay, ich habs irgendwie verpasst dass es da noch weiter runter geht ._.
    Ich war ziemlich müde...

    Ich schau mir das ganze nochmal an.

    Edit: Das ganze klappt nicht so ganz, ich krieg nur Nullen zurück...

    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Function Noise1(ByVal x As Integer) As Double
    2. 'Hier hab ich die Random-Klasse von .NET genommen, hatte Probleme beim Übersetzen
    3. 'und das andere sollte ja, wenn ich es richtig verstanden hab, auch nur zufällige Zahlen
    4. 'zwischen -1.0 und 1.0 generieren.
    5. Dim rand As New Random(x)
    6. Dim one As Double = rand.NextDouble()
    7. Dim two As Double = -rand.NextDouble()
    8. Return CDbl(IIf(CBool(rand.Next(0, 2)), one, two))
    9. End Function
    10. Function SmoothedNoise1(ByVal x As Integer) As Double
    11. Return Noise1(x) / 2 + Noise1(x - 1) / 4 + Noise1(x + 1) / 4
    12. End Function
    13. Function InterpolatedNoise_1(ByVal x As Double) As Double
    14. Dim integer_X As Integer = CInt(x)
    15. Dim fractional_X As Double = x - integer_X
    16. Dim v1 As Double = SmoothedNoise1(integer_X)
    17. Dim v2 As Double = SmoothedNoise1(integer_X + 1)
    18. Return Cosine_Interpolate(v1, v2, fractional_X)
    19. End Function
    20. Function PerlinNoise_1D(ByVal x As Double, ByVal persistence As Double, ByVal Number_Of_Octaves As Integer) As Double
    21. Dim total As Double = 0
    22. Dim p As Double = persistence
    23. Dim n As Integer = Number_Of_Octaves - 1
    24. For i As Integer = 0 To n
    25. Dim frequency As Integer = 2 * i
    26. Dim amplitude As Double = p * i
    27. total = total + InterpolatedNoise_1(x * frequency) * amplitude
    28. Next
    29. Return total
    30. End Function
    31. Function Linear_Interpolate(ByVal a As Double, ByVal b As Double, ByVal x As Double) As Double
    32. Return a * (1 - x) + b * x
    33. End Function
    34. Function Cosine_Interpolate(ByVal a As Double, ByVal b As Double, ByVal x As Double) As Double
    35. Dim ft As Double = x * 3.1415927
    36. Dim f As Double = (1 - Math.Cos(ft)) * 0.5
    37. Return a * (1 - f) + b * f
    38. End Function



    Ich denke ich hab da ein paar falsche Variablen-Typen eingesetzt.
    Kann mir da mal einer helfen?

    Mfg

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Crazydrift“ ()

    Ohne deinen Source ganz durchzulesen gehaben kann ich sagen Noise1 kann man auch in VB.NET übersetzen << ist ein bitshiften nach links und xor ist oder.

    Somit << ist in VB.NET << (siehe auch hier stackoverflow.com/questions/14…o-bitwise-shift-in-vb-net)
    Und ^ ist einfach Xor msdn.microsoft.com/en-us/library/csw1x2a6.aspx


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.