一种基于矩形块的颜色渲染方式实现二维数据可视化
在工程实践中,我们有时候需要将二维数据通过颜色渐变或明暗的方法表现。比如,数据Data[W][H],在XOY平面内使用颜色渐变或明暗表示数据值的变化;使用过matlab的朋友都知道imagesc函数,可以将一组二维数据通过图像的方式表现出来。
以下是我采用渲染矩形块的办法实现的imagesc函数,其原理很简单。
源代码如下:
/*Width: 数据行Height: 数据列pImage: 数据指针(取值范围0-255)m_client: 绘制矩形区域dc: 绘图句柄*/void imagesc(UINT Width, UINT Height, double *pImage,CRect &m_client,CClientDC &dc){CRect m_tab;CRgn m_rgn;COLORREF rgb;CBrush *pBrush=NULL;int i,j;double dx=(double)m_client.Width()/Width;double dy=(double)m_client.Height()/Height;//光栅化int color;for(i=0;i<Height;i++)for(j=0;j<Width;j++){m_tab.left =m_client.left +j*dx-1;m_tab.right =m_tab.left +dx+1;m_tab.top =m_client.top +i*dy-1;m_tab.bottom =m_tab.top +dy+1;m_rgn.CreateRectRgnIndirect(m_tab);//取数据color=(int)*(pImage+i*Height+j);rgb=RGB(color,color,color);pBrush=new CBrush(rgb);dc.FillRgn(&m_rgn,pBrush);//销毁资源delete pBrush;pBrush=NULL;m_rgn.DeleteObject();}}
函数使用范例:
CRect m_client;CClientDC dc(this);const int W=100;const int H=100;double *pImage=new double[W*H];int i,j;for(i=0;i<W;i++) //生成测试数据for(j=0;j<H;j++){*(pImage+i*W+j)=*(pImage+i*W+j)=255*sin(j*pi/15)*sin(j*pi/15); //pImage指向的数据取值范围为(0,255),如果实际数据不符,请转换}GetClientRect(m_client);imagesc(W,H,pImage,m_client,dc);delete pImage;pImage=NULL;
测试结果:

使用随机数据,测试结果:

改变imagesc中配色方案,可以用不同颜色取表示数据。更多扩展,可给予上述原理,自行设计。