2016-07-14 4 views
0

내 목표는 특정 크기의 목록을 만들고 해당 목록에서 3 점을 무작위로 선택하는 것입니다. 한 지점을 선택하면 목록에서 삭제되어 다시 선택되지 않습니다. 내 문제는 디버거가 목록 범위 밖의 인덱스가 있다고 말하고 있습니다. 저는 VB.NET에 비교적 익숙하지 않지만 VBA에 꽤 경험이 있습니다. 당신의 도움에 미리 감사드립니다. 질문에 대한 의견뿐만 아니라VB.NET; 임의로 생성 된 목록의 색인 오류

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

아마도 라인은 예외를 던지는 표시하는 것이 도움이 될 것입니다,하지만 당신은 이리저리 항목을 제거하는 것 같습니다 m 개의리스트 ('Numbers.RemoveAt (RandomIndex_1)')를 읽은 다음 ('i = Numbers (RandomIndex_1)') 그들을 읽으려고합니다. – Mark

+0

'Number'리스트에'3 * Pixel_Count' 항목이 필요한 것 같습니다. – Mark

+0

놀랍게도 간단한 수정으로, 나는 내 뇌가 오늘날 어디 있는지 알지 못합니다. 그 두 가지 변화를 만들어 냈고 지금도 효과가 있습니다. 감사! – senuba91

답변

0

, 당신은 (그러나 목록 셔플 더 나은 방법에 대한 논의는 this question 참조) 숫자를 무작위로 분류 스택을 사용하여 논리를 어느 정도 단순화 할 수 있습니다 :

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

그럼 그냥 스택에서 번호를 팝업 할 수 있습니다 루프 :

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

    If i Mod Image_Width = 0 Then 
     '... etc. 
Next 
관련 문제