Äussere Schleife funktioniert nicht

  • VB.NET

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

    Äussere Schleife funktioniert nicht

    Hi Leute,
    ich habe folgendes Problem: Ich möchte Kreise in einem gewissen Raster anzeigen:
    in der inneren Schleife(i) zeichne ich die Kreise in einer Reihe übereinander, in der äusseren Schleife(j) sollen dann die nächsten Reihen mit einem Versatz in x- und y-Richtung gezeichnet werden!
    Die innere funktioniert,die erste Reihe wird gezeichnet.
    Die äussere aber nicht! Was mache ich falsch?!

    VB.NET-Quellcode

    1. Dim x0 As Double
    2. Dim y0 As Double
    3. Dim i As Integer = 1
    4. Dim j As Integer = 1
    5. Dim a As Integer = 0
    6. Dim x As Integer = 0
    7. Dim y As Integer = 0
    8. Do While j < Reihen
    9. Do While i < Anzahl
    10. x0 = 2 + x
    11. y0 = a + y
    12. g.TranslateTransform(x0, y0)
    13. g.DrawEllipse(Pens.Black, -2), -2), 4, 4)
    14. g.ResetTransform()
    15. a += 5
    16. i = i + 1
    17. Loop
    18. x += 3
    19. y += 6
    20. j = j + 1
    21. Loop


    Danke im Voraus

    rade23
    Jep, sind beide deklariert!
    ...sonst würde die innere Schleife aber ja auch nicht funktionieren!

    Was ich oben geschrieben habe, hatte ich bereits etwas vereinfacht, hier das eigentliche:
    Wenn ich die kommentierten Zeilen weglasse, zeichnet er mir die Kreise übereinander (wie gewollt), füge ich die kommentierten Zeilen hinzu(um die Kreis-Reihe versetzt zu duplizieren), zeichnet er troztdem nur die innere Schleife?!

    VB.NET-Quellcode

    1. Public Function DübelC(ByVal source As Bitmap, ByVal a1 As String, ByVal a2 As String, ByVal a1tc As String, ByVal a2tc As String, ByVal Reihen As String, ByVal AnzahljeReihe As String, ByVal WinkelZY As String, ByVal Durchmesser As String) As Bitmap
    2. g = System.Drawing.Graphics.FromImage(source)
    3. Dim rad as Double = Math.PI / 180
    4. Dim faktor As Double = Hauptformular.trb_C.Value / 100
    5. Dim HöheHT_f As Integer = faktor * Hauptformular.txt_HöheHT.Text
    6. Dim BreiteHT_f As Integer = faktor * Hauptformular.txt_BreiteHT.Text
    7. Dim cos_a1_f As Integer = faktor * a1 * Math.Cos(WinkelZY * rad)
    8. Dim sin_a1_f As Integer = faktor * a1 * Math.Sin(WinkelZY * rad)
    9. Dim cos_a2_f As Integer = faktor * a2 / Math.Cos(WinkelZY * rad)
    10. Dim cos_a1tc_f As Integer = faktor * a1tc * Math.Cos(WinkelZY * rad)
    11. Dim sin_a1tc_f As Integer = faktor * a1tc * Math.Sin(WinkelZY * rad)
    12. Dim a2tc_f As Integer = faktor * a2tc
    13. Dim x0 As Double
    14. Dim y0 As Double
    15. Dim i As Integer = 1
    16. Dim j As Integer = 1
    17. Dim a As Integer
    18. Dim b As Integer = 0
    19. Dim c As Integer = 0
    20. Dim wert As Integer = Math.Floor(CInt(Reihen) / 2)
    21. Dim rest As Double = Math.IEEERemainder(CInt(Reihen), 2)
    22. Dim wert2 As Double = wert - 0.5
    23. If rest <> 0 Then
    24. a = -cos_a2_f * wert
    25. Else
    26. a = -cos_a2_f * wert2
    27. End If
    28. 'Do While j < CInt(AnzahljeReihe) + 1
    29. Do While i < CInt(Reihen) + 1
    30. x0 = 50 + BreiteHT_f + cos_a1tc_f + b
    31. y0 = fkt_y0(source) + a + sin_a1tc_f + c
    32. g.TranslateTransform(x0, y0)
    33. g.DrawEllipse(Pens.Black, -CInt(Durchmesser / 2 * faktor), -CInt(Durchmesser / 2 * faktor), CInt(Durchmesser * faktor), CInt(Durchmesser * faktor))
    34. g.ResetTransform()
    35. a += cos_a2_f
    36. i = i + 1
    37. Loop
    38. 'b += cos_a1_f
    39. 'c += sin_a1_f
    40. 'j = j + 1
    41. 'Loop
    42. Return source
    43. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rade23“ ()

    Erstmal Danke für den Tip!

    Ich kann Dir aber nicht ganz folgen... Wie soll ich den eine For...Each-Schleife benutzen?

    Hast Du vielleicht ein kleines Beispiel?!

    Habs jetzt folgendermaßen gemacht:

    VB.NET-Quellcode

    1. Dim x0 As Double
    2. Dim y0 As Double
    3. Dim i As Integer = 1
    4. Dim j As Integer = 1
    5. Dim a As Integer
    6. Dim b As Integer = 0
    7. Dim c As Integer = 0
    8. Dim wert As Integer = Math.Floor(CInt(Reihen) / 2)
    9. Dim rest As Double = Math.IEEERemainder(CInt(Reihen), 2)
    10. Dim wert2 As Double = wert - 0.5
    11. If rest <> 0 Then
    12. a = -cos_a2_f * wert
    13. Else
    14. a = -cos_a2_f * wert2
    15. End If
    16. Do While i < CInt(Reihen) * CInt(AnzahljeReihe) + 1
    17. x0 = 50 + BreiteHT_f + cos_a1tc_f + b
    18. y0 = fkt_y0(source) + a + sin_a1tc_f + c
    19. g.TranslateTransform(x0, y0)
    20. g.DrawEllipse(Pens.Black, -CInt(Durchmesser / 2 * faktor), -CInt(Durchmesser / 2 * faktor), CInt(Durchmesser * faktor), CInt(Durchmesser * faktor))
    21. g.ResetTransform()
    22. a += cos_a2_f
    23. i = i + 1
    24. If i = j * CInt(Reihen) + 1 Then
    25. j = j + 1
    26. b = b + cos_a1_f
    27. c = c + sin_a1_f
    28. If rest <> 0 Then
    29. a = -cos_a2_f * wert
    30. Else
    31. a = -cos_a2_f * wert2
    32. End If
    33. End If
    34. Loop


    Das funktioniert auch, gibt aber bestimmt noch elegantere Lösung...

    rade23

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rade23“ ()

    Zwischen den beiden Do While-Zeilen musst Du das i zurücksetzen. :D

    VB.NET-Quellcode

    1. Do While j < Reihen
    2. i = 1
    3. Do While i < Anzahl
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!