如何根据离散数据动态显示曲线波形

puhuofeie 2004-06-23 08:11:59


我们在处理数字信号的时候经常需要根据离散的数据显示波形,以下文字简述如何动态显示波形。
主要使用了Timer函数和双缓存技术。
主要步骤:
1. 设置Timer。
2. 在OnTimer中使用双缓存,在内存中画图。

主要程序如下:
f为频率参数,
A为幅度参数。

1. 首先在初始化函数中申请存储离散点的数组,本程序暂存储1024个点,使用正弦波数据。
void CLineView::OnInitialUpdate()
{
CView::OnInitialUpdate();
fArray = new float [W];

for( int i=0;i<W;i++ )
{
fArray[i] = (float)sin(i/f);

}
SetTimer(10,100,NULL);
}

2. 在OnTimer中使用memdc,在内存中画图,然后贴到设备dc上。
void CLineView::OnTimer(UINT nIDEvent)
{

if( tempNum < W - Num )
tempNum++;
else
tempNum=0;

CDC *pDC = GetDC();

CRect rect;
this->GetClientRect(&rect);

//内存绘图
CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
//memBitmap.LoadBitmap(IDB_BITMAP1);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
DrawWave(&memDC);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);

memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();

CView::OnTimer(nIDEvent);
}

产生波形函数如下:
void CLineView::DrawWave(CDC *pDC)
{

long i;
CRect rect;
CBrush brush( RGB(255,255,255) );
this->GetClientRect(&rect);
pDC->FillRect(&rect,&brush);


CPen* pPenRed = new CPen;// 创建画笔对象
pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));// 红色画笔
CPen* pPenBlue = new CPen;// 创建画笔对象
pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));// 蓝色画笔

CPen * pOldPen;


pOldPen = pDC->SelectObject(pPenBlue);
//原点坐标为(100,250)
pDC->MoveTo(80,250);
pDC->LineTo(600,250);
pDC->LineTo(590,255);
pDC->MoveTo(600,250);
pDC->LineTo(590,245);

pDC->MoveTo(100,400);
pDC->LineTo(100,100);
pDC->LineTo(95,110);
pDC->MoveTo(100,100);
pDC->LineTo(105,110);

CPoint * pList;
pList = new CPoint [Num];

pDC->SelectObject(pPenRed);

for( i=0;i<Num;i++ )
{
pList[i] = CPoint(100+i,250-(int)(fArray[tempNum+i]*A) );

}
for( i=0;i<Num;i++ )
{
pDC->PolyBezier(pList,Num);

}

pDC->SelectObject(pOldPen);

delete [] pList;
}


读者可以根据自己需要,动态设置波形数据,幅度频率等参数。
时间仓促,难免有误,望大家指正。
代码经调试通过,如需源程序请
http://www.life-abroad.com/bbs/dispbbs.asp?boardID=18&ID=39&page=1
如有问题请留言
...全文
506 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
csyw 2004-06-30
  • 打赏
  • 举报
回复
mark
nlstone 2004-06-24
  • 打赏
  • 举报
回复
一点补充:因为timer消息是位于当前线程消息队列中,且定时不精确,所以实时场合建议更多地使用timeSetEvent(),这样的回调会被自动放到一个新的线程来做,且定时相对准确.

如果要求更高精度的定时(譬如与屏幕刷新同步),可使用DX的函数,获取硬件显示垂直刷新信号来做,这是我知道的最精确的定时的法子.
VCnst2 2004-06-24
  • 打赏
  • 举报
回复
定时控件不好,还是线程处理好
programfanny 2004-06-23
  • 打赏
  • 举报
回复
Good
Wenxy1 2004-06-23
  • 打赏
  • 举报
回复
mark

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧