這是很難理解你的要求,而你的邏輯在數學和地理上看起來並不準確。的先決條件似乎是:
- 你必須從一個傳感器,0-360度的角度讀。
- 要打印此角度的方向,其中直東部是角度0.
- compass的方向是(逆時鐘方向)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();
}
其優點,相對於檢查每間隔,是執行時間是確定的,並且還將有比在一個巨大的開關情況下更少的分支預測。
請注意 float number會使代碼更具可讀性,如果您有該選項,應該使用它。但我認爲這是一款低端嵌入式系統,即8位或16位MCU應用程序。
傳感器有一個屬性'windspeed',實際上是一個方向看起來......錯了! –
解釋什麼不起作用以及您嘗試過什麼,並將您的windspeed變量重命名! –
如果風速等於'34'會怎麼樣? –