2016-07-14 10 views
0

Mein Ziel ist es, eine Liste mit einer bestimmten Größe zu erstellen und 3 Punkte zufällig aus dieser Liste auszuwählen. Sobald ein Punkt ausgewählt ist, wird er aus der Liste gelöscht, damit er nicht erneut ausgewählt wird. Mein Problem ist der Debugger sagt, ich habe einen Index außerhalb des Bereichs der Liste. Ich bin relativ neu in VB.NET, bin aber ziemlich erfahren mit VBA. Vielen Dank im Voraus für Ihre Hilfe.VB.NET; Indexfehler mit zufällig generierter Liste

Private Sub Analyze_Click(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles Analyze_Image.Click 

    Dim i As Long, j As Long, k As Long, Image_Width As Long, Image_Height As Long, Pixel_Count As Long, Pixel As Long 
    Dim My_Image As Image 
    Dim RandomClass As New Random() 
    Dim RandomIndex_1 As Long, RandomIndex_2 As Long, RandomIndex_3 As Long 
    Dim P1 As Point, P2 As Point, P3 As Point 

    My_Image = My_PictureBox.Image 
    Image_Width = My_Image.Width 
    Image_Height = My_Image.Height 
    Pixel_Count = Image_Width * Image_Height 

    Dim Numbers = Enumerable.Range(0, Pixel_Count + 1).ToList() 

    For Pixel = 1 To Pixel_Count 
     RandomIndex_1 = RandomClass.Next(0, Numbers.Count) 
     Numbers.RemoveAt(RandomIndex_1) 
     RandomIndex_2 = RandomClass.Next(0, Numbers.Count) 
     Numbers.RemoveAt(RandomIndex_2) 
     RandomIndex_3 = RandomClass.Next(0, Numbers.Count) 
     Numbers.RemoveAt(RandomIndex_3) 

     i = Numbers(RandomIndex_1) 
     j = Numbers(RandomIndex_2) 
     k = Numbers(RandomIndex_3) 

     If i Mod Image_Width = 0 Then 
      P1.X = Image_Width 
     Else 
      P1.X = i Mod Image_Width 
     End If 
     If j Mod Image_Width = 0 Then 
      P2.X = Image_Width 
     Else 
      P2.X = j Mod Image_Width 
     End If 
     If k Mod Image_Width = 0 Then 
      P3.X = Image_Width 
     Else 
      P3.X = k Mod Image_Width 
     End If 
     If ((i - i Mod Image_Width)/Image_Width) + 1 = Image_Height + 1 Then 
      P1.Y = Image_Height 
     Else 
      P1.Y = ((i - i Mod Image_Width)/Image_Width) + 1 
     End If 
     If ((j - j Mod Image_Width)/Image_Width) + 1 = Image_Height + 1 Then 
      P2.Y = Image_Height 
     Else 
      P2.Y = ((j - j Mod Image_Width)/Image_Width) + 1 
     End If 
     If ((k - k Mod Image_Width)/Image_Width) + 1 = Image_Height + 1 Then 
      P3.Y = Image_Height 
     Else 
      P3.Y = ((k - k Mod Image_Width)/Image_Width) + 1 
     End If 
    Next 

End Sub 
+0

es wäre wahrscheinlich hilfreich sein, um anzuzeigen, welche Linie die Ausnahme auslöst, aber es sieht aus wie Sie fro Artikel entfernt werden m die Liste ('Numbers.RemoveAt (RandomIndex_1)') und versuche dann, sie zu lesen ('i = Numbers (RandomIndex_1)'). – Mark

+0

Es sieht auch so aus, als müssten Sie '3 * Pixel_Count'-Elemente in Ihrer' Number'-Liste verwenden? – Mark

+0

Überraschend einfache Korrekturen, ich weiß nicht, wo mein Gehirn heute ist. Hat beide diese Änderungen gemacht und es funktioniert jetzt. Vielen Dank! – senuba91

Antwort

0

Neben den Ausführungen zu der Frage, könnten Sie die Logik vereinfachen etwas durch einen zufällig sortiert Stapel Nummern (siehe jedoch this question für eine Diskussion über bessere Möglichkeiten, um die Liste zu mischen):

Dim Numbers = New Stack(
    Enumerable.Range(0, 3 * Pixel_Count) _ 
     .OrderBy(Function(i) RandomClass.Next()) _ 
     .ToList() 
) 

Ihre Schleife kann dann nur Zahlen Pop vom Stapel:

For Pixel = 1 To Pixel_Count 
    i = Numbers.Pop() 
    j = Numbers.Pop() 
    k = Numbers.Pop() 

    If i Mod Image_Width = 0 Then 
     '... etc. 
Next