Visual Basic - создание линейной диаграммы - PullRequest
2 голосов
/ 16 октября 2019

Это мой первый пост о 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 code:

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

1 Ответ

0 голосов
/ 18 октября 2019

Если вы хотите явно установить минимальное значение оси X, вы можете использовать Axis.Minimum . В вашем случае вы бы использовали его как Chart1.ChartAreas("Default").AxisX.Minimum = SomeValue Обратите внимание, что когда вы устанавливаете минимум таким образом, ось автоматически прекращает масштабирование.

Если вы хотите, чтобы минимум всегда был равен нулю, когда все значения x положительны, посмотрите на Axis.IsStartedFromZero

Надеюсь, я правильно понял ваш вопрос, потому что вы упоминаете интервалы, но, похоже, говорите о минимальном значении вашей оси x.

В качестве дополнительного комментария к вашему коду, не связанному с вопросом;Нет необходимости и неэффективно удалять ChartArea каждый раз, когда вы хотите обновить график, то же самое относится и к Series. Выполнение этого приведет к необходимости переформатировать диаграмму при каждом обновлении (как вы на самом деле делаете с сериями).

Достаточно вызвать YourSeries.Points.Clear() и затем добавить новые точки. Таким образом, вам не нужно повторно указывать цвет серии и тип диаграммы при каждом обновлении.

РЕДАКТИРОВАТЬ:

Я также вижу, что вы округлите положение x доодин десятичный знак, предположительно, чтобы на оси х не было длинных уродливых чисел. Однако лучший способ сделать это - указать формат для оси:

chart1.ChartAreas.FirstOrDefault.AxisX.LabelStyle.Format = "{0:0.0}" в вашем случае. Таким образом, ваша серия все равно будет хранить точное значение, но будет отображаться только один десятичный знак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...