在嵌入式平台上,常常可以看到坐标和长度的换算。
比如,如果手机屏幕是240x320的,则屏幕可见的X的坐标为[0,239],可见的Y的坐标为[0,319]。为此还有计算坐标和长度转换公式,X2 - X1 = W - 1,X1、X2、W均为正,W为两点间的距离。
初看起来还是有道理的,因为至少在求屏幕宽度的时候是有作用的(320 = 319 - 0 +1),但仔细分析之后,你会发现这种带1的运算很坑爹。
我也是在屏幕指定矩形区域内绘制最大数量的汉字时发现的,因为我发现在我的计算没有出问题的情况下,我计算出来的矩形区域宽度明显比它实际的宽度要小,以致于比预期的能够多显示一个汉字。
尽管我花了很多时间去调试,总结起来却很简单:因为上面那种计算公式会带来误差。
最简单的例子,我从横坐标X=0开始,每次横向增加距离2像素,4次以后计算最终的X位置。根据上面的公式,加距离计算新的坐标要减1,所以4次以后,X=4;而4次连续移动,实际上横向距离增加了8,如果上面的公式依然正确的话,计算出来的X=7。这样在坐标上总共就有3像素的误差,而且移动的次数越多,误差越大;同理,用以上公式多次计算长度,长度也会有误差。
因此,个人觉得所谓“坐标和长度转换公式”其实很坑爹,如果直接运算,不考虑坐标和长度的性质差异,最多也只有单位1的误差;而用了这个公式以后,反而将误差越弄越大。
P.S.:
但是,之后我的理解是,W的宽度是包含了X1、X2(假设X2>X1)两个端点在内的,新的W’就要对应新的端点X1’、X2’(X2’ > X1’);如果X1’和X2相邻,那么X1’ = X2 + 1或者X2’ = X1 - 1。因此上面的4次宽度为2的连续移动,第一次的终点是1;但是第二次移动的时候,起点就应该是2了,依此类推……所以4次移动结束以后X=7,和一次移动8的宽度得到的终点坐标是一样的。
posted on 2012-07-02 19:53
Long 阅读(537)
评论(0) 编辑 收藏 引用 所属分类:
Embedded technology