很难理解你在问什么,而且你的逻辑在数学/地理上似乎并不准确。先决条件似乎是:
- 你有一个从传感器读取的角度,0-360 度。
- 你想打印这个角度的方向,直东是角度 0。
- 指南针的方向是(逆时针)E、ENE、NE、NNE、N 等。
- 总而言之,罗盘上有 16 个这样的方向。因此,我们需要将 360 度分成 16 个不同的方向。不幸的是,360/16 = 22.5,不是偶数。
- 由于 360/16 不是偶数,我们要么必须使用浮点类型,要么在 CPU 受限的低端嵌入式系统的情况下,很可能是这里的情况,将所有整数乘以 10。
如果上述假设是正确的,那么您可以执行以下操作:
const char* DIRECTION [16] =
{
"E",
"ENE",
"NE",
"NNE",
"N",
"NNW",
"NW",
"WNW",
"W",
"WSW",
"SW",
"SSW",
"S",
"SSE",
"SE",
"ESE"
};
const char* get_direction (int angle)
{
angle = angle % 360; /* convert to angles < 360 degrees */
/* Formula: index = angle / (max angle / 16 directions) */
/* Since 360/16 is not an even number, multiply angle and max angle by 10, to eliminate rounding errors */
int index = angle*10 / (3600/16);
if(index == 15) /* special case since we start counting from "the middle of east's interval" */
{
if(angle*10 > 3600-(3600/16)/2)
{
index = 0; /* east */
}
}
return DIRECTION [index];
}
int main()
{
printf("%s\n", get_direction(0)); /* E */
printf("%s\n", get_direction(22)); /* E */
printf("%s\n", get_direction(23)); /* ENE */
printf("%s\n", get_direction(45)); /* NE */
printf("%s\n", get_direction(180)); /* W */
printf("%s\n", get_direction(348)); /* ESE */
printf("%s\n", get_direction(349)); /* E */
printf("%s\n", get_direction(360)); /* E */
getchar();
}
与检查每个间隔相比,这样做的优点是执行时间是确定的,并且与巨大的 switch-case 相比,分支预测更少。
请注意,浮点数将使代码更具可读性,如果您有该选项,则应使用该选项。但我假设这是一个低端嵌入式系统,即 8 位或 16 位 MCU 应用程序。