tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
378
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Erik Erik ist offline Mitglied Gold
    Registriert seit
    Jul 2008
    Beiträge
    171
    Hallo,

    Das ist das erste Mal dass ich hier mitmache. Also bitte kräftig kritisieren!

    Einige Beispiele funktionierten bei mir nicht ganz so wie sie sollten (Hilbert-Kurve)

    Ich denke der Code dürfte selbsklärend sein:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    
    Public Class frmStart
        Private AusgabeGrafik As Bitmap
     
        Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
     
            'Zuweisung der Variablen
            Dim Weite As Integer = Convert.ToInt32(txtBreite.Text)
            Dim Höhe As Integer = Convert.ToInt32(txtHöhe.Text)
            Dim aktuellePosition As New Point(Convert.ToInt32(txtStartX.Text), Höhe - Convert.ToInt32(txtStartY.Text))
            Dim aktuellerWinkel As Double = 0
            Dim Schrittweite As Integer = Convert.ToInt32(txtSchrittweite.Text)
            Dim Drehwinkel As Double = Convert.ToDouble(txtDrehwinkel.Text)
            Dim n As Integer = Convert.ToInt32(txtN.Text)
     
            Dim GespeichertePositionen() As Point
            Dim GespeicherteDrehungen() As Double
     
            Dim Ersetzung(,) As String
            If Not n = 0 Then
                Try
     
                    Dim split() As Char = {Chr(10), Chr(13)}
                    Dim tmpSplit() As String = txtErsetztung.Text.Split(split, StringSplitOptions.RemoveEmptyEntries) ' Splitted den String nach Zeilen
                    Dim tmpSplit2() As String
                    ReDim Ersetzung(tmpSplit.GetUpperBound(0), 1) 'Dimensioniert das Array neu
     
                    For i = 0 To tmpSplit.GetUpperBound(0)
                        tmpSplit2 = tmpSplit(i).Split(" "c) 'Splitted nach Leerzeichen
                        Ersetzung(i, 0) = tmpSplit2(0)
                        Ersetzung(i, 1) = tmpSplit2(1)
                    Next
                Catch 'Fehler abfangen
                    MsgBox("Ungültiger Wert im Ersetzten Feld")
                    Exit Sub
                End Try
            End If
     
            Dim Eingabe As String = txtEingabe.Text
     
            Dim neuerPunkt As Point
     
            'Setzt die Größe des Panels
            pnlAusgabe.Size = New Size(Convert.ToInt32(txtBreite.Text), Convert.ToInt32(txtHöhe.Text))
            pnlAusgabe.BackColor = Color.White
     
            AusgabeGrafik = New Bitmap(Weite, Höhe, Imaging.PixelFormat.Format24bppRgb) ' Erstellt die Grafik
            Dim g As Graphics = Graphics.FromImage(AusgabeGrafik) 'Erstellt das Graphics-Objekt, auf dem gezeichnet wird
            g.Clear(Color.White)
     
            If Not n = 0 Then 'Wenn Ersetztungen statt finden sollen
                For Ersetzungsrunde = 1 To n
                    For i = 0 To Ersetzung.GetUpperBound(0)
                        Eingabe = Eingabe.Replace(Ersetzung(i, 0), Ersetzung(i, 1)) 'Ersetzte
                    Next
                Next
            End If
     
     
            For i = 0 To Eingabe.Length - 1 'Durchlaufe alle Zeichen
                Select Case Eingabe.Chars(i)
                    Case "F"c
                        'Berechne neuen Punkt
                        neuerPunkt = New Point( _
                            aktuellePosition.X + Convert.ToInt32(Math.Cos(DegToRad(aktuellerWinkel)) * Schrittweite), _
                            aktuellePosition.Y + Convert.ToInt32(Math.Sin(DegToRad(aktuellerWinkel)) * Schrittweite))
                        'Zeichnen Liene zum neuen Punkt
                        g.DrawLine(Pens.Black, aktuellePosition, neuerPunkt)
                        aktuellePosition = neuerPunkt
                    Case "+"c
                        aktuellerWinkel -= Drehwinkel
                    Case "-"c
                        aktuellerWinkel += Drehwinkel
                    Case "["c
                        If GespeicherteDrehungen Is Nothing Or GespeichertePositionen Is Nothing Then 'Es sind noch keine Daten im Array
                            ReDim GespeicherteDrehungen(0)
                            ReDim GespeichertePositionen(0)
                        Else
                            ReDim Preserve GespeicherteDrehungen(GespeicherteDrehungen.GetUpperBound(0) + 1) 'Vergrößere den Array um einen Platz
                            ReDim Preserve GespeichertePositionen(GespeichertePositionen.GetUpperBound(0) + 1)
                        End If
                        GespeicherteDrehungen(GespeicherteDrehungen.GetUpperBound(0)) = aktuellerWinkel 'Speichere den Winkel
                        GespeichertePositionen(GespeichertePositionen.GetUpperBound(0)) = aktuellePosition 'Speichere die Position
                    Case "]"c
                        aktuellerWinkel = GespeicherteDrehungen(GespeicherteDrehungen.GetUpperBound(0)) 'Hole Daten
                        aktuellePosition = GespeichertePositionen(GespeichertePositionen.GetUpperBound(0))
                        ReDim Preserve GespeicherteDrehungen(GespeicherteDrehungen.GetUpperBound(0) - 1) 'Lösche letzten Platz
                        ReDim Preserve GespeichertePositionen(GespeichertePositionen.GetUpperBound(0) - 1)
                End Select
                aktuellerWinkel = aktuellerWinkel Mod 360 'kann man eigentlich weglassen. Hält den Winkel zwischen 0 und 360
            Next
            pnlAusgabe.Invalidate() 'Zeichnet das Ausgabe Panel neu
        End Sub
     
        Private Function DegToRad(ByVal Deg As Double) As Double 'Rechnet einen in Grad angegebenen Winkel in Bogenmass um
            Return Deg * (Math.PI / 180)
        End Function
     
        Private Sub pnlAusgabe_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pnlAusgabe.Paint
            Try
                e.Graphics.DrawImage(AusgabeGrafik, 1, 1) 'Grafik anzeigen
            Catch 'Grafik wurde noch nicht erstellt
                'Ignorieren
            End Try
        End Sub
    End Class

    Viele Grüße
    x y z
    Angehängte Dateien Angehängte Dateien
    Geändert von Erik (20.07.09 um 17:45 Uhr)
     

Thema nicht erledigt

Ähnliche Themen

  1. Quiz?
    Von MeisterLampion im Forum Office-Anwendungen
    Antworten: 12
    Letzter Beitrag: 03.11.06, 15:48
  2. Quiz: Was bin ich?
    Von MrTwister im Forum Werkstatt
    Antworten: 3
    Letzter Beitrag: 05.04.06, 19:14
  3. Quiz
    Von JannyR im Forum PHP
    Antworten: 2
    Letzter Beitrag: 21.05.05, 15:58
  4. Quiz
    Von alkaline im Forum PHP
    Antworten: 0
    Letzter Beitrag: 27.09.04, 10:16
  5. php Quiz
    Von Sim im Forum PHP
    Antworten: 0
    Letzter Beitrag: 09.05.04, 12:43