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

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

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

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

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

接下来介绍大体流程:
线程接受到数据后,显示计时器开始执行,显示计数器中主要执行的操作就是一点一点的拿数据按比例缩放,然后放到一个容器中然后 通过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();

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

猜你喜欢

转载自blog.csdn.net/bloke_come/article/details/74011819