R Read Ответов: 1

Элемент управления диаграммой Visual studio перемещается в точку без рисования линии


Я использую элемент управления диаграммой для построения данных. Когда значение x достигнет 360 градусов, я хочу обернуть данные вокруг и снова начать строить график в/около начала оси x графика. Я делаю это, вычитая 360 из значения x, если значение x равно > 360. Теперь это приводит к тому, что линия будет проведена от значения 360 обратно к началу графика, прежде чем построение начнется снова. Я хочу, чтобы эта линия была прозрачной/не нарисованной. Я имитирую построение графика с помощью кнопки - каждое нажатие кнопки отображает следующую точку.

// Plot Data
float[,] buf = new float[19, 2]{
                    {0.0f, 0.0f},
                    {30, 0.3f},
                    {30, 0.9f},
                    {30, 1.9f},
                    {120, 2.0f},
                    {150, 2.1f},
                    {180, 2.2f},
                    {210, 2.3f},
                    {240, 2.3f},
                    {270, 2.3f},
                    {300, 2.3f},
                    {330, 2.3f},
                    {360, 2.3f},
                    {390, 2.0f},
                    {420, 1.8f},
                    {450, 1.5f},
                    {480, 1.1f},
                    {510, 0.9f},
                    {540, 0.7f},
                   };


public Graph()
{
    InitializeComponent();

    chart1.BackColor = Color.Aquamarine;

    chart1.Series["Series1"].LegendText = "Current";
    chart1.Series["Series1"].IsVisibleInLegend = false;

    chart1.ChartAreas[0].AxisY.Maximum = 2.500;
    chart1.ChartAreas[0].AxisY.Minimum = 0;
    chart1.ChartAreas[0].AxisY.Title = "Current mA";
    chart1.ChartAreas[0].AxisY.Interval = 0.500;
    chart1.ChartAreas[0].AxisX.Maximum = 360;
    chart1.ChartAreas[0].AxisX.Minimum = 0;
    chart1.ChartAreas[0].AxisX.Interval = 60;
    chart1.ChartAreas[0].AxisX.Title = "degrees";

    chart1.Show();
    chart1.Series["Series1"].Points.AddXY(0, 0);

}

bool revolutionFlag = false;
private void button2_Click(object sender, EventArgs e)
{
    if (cnt >= ( buf.Length / 2))
    {
        // End of data array so clear graph and reset data pointer
        cnt = 0;
        chart1.Series["Series1"].Points.Clear();
        revolutionFlag = false;
    }
    else
    {
        if (buf[cnt, 0] > 360)
        {
            float x = buf[cnt, 0] - 360;
            if (revolutionFlag == false)
            {
                // At 360 degrees - change colour before rewinding
                revolutionFlag = true;
                chart1.Series["Series1"].Color = Color.Transparent;
            }
            else
            {
                // Back to plotting
                chart1.Series["Series1"].Color = Color.Blue;
            }
            chart1.Series["Series1"].Points.AddXY(x, buf[cnt, 1]);
        }
        else
        {
            chart1.Series["Series1"].Color = Color.Blue;
            chart1.Series["Series1"].Points.AddXY(buf[cnt, 0], buf[cnt,1]);
        }
        cnt++;
    }


Что я уже пробовал:

Я попытался изменить цвет графика на прозрачный, а затем обратно на синий, надеясь, что это может привести к тому, что линия не будет видна/нарисована - как показано в моем демо-коде. Но это свойство, кажется, применимо ко всем точкам, то есть я просто переключаю цвет. Я искал метод диаграммы, который будет двигаться в положение XY, но ничего не нашел.

1 Ответов

Рейтинг:
12

Patrice T

Рассматривали ли вы возможность рассматривать каждое пересечение 360 как новую серию, чтобы избежать ничьей обертки?

// Plot Data
float[,] buf1 = new float[13, 2]{
                    {0.0f, 0.0f},
                    {30, 0.3f},
                    {30, 0.9f},
                    {30, 1.9f},
                    {120, 2.0f},
                    {150, 2.1f},
                    {180, 2.2f},
                    {210, 2.3f},
                    {240, 2.3f},
                    {270, 2.3f},
                    {300, 2.3f},
                    {330, 2.3f},
                    {360, 2.3f},
                   };
float[,] buf2 = new float[7, 2]{
                    {0, 2.3f},
                    {30, 2.0f},
                    {60, 1.8f},
                    {90, 1.5f},
                    {120, 1.1f},
                    {150, 0.9f},
                    {180, 0.7f},
                   };

И убедитесь, что параметры чертежа одинаковы для обоих.


R Read

Спасибо за это решение - я думал сделать это в качестве последнего варианта, но надеялся на более простое решение, так как у меня также будут другие графики на графике с соответствующими сериями.