xlight = cosf(angle_to_light);
            ylight = sinf(angle_to_light);
            xrotate = A*xlight;// - B*xrepel;// + C*xrandom;
            yrotate = A*ylight;// - B*yrepel;// + C*yrandom;

            angle_to_rotate = acosf( xrotate/( sqrtf(xrotate*xrotate + yrotate*yrotate) ) );
            //printf("xrotate = %f, yrotate = %f, rotate = %f\n", xrotate, yrotate, angle_to_rotate);
            if (angle_to_rotate>0) {
                set_motors(0,kilo_turn_right);
            }
            else if (angle_to_rotate<0) {
                printf("hello\n" );
                set_motors(kilo_turn_left,0);
            }

По какой-то причине я никогда не получаю отрицательное значение для angle_to_rotate. В основном мой код никогда не печатает «привет». angle_to_light может быть +ve или -ve в радианах? как именно работает acosf в С++? пожалуйста помоги

0
user11319000 20 Ноя 2019 в 05:27

1 ответ

Согласно документации, функция acosf возвращает значения в диапазон [0;π].

Математически arccos является многозначной функцией; в частности, cos X == cos -X. Функция C++ может возвращать только одно репрезентативное значение, и они выбрали этот диапазон. Вы можете получить другие значения, добавив 2π и/или отрицая .

0
M.M 20 Ноя 2019 в 05:40
Но в строке acosf есть предложение if-else, которое по-разному вызывает set_motion для + и - angle_of_rotation. Как мне ввести часть else if, если angle_rotation всегда положительный... и некоторые положительные могут быть правильными также потому, что этот фрагмент кода постоянно работает в цикле с разными значениями angle_to_light
 – 
user11319000
20 Ноя 2019 в 05:56
Возможно, вам придется определить направление другим методом, это простой факт, что X и -X имеют одинаковый косинус
 – 
M.M
20 Ноя 2019 в 06:22
Я понял это... я могу просто проверить свой аргумент. В основном, если (аргумент acosf < 0) {угол_поворота = -угол_поворота}. Спасибо вам за помощь!!
 – 
user11319000
20 Ноя 2019 в 07:23
Круто, рад что разобрались
 – 
M.M
20 Ноя 2019 в 08:25