winforms 如何生成表示要绘制的条形高度的随机元素数组

fdbelqdn  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(136)

我知道NET框架中数组和图形的基础知识(绘制图形,创建三角函数)。
我似乎无法想象如何随机生成数组元素,用条形高度(白色)表示,如下图所示:

我只试过下面的代码,每次生成一个数字时只得到一个数字。我期望的是0到100以随机顺序列出,但我做不到。

Public Class FormSortingAlgorithm
    Dim rnd As New Random()
    Dim nums() As Integer
    Dim i As Integer
    Private Sub btnGenerate_Click(sender As Object, e As EventArgs) Handles btnGenerate.Click
        Dim i As Integer
        ReDim nums(19)
        For i = 0 To 19
            nums(i) = rnd.Next(0, 100)
        Next
    End Sub
    Private Sub btnDisplayArray_Click(sender As Object, e As EventArgs) Handles btnDisplayArray.Click
        txtDisplay.Text = nums(j) & nums(i)
    End Sub
End Class
2ledvvac

2ledvvac1#

注意:假定Windows窗体,给定问题中使用的名称

  • 这一行:txtDisplay.Text = nums(j) & nums(i)不会在TextBox中显示数组的内容,只是一个由数组中的两个元素组成的粘合数字。

如果在某处定义了j,并且它表示有效索引
您可以使用String.Join()构建一个字符串,该字符串包含使用分隔符的集合中的所有元素(此处为vbCrLf,因为您有TextBox)
我建议你用一个List(Of Integer)来替换数组,这是一个非常灵活的集合类型。你可以在需要的时候添加或删除元素。你可以调用它的.ToArray()方法,以防出于某种原因需要数组

要生成(0 : 100)范围内的值,必须指定[Random].Next(0, 101)
在本例中,我使用PictureBox绘制随机Integer值的集合。
图形表面的世界坐标被转换为笛卡尔平面的第一象限。
(0, 0)顶点是画布(PictureBox)的左下顶点,而不是左上顶点。
如果您不关心这个,请删除Matrix对象和Graphics.Transform = [Matrix]赋值
关于此处使用的矩阵,请参见Flip the GraphicsPath that draws the text中的注解

Imports System.Collections.Generic
Imports System.Drawing.Drawing2D
Imports System.Linq

Private Shared ReadOnly rnd As New Random()
Private plotNumbers As List(Of Integer) = Nothing
Private penWidth As Single = 1.0F
Private numOfLines As Integer = 19

Private Sub btnGenerate_Click(sender As Object, e As EventArgs) Handles btnGenerate.Click
    ' Generate a new collection of random integers
    plotNumbers = GenerateNumbers(numOfLines)
    ' Show the generated values in a TextBox
    txtDisplay.Text = String.Join(vbCrLf, plotNumbers)
    ' Plot the lines in a PictureBox (named PlotSurface)
    PlotSurface.Invalidate()
End Sub

Private Sub PlotSurface_Paint(sender As Object, e As PaintEventArgs) Handles PlotSurface.Paint
    If plotNumbers Is Nothing OrElse plotNumbers.Count = 0 Then Return

    Dim canvas = DirectCast(sender, Control).ClientSize
    ' Scales the height of the lines to the Height of the Canvas. Remove if not needed
    Dim scaleFactor = canvas.Height / 100.0F
    Dim horzPosition As Single = 1.0F
    Dim line As Integer = 0

    Using pen As New Pen(Color.White, penWidth),
        toCartesianPlane = New Matrix(1, 0, 0, -1, 0, canvas.Height)
        e.Graphics.Transform = toCartesianPlane
        While horzPosition < canvas.Width
            e.Graphics.DrawLine(pen, horzPosition, 0, horzPosition, plotNumbers(line) * scaleFactor)
            horzPosition += penWidth
            line = (line + 1) Mod numOfLines
        End While
    End Using
    e.Graphics.ResetTransform()
End Sub

Private Function GenerateNumbers(numCount As Integer) As List(Of Integer)
    Return Enumerable.Range(0, numCount).Select(Function(n) rnd.Next(0, 101)).ToList()
End Function

它是这样工作的:

ej83mcc0

ej83mcc02#

---〈〈〉〉〈〈〈IMGTART'WRITE'〉〉〉AWM特殊调用fowler作为mobieba公共类表单排序算法Dim rnd作为新的随机数()尺寸编号()作为整数维i作为整数私有子集btnGenerate_Click(sender作为对象,e作为EventArgs)处理btnGenerate。单击Dim i作为整数重新调整数值(19)对于i = 0到19的数字(i)=第二次(0,100)下一个结束子私有子btnDisplayArray_Click(发送者作为对象,e作为事件参数)处理btnDisplayArray。单击txt显示。文本=数值(j)& nums(i)结束子类结束类点击机器人并运行DNS Vitett Customm Off.

相关问题