Страницы

Поиск по вопросам

среда, 28 ноября 2018 г.

Как упростить алгоритм определения сектора по углу и расстоянию?

Использую вот этот "виртуальный джойстик" для 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]; }

Комментариев нет:

Отправить комментарий