Я работаю над некоторым программным обеспечением для моделирования, в котором у меня есть сущность, которая вращается вокруг определенной точки.
Когда объект начинает вращаться вокруг точки, и радиус спирали продолжает расти, я хочу отобразить количество схем, которые объект завершил для пользователя (завершение схемы определяется как местоположение/время, в которое объект достигает того же угла от начала координат, на котором он был, когда он начал вращаться). Я также хочу показать пользователю, расстояние от текущего местоположения самолета до точки, в которой он завершит текущий контур.
Я делаю это, используя следующий раздел кода:
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
}
Я нашел 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 (...) в самой внутренней скобке здесь разрешило проблему, которую я имел.
Линии в ваших 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
из него.
else
вычисляет расстояние с помощью ((arcAngle * PI * m_currentRadius) / 180.0);
тогда как if
вычисляет расстояние с помощью: m_SteerData.DistanceToGo = (arcAngle * PI * m_currentRadius);
, Предложение else
, которое вычисляет расстояние, когда объект движется в направлении по часовой стрелке, работает правильно - значение, которое оно отображает для расстояния, является правильным, и оно ведет обратный отсчет до 0, когда объект приближается к концу своей дуги. Тем не менее, if
не совсем правильно работает - отображаемое значение рассчитывает вверх, а не вниз
if
и else
заключается в том, что в else
я делю значение на 180 ... но я не уверен, что мне следует делать в if
, и почему генерируемое им значение увеличивается по мере приближения сущности к концу дуга, а не уменьшается ...?
Поскольку вы нормализуете угол так, чтобы он находился между 0
и 360
, должны быть только две возможности. Либо угол начинается с некоторого значения и уменьшается до 0
, и в этом случае
m_SteerData.DistanceToGo = (arcAngle/180 * PI * m_currentRadius);
должен работать, или угол начинается с некоторого значения и увеличивается до 360
, и в этом случае
m_SteerData.DistanceToGo = ((360 - arcAngle)/180 * PI * m_currentRadius);
должно сработать.
Возможно, вы можете использовать первую версию для обоих случаев.
Если обе версии не работают, я думаю, что угол не тот, каким он должен быть. Возможно, вы могли бы вывести значения arcAngle
чтобы проверить это.
arcAngle
, и увеличивается ли он или уменьшается, в обоих случаях, пожалуйста?
NormalAngle360
добавлен.