动态按比例绘制波形的思路以及按关系缩放公式

来源:互联网 发布:html5权威指南 源码 编辑:程序博客网 时间:2024/05/17 03:03

在动态绘制中一开始出现的问题,主要是没有做到一个点一个点的绘制,是一段一段的绘制的所以移动的时候给人一种一卡一卡的感觉,这个问题一开始显示数据的时候都没有发现这个问题不对,后来时间长了才发现为什么绘制那么规整,数据的波动没有体现出来,查看代码发现,这个一段一段的绘制不对,应该每加入一个点就应该按比例缩放一下

这里先给出一个比例缩放公式,本人感觉很好用,可以有效的将数据比例关系缩放到要显示的最大范围之内

缩放后值=(当前值-这组数据最小值)/(这组数据最大值-这组数据最小值)* 数据范围;

这个公式可以有效的解决数据太大或者太小的问题。

接下来介绍大体流程:
线程接受到数据后,显示计时器开始执行,显示计数器中主要执行的操作就是一点一点的拿数据按比例缩放,然后放到一个容器中然后 通过MoveToEx和LineTo绘制点,当然还要注意到将图片显示时要使用双缓存机制来绘制图片,要不会出现闪烁现象,这里贴出部分绘制代码

HDC hDC = pDC->GetSafeHdc();::GetClientRect(hWnd, rect);/****创建第二缓存区****/ CDC dcMen;CBitmap bmp;dcMen.CreateCompatibleDC(pDC);                                  // 创建依附窗口bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());   // 创建兼容位图dcMen.SelectObject(&bmp);                                       // 将位图选入内存dcMen.FillSolidRect(rect, pDC->GetBkColor());                   // 使得新创建的缓存区的背景和原背景一致HDC hDCMen = dcMen.GetSafeHdc();// 绘制坐标轴if ( iCoorAxisNumber == 0 )    return false;int iCoorHeight = (rect.Height() - (25 * iCoorAxisNumber)) / iCoorAxisNumber;int iCoorWidth = rect.Width() - 40;for ( int i = 0; i < iCoorAxisNumber; i++ ){    CoorSystemDemo coorsystem;    coorsystem.DrawCoor(hDCMen, rect.left + 20, rect.top + (20 + iCoorHeight) * (i + 1), iCoorWidth, iCoorHeight);    coorsystem.DrawXAxisScale(hDCMen);    coorsystem.DrawYAxisScale(hDCMen);}// 绘制曲线// 设置绘制曲线的画笔m_hOldPen =  dcMen.SelectObject(&m_hNewPen);if ( ShowData ){    if ( !m_vectRawDataArray.size() )        return false;    if ( !m_vectRawDataArray.at(0).m_deqEEGData.size() )        return false;    for ( size_t i = 0; i <  m_vectRawDataArray.size(); i++)    {        int iXStart = 20, iYStart;        int iXEnd, iYEnd;        for ( int j = 1; j < m_vectRawDataArray.at(i).m_deqEEGData.size(); j++ )        {            iYStart = m_vectRawDataArray.at(i).m_deqEEGData.at(j - 1);            iXEnd = iXStart + 1;            iYEnd = m_vectRawDataArray.at(i).m_deqEEGData.at(j);            MoveToEx(hDCMen, iXStart, iYStart, NULL);            LineTo(hDCMen, iXEnd, iYEnd);            iXStart = iXEnd;        }        m_vectRawDataArray.at(i).m_deqEEGData.clear();    }}// 贴图到到界面中pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcMen , 0, 0, SRCCOPY);// 释放资源::DeleteDC(dcMen);::DeleteObject(bmp);::ReleaseDC(hWnd, hDCMen);m_vectRawDataArray.clear();

这里没有比例缩放和动态移动部分,会在后面添加,这个代码还在修改中,估计下周动态显示可以出现完整的。