最近做一个项目,需要实时绘制曲线,X轴为时间轴,在时间轴上显示实时时间;由于曲线是实时更新的,会由右向左移动;但是程序运行后,发现曲线有抖动,X轴上显示的时间值也有抖动(只是前后抖动);
进过检查发现是每个坐标(Location)的问题,我用PointF作为坐标点,但问题来了:
用graphics.drawLine或graphics.drawstring画图时,对PointF会进行取整,例如 PointF(10.3f,20.0f),画到bitmap上就变成了Point(10,20);
这个我做过一些测试:例如画两条竖线 -
line01 (Point(0,0),Point(0,50))
line02(PointF(0.7f,50.0f),Point(0.7f,100.0f))
理论上这两条竖线在X坐标轴上只差0.7个像素(我设置的graphics的画图单位为Pixel)。但实际画到bitmap上时,这两条竖线在X方向上差了1个像素。
又例如:
line01 (Point(0,0),Point(0,50))
line02(PointF(0.2f,50.0f),Point(0.2f,100.0f))
画到bitmap上时,这两条竖线在X方向没有偏差。0.2f四舍五入变成了0.0f;
我想这就是抖动的原因:例如一个时间坐标“a”显示在X轴上,其X坐标会随时而改变,对其X坐标的算法是: 当前获得的时间减去a的时间值,再转换成毫秒值b,再将b转换成X轴的坐标值;最后的结果是一个float型数值,可是GDI+在画图时,对这个数值进行了取整操作。如下图:当程序运行后,这些时间值会向左移动,但是移动时会前后抖动。
请问有没有办法可以使GDI+ 绘图时保证能完全按照PointF指定的坐标点绘制,而不进行取整运算。
或者是其他的办法,来保证画图效果? DirectX2D可以做到吗?不太懂DirectX2D...