Построение графиков из таблицы VB

#vb.net #graph

#vb.net #График

Вопрос:

Я пытаюсь построить график из таблицы с именем totals(). Сама программа работает нормально, но у меня возникли некоторые проблемы. Во-первых, при каждом нажатии кнопки добавляются значения и перерисовываются их. Я не хочу, чтобы они добавлялись к предыдущим значениям, я хочу, чтобы они перезаписывали значения.

 Dim d1, d2, d3 As Single
    Dim dieSumInt As Integer
    Dim totals(17) as integer

    For ptr = 1 To 10000
        d1 = (Int((Rnd() * 6)   1))
        d2 = (Int((Rnd() * 6)   1))
        d3 = (Int((Rnd() * 6)   1))
        dieSumInt = CInt((d1   d2   d3))
        totals(dieSumInt)  = 1
    Next
  

Предполагается, что весь код, который у меня есть здесь, должен принимать сумму из 3 кубиков и отображать итоговые значения в графическом окне. У меня есть все графики вниз, но каждый раз, когда я нажимаю кнопку «roll», она продолжает добавлять предыдущие значения. Я не уверен, как очистить значения, чтобы получить согласованное значение, отображаемое в графике.

 Dim totals(18) As Integer
Dim dashPen As New Pen(Color.Black, 1)
Public Function Max(ByVal arry() As Integer) As Integer
    Max = arry(0)
    For ptr As Integer = 0 To UBound(arry)
        If arry(ptr) > Max Then Max = arry(ptr)
    Next
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Randomize(DateAndTime.Timer)
End Sub
Private Sub rollButton_Click(sender As Object, e As EventArgs) Handles RollButton.Click
    Dim d1, d2, d3 As Single
    Dim dieSumInt As Integer

    For ptr = 1 To 10000
        d1 = (Int((Rnd() * 6)   1))
        d2 = (Int((Rnd() * 6)   1))
        d3 = (Int((Rnd() * 6)   1))
        dieSumInt = CInt((d1   d2   d3))
        totals(dieSumInt)  = 1
    Next

    Call Plot(totals)
    Call LabelGraph(totals)
End Sub
Private Sub Plot(ByVal arry() As Integer)
    Dim plotColor As Color
    plotColor = Color.SkyBlue
    Dim plotPen As New Pen(plotColor, 5)
    Dim graph As Graphics = displayBox.CreateGraphics
    Dim ymax, ptr As Integer
    Dim xscale, yscale, x1, y1, Dwidth, Dheight As Single
    Dim myfont As New Font("courier new", 5   (displayBox.Width  100))
    Dim percentArry(4) As Integer

    Dwidth = displayBox.Width - 50
    Dheight = displayBox.Height - 100
    ymax = Max(arry)
    displayBox.Refresh()
    yscale = CSng(Dheight / ymax)
    xscale = CSng(Dwidth / 17)
    Dwidth = displayBox.Width - 50
    Dheight = displayBox.Height - 70
    For ptr = 0 To 4
        percentArry(ptr) = CInt(arry.Max * (ptr   1) * 0.2)
        y1 = Dheight - CInt((arry.Max * (ptr   1) / 5) * yscale)
        graph.DrawLine(dashPen, displayBox.Left - 25, y1   4, displayBox.Right - 25, y1   4)
        dashPen.DashStyle = Drawing2D.DashStyle.DashDotDot
        graph.DrawString(CStr(percentArry(ptr)), myfont, Brushes.LightSlateGray,         'marking the sides
        CSng(displayBox.Left - 10),
        y1   3)
    Next
    For ptr = 3 To 18
        x1 = (ptr - 2) * xscale
        y1 = Dheight - (arry(ptr) * yscale)
        graph.DrawRectangle(plotPen, x1   30, y1   4, xscale - 10, Dheight - y1)    'adjusting the size of the graph rectangles
    Next
End Sub

Private Sub LabelGraph(ByVal arry() As Integer)

    Dim graph As Graphics = displayBox.CreateGraphics
    Dim myfont As New Font("courier new", 5   (displayBox.Width  100))

    For ptr As Integer = 1 To 16

        graph.DrawString(CStr(ptr   2), myfont, Brushes.LightSlateGray,
        CSng(((displayBox.Width / 17) * ptr   5) - (ptr * 3)   displayBox.Width / 35),
        displayBox.Height - 60)

        graph.DrawString(CStr(arry(ptr   2)), myfont, Brushes.LightSlateGray,
        CSng(((displayBox.Width / 17) * ptr) - (ptr * 3)   displayBox.Width / 28),
        displayBox.Height - 30)
    Next
End Sub

Private Sub exitButton_Click(sender As Object, e As EventArgs) Handles exitButton.Click
    Me.Close()
End Sub
Private Sub Form1_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
    Plot(totals)
    LabelGraph(totals)
End Sub
  

Комментарии:

1. Думаю, вам может понадобиться дать нам немного больше контекста для этого кода? какова область видимости? При нажатии кнопок вам нужно очистить коллекцию точек данных и создать ее заново?

2. он берет сумму из 3 кубиков за 10000 бросков и отображает итоговые значения.