Использую вот этот "виртуальный джойстик" для android приложения. Необходимо перевести данные от джойстика (он может дать: угол 0-359 и расстояние 0-99) в однозначное направление(право, право-вверх, вперед, лево-вверх, лево итд).
Например, разделить круг на равные части и каждой из пар присвоить направление.
Что-то из серии:
string temp(double value){
string str = "";
if (value <= 1 || value >= 15)
str = "право";
else if (value <= 2)
str = "право вверх";
else if (value <= 4)
str = "прямо";
else if (value <= 6)
str = "лево вверх";
else if (value <= 8)
str = "лево";
else if (value <= 10)
str = "лево назад";
else if (value <= 12)
str = "назад";
else if (value <= 14)
str = "назад право";
return str;
}
int main(){
int value = 240; // от 0 до 359
cout << temp(value / 22.5);
}
UPD:
Получается так. Еще бы без повторов.. Но так тоже неплохое упрощение.
string str[] = {"R", "U R", "U R", "F", "F",
"U L", "U L", "L", "L",
"D L", "D L", "D", "D",
"D R", "D R", "R"};
int main(){
int value = 240; // от 0 до 359
cout << str[(int)(value / 22.5)];
}
UPD1:
Или я не правильно понимаю идею комментария или правда не работает
string str[] = {"R", "U R","F", "U L", "L", "D L", "D", "D R"};
string str_dbl[] = {"R", "U R", "U R", "F", "F",
"U L", "U L", "L", "L",
"D L", "D L", "D", "D",
"D R", "D R", "R"};
int main(){
int value;
for (int i = 0; i < 5; i++){
value = rand() % 358 + 1;
cout << i << '\t' << value << '\t';
cout << str_dbl[(int)(value / 22.5)] << "\t:\t";
cout << str[(int)((value - 22.5) / 45)] << endl;
}
}
// 0 172 L : U L
// 1 263 D : D L
// 2 308 D R : D
// 3 212 D L : L
// 4 92 F : U R
Ответ
Спасибо Serodv и Kromster. Конечный вариант:
string str[] = {"R", "U R","F", "U L", "L", "D L", "D", "D R"};
int main(){
int value = 240; // от 0 до 359
cout << str[(( (int)(value + 22.5) ) % 360) / 45];
}
Комментариев нет:
Отправить комментарий