关于计算的退化

我们在程度设计时,较少遇到一个计算退化的问题,然而发生时却让人猝不及防。

今天在换算引擎可视角时便遇到了这么一件事,观察代码算法,逻辑上讲没有问题,然而在使用时,效果却奇怪的让人诧异!

据观察,多数引擎使用45度的垂直可视角,于是在计算时常常需要用到tan22.5度这个数值。

在问题出现后,我便重新检视计算逻辑,开始怀疑这个值,还尝试把这个值换成宽高比,还修改过中间算法,结果问题仍然没有解决,甚至更严重。

试了几次修改后,经过仔细观察分析,结论是:一定是计算过程中,将渲染引擎中的方向,映射到空间计算引擎中时,出现了偏差(因为两个地方物体大小和位置实际上是一致的);即然一个方向上是正确的,说明这个方向上的计算没有问题,另一个方向上换算时倍率出现了问题。

这样注意到一句代码:

aspect = width / height;

很快意识到左值为float类型,而右值均为整形,计算结果必定也是整形,赋值到左式时虽然隐式转换为浮点,然而早已是被截断的整型值再次转换而来,丢失了原来的小数位。

aspect被退化了!,于是只需要将其中一个值强转为浮点,即可将右式计算变为浮点运算,保留原小数部分:

aspect = (float)width / height;

观察效果,已然正常!

posted @ 2020-06-04 11:42  IceArrow  阅读(231)  评论(0编辑  收藏  举报