Visual Basic - 制作折线图

3
这是我在stackoverflow上的第一篇文章,所以提前对我可能搞砸的事情表示抱歉,但是为了一个项目,我正在做一个弹道模拟器。我只是一个初学者程序员,对图表没有太多经验,但我找不到任何有用的YouTube视频。
该图表绘制垂直位移与水平位移之间的关系,并且应该看起来像一个倒置的抛物线,但它看起来根本不像应该的样子。
我很难正确设置轴间隔,每次线条都应该从原点开始,但是x轴包含位移的负值,这绝对不应该发生。每次进行不同的模拟时,轴都应该更改,以便x轴中的每个间隔大约是弹丸总范围的十分之一。
任何可以指引我朝着正确方向前进的东西都会非常有用。

Screenshot of chart on runtime

代码:

 Public Sub CreateDiagram(ByVal flightRange As Double, ByVal totalTime As Double, ByVal velocity 
 As Double, ByVal angle As Double, ByVal elevation As Double, ByVal heightOfProjectile As Double)

    Chart1.Titles.Add("Projectile Motion")
    Chart1.ChartAreas.Clear()
    Chart1.ChartAreas.Add("Default")

    Dim xAxisInterval As Integer = CInt(totalTime / 10)
    Dim yAxisInterval As Integer = CInt(heightOfProjectile / 10)

    With Chart1.ChartAreas("Default")
        .AxisX.Interval() = xAxisInterval
        .AxisY.Interval() = yAxisInterval

    End With

    Chart1.Series.Add("projection")
    Chart1.Series("projection").Color = Color.Black
    Chart1.Series("projection").ChartType = DataVisualization.Charting.SeriesChartType.Line


    For x = 0 To totalTime Step 0.1

        Dim xPos As Double = findXLocation(velocity, angle, x)
        Dim yPos As Double = findYLocation(velocity, angle, x, elevation)

        Chart1.Series("projection").Points.AddXY(xPos, yPos)

    Next

End Sub 

编辑:findXLocation和findYLocation代码:

Public Function findYLocation(ByVal velocity As Double, ByVal angle As Double, ByVal time As Double, ByVal elevation As Double) As Double
    Dim y As Double

    y = elevation + findVerticalVelocity(velocity, angle) - ((0.5 * gConstant) * (time ^ 2))
    y = Math.Round(y, 1)


    If y < 0 Then
        y = 0
    End If


    Return y

End Function
Public Function findXLocation(ByVal velocity As Double, ByVal angle As Double, ByVal time As Double) As Double
    Dim x As Double

    x = findHorizontalVelocity(velocity, angle) * time
    x = Math.Round(x, 1)

    If x < 0 Then
        x = 0
    End If

    Return x
End Function

我猜你的屏幕截图没有传过来。如果没有 findXLocation()findYLocation() 方法,调试起来会很困难。 - Mary
1个回答

0

如果您想明确设置X轴的最小值,可以使用Axis.Minimum。在您的情况下,您将使用它Chart1.ChartAreas("Default").AxisX.Minimum = SomeValue 请注意,以这种方式设置最小值时,轴将停止自动重新缩放。

如果您希望在所有x值为正数时最小值始终为零,请查看Axis.IsStartedFromZero

我希望我正确理解了您的问题,因为您提到了间隔,但似乎在谈论x轴的最小值。

关于您的代码与问题无关的进一步评论;每次更新图表时删除ChartAreaSeries是不必要且低效的。这样做将导致每次更新都必须重新格式化图表(就像您实际上正在对系列进行的操作一样)。

只需调用 YourSeries.Points.Clear(),然后添加新的数据点即可。这样,您就不必在每次更新时重新指定系列颜色和图表类型。

编辑:

我还看到您将 x 位置四舍五入到小数点后一位,可能是为了防止 x 轴上出现长而丑陋的数字。但是,更好的方法是为轴指定一个 格式

chart1.ChartAreas.FirstOrDefault.AxisX.LabelStyle.Format = "{0:0.0}" 在您的情况下。这样,您的系列仍将存储精确值,但只显示一位小数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接