我继承了一个函数的维护,该函数将0
和65535
(包括)之间的值作为参数:
MyClass::MappingFunction(无符号短headingIndex);
可以使用以下公式将headingIndex
转换为度数:度数=headingIndex*360/65536
该函数的作用是将headingindex
转换为36个表示不同旋转度的符号中的1个,即有一个表示10度的符号,一个表示20度的符号等等,以10度为单位,最多360度。
headingIndex为0将转换为显示0(360)度符号。
该函数执行以下我似乎无法理解的操作:
const int MAX_INTEGER = 65536;
const int NUM_SYMBOLS = 36;
int symbolRange = NUM_SYMBOLS - 1;
int roundAmount = MAX_INTEGER / (symbolRange + 1) - 1;
int roundedIndex = headingIndex + roundAmount;
int symbol = (symbolRange * roundedIndex) / MAX_INTEGER;
我对这里使用的算法感到困惑,特别是以下几个方面:
roundamount
背后的意图是什么?我知道它实际上是将最大输入范围划分为离散的块,但是将其添加到headingindex
中似乎是一件很奇怪的事情。RoundedIndex
原始值现在是否已偏移或沿顺时针方向旋转了某个偏移量?该算法产生如下结果:
headingIndex of 0 --> symbol 0
headingIndex of 100 --> symbol 1
headingIndex of 65500 --> symbol 35
我在想一定有更好的办法?
显示的代码看起来非常复杂(可能是防止整数溢出)。确定符号编号的简单得多的方法是如下代码:
symbol = (headingIndex * 36u) / 65536u;
但是,如果这确实存在整数溢出问题,则可以以double
精度进行计算,在四舍五入后将结果转换回int
:
symbol = static_cast<int>( ((headindIndex * 36.0) / 65536.0) + 0.5 ); // Add 0.5 for rounding.