【问题标题】:How to draw or plot large amount of points in c# repeatedly?如何在c#中重复绘制或绘制大量点?
【发布时间】:2017-12-19 06:41:12
【问题描述】:

我想在 Winform 应用程序中重复(每 10 毫秒)绘制或绘制大量数据点(近 500,000 个点)。 我使用了一些常见的绘图控件,但他们无法处理。他们变得太慢了。 我的程序做了其他工作,所以它应该是高效的。

有什么建议吗? 谢谢。

【问题讨论】:

标签: c# winforms plot


【解决方案1】:

Windows 窗体可能不是一个很好的选择,但我想除非你尝试一下,否则你不会真正知道。 This answer 是一个很好的起点。我为图片框分配了DirectBitmap

_bitmap = new DirectBitmap(pictureBox1.Width, pictureBox1.Height);
pictureBox1.Image = _bitmap.Bitmap;

然后我创建了一个包含 500,000 个点的数组,我在另一个线程中使用随机数据不断更新:

private const int _numPoints = 500000;
private static Point[] _points = new Point[_numPoints];

现在我清除位图(变为黑色)并通过设置单个像素来绘制点。每 10 毫秒调用一次:

private void DrawPoints() {
    Array.Clear(_bitmap.Bits, 0, _bitmap.Bits.Length);

    int color = Color.Gray.ToArgb();
    for (int i = 0; i < _numPoints; i++) {
        int bmpIndex = _points[i].X + _points[i].Y * pictureBox1.Width;
        _bitmap.Bits[bmpIndex] = color;
    }

    pictureBox1.Invalidate();
}

我的电脑已经使用了将近 5 年,DrawPoints 需要 4 到 16 毫秒才能运行。您可以尝试更多优化,例如使用 8 位位图或从多个线程更新部分位图。

【讨论】:

  • 非常感谢,太好了。你节省了我的时间。
【解决方案2】:

画这么多点是没有意义的,因为屏幕上的像素数量要少得多。

我前段时间遇到了类似的问题,我做了以下过程:
我将数据点的数量减少到更方便的东西。

例如,由于像素的数量,我意识到我不需要超过 1000 个点。实际上,理想的点数是画布宽度。 然后,我计算每个像素要绘制的数据点数。也就是说,如果你有 500k 个数据点,而你的画布是 1000 像素,这意味着一个像素将绘制 500 个数据点。你看,在一列像素中绘制 500 个数据点是没有意义的……

因此,我根据像素数将数据点列表分组。例如,对于第一个像素,我取前 500 个点,对于第二个像素,我取接下来的 500 个数据点,依此类推。

要在一列像素中绘制 500 个数据点,基本上我会定位最大值和最小值并绘制一条垂直线。

希望这种方法对您有所帮助。

【讨论】:

  • 谢谢,考虑一下我有一个散点图,它是 600 * 600 像素。
  • 哼,我说你得处理600分。即 600 组数据点。
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 2013-07-23
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多