Что может привести к получению одинакового выхода тригонометрических функций под разными углами - PullRequest
0 голосов
/ 23 апреля 2019

Попробуйте вручную нарисовать линию, используя circle() (рисует закрашенный круг вокруг ее), слегка обновив ее центральную переменную, которая является координатой на моем изображении. Обновление происходит путем добавления sin (a) и cos (a) к X и Y плоскости, где «a» - угол. Таким образом:

        // This is a multi threaded application.
        // part of another function where i update the 'angle'variable
        // ............
        if (buffer.modified())  // If buffer is modified
        {
            for (int k = 0; k < PB; k++)
            {
                if (buffer.data[k]>0)
                {
                    size=buffer.data[k];
                    angle = k;
                    break;
                }
            }
            buffer.unmodify();                          // Disable flag
            draw_line( size, angle);
        }
        // ............
        // ............


        //The draw_line() function in an infinite loop

        // ............
        // circle() function goes here
        // ............
        //update coordinates
        x_coord += sin(angle*pi/180);
        y_coord += cos(angle*pi/180);

        //update circle()'s center Point
        image.start.x = x_coord;
        image.start.y = y_coord;

        //show the results
        cout<<"
              cos("<<angle*pi/180<<")="<<cos(angle*pi/180)<<"
              sin("<<angle*pi/180<<")="<<sin(angle*pi/180)<<endl;
        // ............
        // ............

Круг и функции обновления зациклены вместе. Вот круг называется:


        circle(bckg, image.start, 1, Scalar( color[0],color[1],color[2] ), FILLED,LINE_8 );

Ожидалось, что код будет иметь разные значения для sin (60) и sin (70), но строка останется такой же, как и отлаженный вывод. Проверьте это:

//THE OUTPUT

input angle: 30
cos(0.523599)=0.866025    sin(0.523599)=0.5

input angle: 60
cos(1.0472)=0.5    sin(1.0472)=0.866025

input angle: 70
cos(1.0472)=0.5    sin(1.0472)=0.866025


input angle: 80
cos(1.0472)=0.5    sin(1.0472)=0.866025

input angle: 90
cos(1.0472)=0.5    sin(1.0472)=0.866025 

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

У вас есть ошибка в той части кода, где вы вводите угол и вычисляете angle*pi/180 из него.Для 60 градусов действительно angle*pi/180 составляет 1,0472.Для других углов в вашем примере вывода - 70, 80, 90, вы явно не вычисляете это снова, и вы остаетесь с 1,0472.Я не знаю почему - пример кода, который вы вставили, явно не тот код, который печатает вывод отладки, который вы показали (например, ничего в вставленном вами коде не печатает «угол ввода» или не устанавливает его).

0 голосов
/ 24 апреля 2019

Выяснилось, что поток, отвечающий за обновление буфера, блокирует буфер с помощью mutex.lock() сразу после того, как ему нужно обновить ввод, который в последнее время будет отображаться. Пока состояние заблокировано, я заставляю его рисовать (это означает, что оно должно обновлять угол). Поскольку он не может обновить угол Решение было нарисовано только после того, как буфер был разблокирован и изменен одновременно.

...