关于上一篇文章中提到的家庭作业

关于上一篇文章中提到的家庭作业

作者:BlogUpdater |  时间:2019-12-02 |  浏览:663 |  评论已关闭 条评论

今天来回答在上一篇文章中提到的”家庭作业”。

关于iMin的计算
iMin表示绘制区域的最小索引,所以简单的使用简单的截断除法就可以计算出来。

关于iMax的计算
关于iMax的计算,可以有两种不同的方法。

第一种方法
计算第一个不可见行(注意这里的”不”字)的向上进位值(Roundup)。还记得吗?一个矩形的坐标定义中,是不包含终结点(endpoint)的,所以,rcPaint.bottom实际上位于绘制矩形之外的第一个不可见行。因为我们需要得到第一个完全位于绘制矩形之外的行索引,所以这里使用了向上进位。

第二种方法
在第二种方法中,我们使用了看上去完全等效的算法。
在第一步中,以下公式可以得到最后一个可见行的索引,通过添加一个像素单位,我们得到了第一个不可见行的索引。

在上面两个方法中,我们都考虑到了计算结果超出总行数的可能性,所以,通过比较算法(min/max)来确保我们不会绘制一个实际上不存在的东西。

对于下一个问题
虽然以上两个计算公式看起来是等效的,但是,当rcPaint.bottom小于等于0时,公式中的整数除法将会得到0,这将会导致错误的计算结果(iMax将会计算得到1,而不是预期中的0)。当整数除法得到负无穷时,计算公式才是正确的。

为什么这又不是一个大问题
如果使用了错误的公式,只是会导致我们绘制了不需要绘制的行,这在我们的示例中,不是一个大问题,因为绘制过程会非常快,但是如果绘制一个条目需要耗时很久,则避免绘制不需要绘制的条目,将会很大程度上提升程序性能。

我们将在第4章节演示使用错误的公式带来的效果:它将绘制出比较奇怪的东西。拭目以待!

评论已关闭。