情况:
我有一个Chart和三个ChartArea在视图中对齐,缩放,光标通过AxisViewChanged方法以这种方式起作用:
if (e.Axis == ax1)
{
ax2.ScaleView.Size = ax1.ScaleView.Size;
ax2.ScaleView.Position = ax1.ScaleView.Position;
ax3.ScaleView.Size = ax1.ScaleView.Size;
ax3.ScaleView.Position = ax1.ScaleView.Position;
min = (int)ax1.ScaleView.ViewMinimum;
max = (int)ax1.ScaleView.ViewMaximum;
}
if (e.Axis == ax2)
{
....
在两种情况下它都能很好地工作:当我放大/缩小或滚动时。
问题:
问题是我的图表来源是由很多点组成的,在最坏的情况下我们会讨论3'600'000个样本。使用这些样本数量时,当我使用光标移动点并尝试显示带有值的工具提示时,交互质量会崩溃并变得无法使用(甚至设置了快速线)。 所以我尝试实现一个简单的抽取算法来减少显示点的数量:
void draw_graph(int start, int end)
{
double fract_value = 0;
int int_value = 0;
int num_saples_selected = end - start;
if(num_saples_selected <= MAX_GRAPH_NUM_SAMPLES)
fill_graphs_point(0, end, 1);
else
{
fract_value = ((double)num_saples_selected) / ((double)MAX_GRAPH_NUM_SAMPLES);
int_value = (int)fract_value;
if (fract_value > int_value)
int_value++;
fill_graphs_point(0, end, int_value);
}
}
void fill_graphs_point(int start, int end, int step)
{
int i = 0;
for (i = start; i < end; i=i+step)
{
dlChart.Series[SERIES_VOLTAGE].Points.AddXY(timestamps_array[i], voltage_array[i]);
dlChart.Series[SERIES_CURRENT].Points.AddXY(timestamps_array[i], current_array[i]);
dlChart.Series[SERIES_ENERGY].Points.AddXY(timestamps_array[i], energy_array[i]);
// I will use this to came back to real position of the initial array
decimation_positions.Add(i);
}
}
Assuminig我用这个方法很好地减少了点数,我不知道在哪里调用函数“draw_graph”。如果我把它放在AxisViewChanged方法中,当我滚动(水平)我的图形时它也将调用我的方法,这不是我想要的。我想只在zoom和unzoom事件上调用我的方法。
预期行为:在第一个视图中(没有任何缩放),图形必须显示图形趋势的“想法”。然后对于每个选择/(非)缩放我想调用我的函数来检查所选部分的点数是否适合我的窗口大小MAX_GRAPH_NUM_SAMPLES(= 10000)。
希望有人可以帮助我。无论何种建议都将受到赞赏。提前谢谢。