Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB.NET: Noise-algoritmi

Sivun loppuun

peki [06.04.2004 19:41:52]

#

Halusin kokeilla Perlin's noise algoritmiä.
En ole varma onko tämä alkuperäinen, mutta se tuottaa ainakin hyvin samankaltaisia kuvia.
Kopioi tämä koodi vaan suoraan kaiken jo olemassa olevan koodin päälle.

Syntyvää kuvaa voi kutsua ihan miksi huvittaa. Minun mielestäni se näyttää pilviltä.
Tätä voisi soveltaa vaikka 3D-räiskintä pelin Skyboxissa.

Edit: En viitsinyt tuota
" Windows Form Designer generated code " - regionia poistaa, sillä se oli tällä kertaa niin lyhyt...

Public Class frmNoise
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.
    'Do not modify it using the code editor.
    Friend WithEvents picSurface As System.Windows.Forms.PictureBox
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.picSurface = New System.Windows.Forms.PictureBox
        Me.SuspendLayout()
        '
        'picSurface
        '
        Me.picSurface.Location = New System.Drawing.Point(0, 0)
        Me.picSurface.Name = "picSurface"
        Me.picSurface.Size = New System.Drawing.Size(464, 416)
        Me.picSurface.TabIndex = 0
        Me.picSurface.TabStop = False
        '
        'frmNoise
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(464, 414)
        Me.Controls.Add(Me.picSurface)
        Me.Name = "frmNoise"
        Me.Text = "Noise"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Dim b As Bitmap
    Dim _Random() As Double

    Private Sub Ran()
        ' tehdään random lukuja sisältävä taulukko
        Dim r As New Random
        Dim i As Integer
        ReDim _Random(picSurface.Width * picSurface.Height)
        For i = 0 To picSurface.Width * picSurface.Height
            _Random(i) = r.NextDouble()
        Next
    End Sub

    Private Sub frmNoise_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim x, y, i As Integer
        Dim r As New Random
        Dim N As Double = 0.0
        b = New Bitmap(picSurface.Width, picSurface.Height)
        Ran()
        For y = 1 To picSurface.Height - 1
            For x = 1 To picSurface.Width - 1
                N = 0
                ' lisäilemällä ja poistelemalla näitä rivejä voidaan muuttaa melun näköä
                ' esim.
                ' kommentoi seuraavasta kaikki muut, paitsi ensimmäinen rivi
                ' muuta myös rivi N /= 6.0 ==> N /= 1.0 (jotta keskiarvo säilyisi)
                N += GetColor(x, y, 40 / 1)
                N += GetColor(x, y, 40 / 2)
                N += GetColor(x, y, 40 / 4)
                N += GetColor(x, y, 40 / 8)
                N += GetColor(x, y, 40 / 16)
                N += GetColor(x, y, 40 / 32)
                '-------------------------------------------------------
                N /= 6.0
                b.SetPixel(x, y, Color.FromArgb(0, 0, N * 255))
            Next
        Next
        picSurface.BackgroundImage = b
    End Sub

    Private Function GetColor(ByVal x As Integer, ByVal y As Integer, ByVal M As Integer) As Double
        Dim x0 As Integer = x - (x Mod M)
        Dim x1 As Integer = x0 + M
        Dim y0 As Integer = y - (y Mod M)
        Dim y1 As Integer = y0 + M

        ' melua talteen =)
        Dim x0y0 As Double = Noise(x0, y0)
        Dim x1y0 As Double = Noise(x1, y0)
        Dim x0y1 As Double = Noise(x0, y1)
        Dim x1y1 As Double = Noise(x1, y1)

        ' interpoloidaan(meniköhän tuo taivutus oikein?)
        Dim xx0 As Double = f(x0, x0y0, x1, x1y0, x)
        Dim xx1 As Double = f(x0, x0y1, x1, x1y1, x)

        Dim N As Double = f(y0, xx0, y1, xx1, y)
        Return N
    End Function

    Private Function Noise(ByVal x As Integer, ByVal y As Integer) As Double
        ' melua
        If (x < picSurface.Width And y < picSurface.Height) Then
            Return _Random(y * picSurface.Width + x)
        Else
            Return 0.0
        End If
    End Function

    Private Function f(ByVal x0 As Double, ByVal y0 As Double, ByVal x1 As Double, ByVal y1 As Double, ByVal x As Double) As Double
        ' Tämä saadaan vaikeasta yhtälöstä, jota en ole itse keksinyt. Ylistäkää Googlea!
        Return (1.0 + Math.Cos(Math.PI + (Math.PI / (x1 - x0)) * (x - x0))) / 2.0 * (y1 - y0) + y0
    End Function
End Class

peki [06.04.2004 20:57:44]

#

Jos tätä kokeilette, niin kokeilkaa tuota esimerkkiä, jonka tonne kommenttiin laitoin. Se tekee niin paljon erilaisen "kuvan"

peki [06.04.2004 20:59:36]

#

Ajatelkaa, jos tän mappais jonkun Direct3D sphren päälle ja vielä saman lainen Bumpmappi taustalle, ja pyöritys koodi päälle. Ah...

T.M. [06.04.2004 21:41:00]

#

Jepjep, jos vain olisi exe millä katsoa :(

peki [06.04.2004 21:51:06]

#

Sori T.M. en saa sitä lähetettyä postiisi mbnet valittaa. =(

tnb [06.04.2004 22:06:48]

#

exe löytyy:

http://koti.mbnet.fi/nordta/Noise/


"Kapteeni, olemme ajautumassa tähtisumuun"

T.M. [06.04.2004 23:05:40]

#

MSCOREE.DLL tiedosto puuttuu :P

tnb [06.04.2004 23:31:16]

#

Microsoft .NET Runtime Execution Engine, v. 1.0.3705.0

http://www.dll-files.com/dllindex/dll-files.shtml?mscoree

Bill Keltanen [07.04.2004 06:57:07]

#

Mitä muuta näihin .NET-hommiin tarttee? Mulla WinXP Pro ja aina tulee jotain "Alustus epäonnistui"

peki [07.04.2004 08:13:37]

#

Koska käännän nämä ohjelmat .NET 2003:lla tarvitaan .NET Framework 1.1 sitä ei tietääkseni XP itsessään sisällä(sisältää 1.0:n). Käykää lataamassa Microsoftin kotisivuilta.

sooda [07.04.2004 10:12:13]

#

Kiva kun kouluun ei voi asentaa mitään kun ei ole oikeuksia! Nyyh! Eli en voi testata tota koulussa :(

TuGi [07.04.2004 11:06:46]

#

Niinpä!

T.M. [07.04.2004 14:30:59]

#

Jaahas, ottakaa sittenkin vain pelkkiä kuvankaappauksia, en jaksa enää pelleillä näitten kanssa: http://koti.mbnet.fi/winuus/noiseerror.jpg

thefox [07.04.2004 14:52:02]

#

Kivahko esimerkki, juuri tällaiset vinkit ovat kivoja selventämään joskus ah niin sekavia dokumentteja. Kommentointi oli tietysti ainakin teoreettiselta kannalta aika heikkoa mutta eikait siinä :)

Fisher [07.04.2004 16:15:39]

#

KOLME hyvää koodivinkkejä, ja ei yksikään VB:lle.... Kaikki vaan VBnetille :(

Gwaur [07.04.2004 20:34:39]

#

Fisher kirjoitti:

KOLME hyvää koodivinkkejä, ja ei yksikään VB:lle.... Kaikki vaan VBnetille :(

Samat sanat

jcd3nton [08.04.2004 18:02:19]

#

Eikö näistä pekin jutuist ajoku voisi ottaa muutaman screenshotin ja pistää niitä johonkin nähtäväksi?

peki [08.04.2004 18:26:59]

#

T.M: En saa kaappauksia lähetettyä sähköpostiisi.
MBnet blokkaa kaikki postit, joita yritän osoitteeseesi lähettää. Voisiko joku muu ystävällisesti auttaa minua ja lähettää T.M:lle/laittaa tänne nähtäväksi muutaman Screenshotin?

T.M. [08.04.2004 20:24:42]

#

Uploadaa ne johonkin sivulle :P Tai joku muu vois tehä sen jos et voi.

T.M. [11.04.2004 20:13:33]

#

Noh, hmhph.
peki: tee joku toinen emailosote eri paikkaan, ja lähetä sieltä Esim: suomi24.fi

Spirits [11.05.2004 02:26:44]

#

Tässä olis tuo sama ohjelma C:llä kirjoitettuna. Ei vaadi mitään .NET:n viittaavaa.

http://www.geocities.com/prlnsop/prlns.zip

Se on melkein samanlainen paitsi että lisäsin siihen samaan tuon toisen viivajutun ja vielä yhden extran joka myös perusutuu Perlinin noise algoritmeihin. 1-näppäimellä tulee tuon esimerkin mukainen, 2-näppäimellä tuo viivajuttu ja 3-näppäimellä tuo extra.

peki [27.05.2004 09:14:41]

#

tässä screenshotti tuosta ohjelmasta(sain ftp ohjelman pelaamaan) :D
http://koti.mbnet.fi/peku1/n.PNG


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta