Переменная увеличивается в значении, а не уменьшается

0

Я работаю над некоторым программным обеспечением для моделирования, в котором у меня есть сущность, которая вращается вокруг определенной точки.

Когда объект начинает вращаться вокруг точки, и радиус спирали продолжает расти, я хочу отобразить количество схем, которые объект завершил для пользователя (завершение схемы определяется как местоположение/время, в которое объект достигает того же угла от начала координат, на котором он был, когда он начал вращаться). Я также хочу показать пользователю, расстояние от текущего местоположения самолета до точки, в которой он завершит текущий контур.

Я делаю это, используя следующий раздел кода:

if (m_OVF_TURN_DIR == TURN_LEFT)
    {
        arcAngle = 360 - (NormalAngle360(NormalAngle360(ldFAZ_CentrePos_AC) + NormalAngle360(m_circuitStartAngle))); 
        m_SteerData.DistanceToGo = (arcAngle * PI * m_currentRadius);
    }
    else
    {
        arcAngle = 360 - (NormalAngle360(NormalAngle360(m_circuitStartAngle) + NormalAngle360(ldFAZ_CentrePos_AC))); 
        m_SteerData.DistanceToGo = ((arcAngle * PI * m_currentRadius) / 180.0); // Nm
    }

В этом коде строки:

m_SteerData.DistanceToGo = (arcAngle * PI * m_currentRadius);

а также

m_SteerData.DistanceToGo = ((arcAngle * PI * m_currentRadius) / 180.0); 

это то, что вычисляет расстояние от текущего местоположения самолета до точки, в которой он завершит схему.

Первый блок используется для вычисления расстояния, когда объект спирально вращается против часовой стрелки, а второй блок используется, когда объект вращается по часовой стрелке.

Похоже, что направление по часовой стрелке работает correctly-, оно отображает номер для расстояния, и это число неуклонно уменьшается, когда объект следует по пути спирали. Тем не менее, направление против часовой стрелки, похоже, начинается с случайного числа, а затем неуклонно возрастает по мере того, как сущность следует по пути спирали... а не уменьшается по мере того, как это должно (поскольку объект движется ближе к точке, в которой схема будет завершена).

Это говорит мне, что я использую неправильный символ где-то в этом блоке (+, -, * или /), но я не могу понять, где... Может ли кто-нибудь указать мне в правильном направлении?

Функция NormalAngle360() определяется с помощью:

double NormalAngle360(const double aInAngle)
{
    //## Operation [c0b17aaa-bda1-4164-8ba7-5f960c924a32]
    double ldAngle = NormalAngle(aInAngle);
    if (ldAngle < 0.0) 
        ldAngle += 360.0;
    return ldAngle;
    //## Operation End
}
  • 0
    Можете ли вы опубликовать свой код для NormalAngle360
  • 0
    Код для NormalAngle360 добавлен.
Показать ещё 4 комментария
Теги:
math

3 ответа

0

Я нашел issue- проблема была, что я пропустил в - знак от вызываемой функции в if пункте заявления:

if (m_OVF_TURN_DIR == TURN_LEFT)
    {
        arcAngle = 360 - fabs((NormalAngle360(-NormalAngle360(ldFAZ_CentrePos_AC) + NormalAngle360(m_circuitStartAngle)))); 
        m_SteerData.DistanceToGo = (arcAngle/180 * PI * m_currentRadius);  
    }

Использование "-NormalAngle360 (...) в самой внутренней скобке здесь разрешило проблему, которую я имел.

0

Линии в ваших if... else ветвях делают то же самое:

    arcAngle = 360 - (NormalAngle360(NormalAngle360(ldFAZ_CentrePos_AC) + NormalAngle360(m_circuitStartAngle))); 

    arcAngle = 360 - (NormalAngle360(NormalAngle360(m_circuitStartAngle) + NormalAngle360(ldFAZ_CentrePos_AC))); 

потому что 360 - (a+b) совпадает с 360 - (b+a). Вам нужно будет переосмыслить эту логику.

Также вам не нужны два внутренних вызова NormalAngle360, строка может быть записана как:

arcAngle = 360 - NormalAngle360( ldLAZ_CentrePos_AC + m_circuitStartAngle );

Возможно, то, что вы ищете, просто меняет + на - здесь; и/или вынимая 360 -.

Кроме того, функция NormalAngle360 должна проверять, есть ли угол >= 360.0 и вычесть 360 из него.

  • 0
    Строки в my if ... else не совсем делают то же самое - предложение else вычисляет расстояние с помощью ((arcAngle * PI * m_currentRadius) / 180.0); тогда как if вычисляет расстояние с помощью: m_SteerData.DistanceToGo = (arcAngle * PI * m_currentRadius); , Предложение else , которое вычисляет расстояние, когда объект движется в направлении по часовой стрелке, работает правильно - значение, которое оно отображает для расстояния, является правильным, и оно ведет обратный отсчет до 0, когда объект приближается к концу своей дуги. Тем не менее, if не совсем правильно работает - отображаемое значение рассчитывает вверх, а не вниз
  • 0
    Разница между if и else заключается в том, что в else я делю значение на 180 ... но я не уверен, что мне следует делать в if , и почему генерируемое им значение увеличивается по мере приближения сущности к концу дуга, а не уменьшается ...?
Показать ещё 1 комментарий
0

Поскольку вы нормализуете угол так, чтобы он находился между 0 и 360, должны быть только две возможности. Либо угол начинается с некоторого значения и уменьшается до 0, и в этом случае

m_SteerData.DistanceToGo = (arcAngle/180 * PI * m_currentRadius); 

должен работать, или угол начинается с некоторого значения и увеличивается до 360, и в этом случае

m_SteerData.DistanceToGo = ((360 - arcAngle)/180 * PI * m_currentRadius); 

должно сработать.

Возможно, вы можете использовать первую версию для обоих случаев.

Если обе версии не работают, я думаю, что угол не тот, каким он должен быть. Возможно, вы могли бы вывести значения arcAngle чтобы проверить это.

  • 0
    Спасибо за ваш ответ, я дал вам предложение относительно расстояния против часовой стрелки, но оно все еще начинается с, казалось бы, случайного значения (вполне может быть фактическим расстоянием до дуги), но затем скорее увеличивается, чем уменьшается по мере того, как самолет следует за дугой. Тем не менее, после внесения изменений, которые вы предложили здесь, похоже, что они растут быстрее, чем раньше ...
  • 0
    Хорошо. Можете ли вы сказать, где начинается arcAngle , и увеличивается ли он или уменьшается, в обоих случаях, пожалуйста?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню