2014-12-04 4 views
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); 

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

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

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

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

Функция 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 – 3Demon

+0

Код для 'NormalAngle360'. – someone2088

+0

Код, в котором m_currentRadius изменяется и объявляется. Скорее всего, что-то не так с этой переменной, я думаю, что она вообще не уменьшается. – 3Demon

ответ

0

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

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

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

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

должен работать ,

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

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

+0

Спасибо за ваш ответ, я дал ваше предложение относительно расстояния против часовой стрелки, но оно все еще начинается с кажущейся случайной величины (это может быть фактическое расстояние дуги), но затем увеличивается, а уменьшается, как самолет следует за дугой. Однако после внесения изменений, которые вы предложили здесь, он, кажется, растет быстрее, чем раньше ... – someone2088

+0

Хорошо. Можете ли вы сказать, где начинается 'arcAngle', и если это будет увеличиваться или уменьшаться, для обоих случаев, пожалуйста? – alain

+0

'arcAngle' - это угол между двумя линиями (линия A от центра спирали к текущему положению объекта и линия B от центра спирали до конца дуги, которая начинается с текущего положения объекта). Длина дуги рассчитывается в зависимости от скорости движения объекта и расстояния от центра спирали. Я работаю с дугами как срезы круга, поэтому, если дуга начинается в точке X и продолжается по часовой стрелке, ее угол будет увеличиваться дальше по кругу, который он перемещает. Если он проходит против часовой стрелки, его угол будет уменьшаться. – someone2088

0

Линии в вашем, если ...остальное отрасли как сделать то же самое:

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

Строки в моем if ... else не совсем то же самое - предложение 'else' вычисляет расстояние с помощью' ((arcAngle * PI * m_currentRadius)/180.0); ', тогда как' if' вычисляет расстояние с помощью: 'm_SteerData.DistanceToGo = (arcAngle * PI * m_currentRadius);'. Предложение 'else', которое вычисляет расстояние, когда объект движется в направлении по часовой стрелке, работает правильно - значение, которое оно отображает для расстояния, является правильным, и оно отсчитывается до 0, когда объект приближается к концу дуги.Тем не менее, 'if' работает не совсем корректно - значение, которое оно отображает, подсчитывается вместо down – someone2088

+0

Разница между' if' и 'else' заключается в том, что в' else' я делю значение на 180. но я не уверен, что я должен делать в 'if', и почему значение, которое оно генерирует, увеличивается, когда объект приближается к концу дуги, а не уменьшается ...? – someone2088

+0

@ someone2088 Цитируемые строки делают то же самое. Если это преднамеренно, вы можете сделать этот расчет до 'if'. Это говорит мне, что вы не делаете правильный расчет. –

0

Я нашел проблемный проблема заключалась в том, что я пропустил в - знак от вызываемой функции в пункте 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 (...) в самая внутренняя скобка разрешила проблему, которая у меня была.

Смежные вопросы