本篇文章简单。
一、引子
vs2015, mfc
最近几天在弄个小程序,用来显示声音的波形图。由于一些文件较大,得有几十MB,所以在画波形图时很慢,为了提高效率,采用了如下思路:
由于采样数很多,所以画出来后,屏幕上的一个像素点就对应了多个采样点的线条,所以对它进行修改,把每个像素点对应的采样分为一组,然后对这个组中查找最大值和最小值,这样一个像素点就只需要画一条线,效率大大提高。画出来的结果总体上不错,但仔细看,中间有些空白,没有连续,如下图所示的B点:
为了看清楚,上图是放大8倍时的情况,B点明显是断开的,实际应该要达到像A点那样,是连起来的状态才对。
二、问题解决
由于这里面只用到了CDC的画线,所以其问题肯定就是出在了 LineTo()的函数上。首先就是要先确定画的坐标是否正确,通过跟踪发现,坐标没错,B点确实是(253,33)。
其实一下子就想到,肯定是声音很小的时候,这个位置应该是一条线,即显示声音值为0的状态。通过仔细对比,确实如此。
根据前面说的画图方式,取得每个像素点的最大值和最小值,然后画一条线即可。在声音很小的时候,最大值和最小值对应的坐标就一样了,比如上图中B点,它的两个坐标都是(253,33),则画图时就成了这样子:
dcMem.MoveTo(253,33);
dcMem.LineTo(253,33);
正常应该画个点出来呀,但实事证明,它没有画出来任何东西,就是一个空白!为了解决这个问题,在画线之前先判断两个坐标点是否一样,如果一样就画点:
dcMem.SetPixel(253,33,RGB(0,0,0));
这样修改之后,问题解决。
三、结论
根据以上描述,得出这样的结论:
CDC::LineTo()所画的点,是不包括结束的那个点。