Hallo,
ich beschäftige mich seit einger Zeit mit 3-D Landschaften und möchte ein Perlin-Noise generieren
(Ich suche keinen Code dafür - ich will ihn selber schreiben. Aus Übungszwecken )
Hier tritt das Problem der "Interpolation" auf. Soviel ich verstanden habe ist das das "glätten" einer Kurve.
Ich orientiere mich derzeit an folgender Seite: freespace.virgin.net/hugo.elias/models/m_perlin.htm (Abschnitt: Cosine Interpolation)
Hab das ganze kurzerhand in VB umgesetzt (hoffentlich richtig )
Ganzer Code (halbings schön dokumentiert ;))
Spoiler anzeigen
Screenshots: (blau: meine Berechnung) (rot: DrawCurve)
Liegt der Fehler jetzt in der Berechnung oder an mir?
ich beschäftige mich seit einger Zeit mit 3-D Landschaften und möchte ein Perlin-Noise generieren
(Ich suche keinen Code dafür - ich will ihn selber schreiben. Aus Übungszwecken )
Hier tritt das Problem der "Interpolation" auf. Soviel ich verstanden habe ist das das "glätten" einer Kurve.
Ich orientiere mich derzeit an folgender Seite: freespace.virgin.net/hugo.elias/models/m_perlin.htm (Abschnitt: Cosine Interpolation)
Hab das ganze kurzerhand in VB umgesetzt (hoffentlich richtig )
Ganzer Code (halbings schön dokumentiert ;))
VB.NET-Quellcode
- Public Class Form1
- Private values As New List(Of Integer) 'Y-Werte (gleichmäßig verteilt!)
- Private original As PointF()
- Private r As New Random(Now.Millisecond)
- Private Sub btn_seed_Click(sender As System.Object, e As System.EventArgs) Handles btn_seed.Click
- '5 zufällige Werte generieren
- values.Clear()
- For index = 1 To 8
- values.Add(r.Next(0, pb_ausgabe.Height))
- Next
- original = MakePoints() 'Zum Vergleich
- 'Punkte darstellen
- MakeBitmap()
- End Sub
- Private Sub btn_interpolate_Click(sender As System.Object, e As System.EventArgs) Handles btn_interpolate.Click
- 'Alle Punkte interpolieren
- Dim old_points = MakePoints()
- Dim new_values As New List(Of Integer)
- For index = 0 To values.Count - 2 'Weniger 2, da der letzte Punkt keinen Punkt rechts von ihm hat
- Dim currentX = (old_points(index).X + old_points(index + 1).X) / 2 'X-Koordinate für neuen Punkt berechnen
- new_values.Add(Interpolate(old_points(index), old_points(index + 1), currentX)) 'Interpolieren und in Liste einfügen
- Next
- 'Punkte mischen
- For index = 0 To values.ToArray.Count - 2
- values.Insert(index + 1, new_values(index))
- Next
- 'Punkte darstellen
- MakeBitmap()
- End Sub
- Private Sub MakeBitmap()
- Dim bmp As New Bitmap(pb_ausgabe.Width, pb_ausgabe.Height) 'Bitmap zum anzeigen
- 'Punkte generieren
- Dim points = MakePoints()
- 'Punkte zeichnen
- Using g = Graphics.FromImage(bmp)
- g.Clear(Color.White)
- g.DrawCurve(Pens.Red, original)
- g.DrawLines(Pens.Blue, points)
- End Using
- 'Anzeigen
- pb_ausgabe.Image = bmp
- End Sub
- Function MakePoints() As PointF()
- Dim points As New List(Of PointF)
- Dim f = pb_ausgabe.Width / values.Count 'Abstand zwischen einzelnen Punkten
- Dim x_val As Single = 0 'Aktuelle X-Position
- For Each y_val In values
- points.Add(New PointF(x_val, y_val))
- x_val += f
- Next
- Return points.ToArray()
- End Function
- Function Interpolate(p1 As PointF, p2 As PointF, x As Integer) As Integer
- Dim ft = x * Math.PI
- Dim f = (1 - Math.Cos(ft)) / 2
- Return p1.Y * (1 - f) + p2.Y * f
- End Function
- End Class
Screenshots: (blau: meine Berechnung) (rot: DrawCurve)
Liegt der Fehler jetzt in der Berechnung oder an mir?