2017-07-14 72 views
-2

我想反复(每10ms)在Winform应用程序中绘制或绘制大量数据点(差不多500,000个点)。 我已经使用了一些常见的绘图控件,但他们无法处理这个问题。他们变得太慢了。 我的程序做了另一个工作,所以它应该是有效的。如何反复绘制或绘制c#中的大量点?

有什么建议吗? 谢谢。

+0

我怀疑你可以这样做。 WPF可能会处理它。 – TaW

+0

[一个简单的C#库图形绘制](https://www.codeproject.com/Articles/32836/A-simple-C-library-for-graph-plotting) –

+0

https://msdn.microsoft.com/ en-us/library/sfwzeec0(v = vs.90).aspx –

回答

1

由于屏幕中的像素数量少得多,所以绘制这种点数是没有意义的。

我以前遇到类似的问题,我做了以下过程:
我减少了数据点的数量,使其更加方便。

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

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

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

希望这种方法可以帮助你。

+0

谢谢,考虑我有一个散点图,它是600 * 600像素。 – jamshid

+0

这意味着我有360,000点 – jamshid

+0

嗯,我会说你必须处理600点。这是600组数据点。 – oarrivi

1

Windows窗体可能不是一个很好的选择,但我想你不知道,除非你尝试。 This answer是一个很好的开始。我分配了一个DirectBitmap到一个图片框:

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

然后,我创建了50点,这我用随机数据在另一个线程不断更新的数组:

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

现在我清除位图(黑色)并通过设置单个像素来绘制点。调用此每隔10ms:

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之间服用,以16ms的运行。还有很多优化可以尝试,例如使用8位位图或从多个线程更新部分位图。

+0

谢谢soooooo,这很好。你节省了我的时间。 – jamshid