这是我关于stackoverflow的第一篇文章,对于可能会搞砸的任何事情,我都非常抱歉,但是对于一个项目,我正在做一个用于弹丸运动的模拟器。我只是一个初学者,对图表没有太多的经验,但是没有发现对我有帮助的youtube视频。

该图表绘制的是垂直位移与水平位移的关系图,看起来应该像是倒抛物线,但看起来却不应该如此。

每当线从原点开始但x轴包含负的位移值时,我都在努力正确地设置轴间隔,这肯定不会发生。每次执行不同的模拟时,轴都应更改,以使x轴上的每个间隔都沿着射弹总范围的十分之一。

任何可以指引我正确方向的东西都将非常有用。

vb.net - Visual Basic-制作折线图-LMLPHP

码:

 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

最佳答案

如果要显式设置X轴的最小值,则可以使用Axis.Minimum。在您的情况下,您可以将其用作Chart1.ChartAreas("Default").AxisX.Minimum = SomeValue请注意,以这种方式设置最小值后,轴将自动停止缩放。

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

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

作为对与该问题无关的代码的进一步评论;每次要更新图形时都无需删除ChartArea,而且效率很低,Series也是如此。这样做将导致必须在每次更新时重新设置图表的格式(就像您实际上对系列所做的一样)。

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

编辑:

我还看到您将x位置四舍五入到小数点,大概是为了防止x轴上长丑陋的数字。但是,一种更好的方法是为轴指定format:

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

10-02 20:04