提问者:小点点

用C++实现连续范围到离散箱的映射


我继承了一个函数的维护,该函数将065535(包括)之间的值作为参数:

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;

我对这里使用的算法感到困惑,特别是以下几个方面:

  1. roundamount背后的意图是什么?我知道它实际上是将最大输入范围划分为离散的块,但是将其添加到headingindex中似乎是一件很奇怪的事情。
  2. RoundedIndex原始值现在是否已偏移或沿顺时针方向旋转了某个偏移量?

该算法产生如下结果:

headingIndex of 0     --> symbol 0
headingIndex of 100   --> symbol 1
headingIndex of 65500 --> symbol 35

我在想一定有更好的办法?


共1个答案

匿名用户

显示的代码看起来非常复杂(可能是防止整数溢出)。确定符号编号的简单得多的方法是如下代码:

    symbol = (headingIndex * 36u) / 65536u;

但是,如果这确实存在整数溢出问题,则可以以double精度进行计算,在四舍五入后将结果转换回int:

    symbol = static_cast<int>( ((headindIndex * 36.0) / 65536.0) + 0.5 ); // Add 0.5 for rounding.

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|连续|离散|箱|映射)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?