价值的变量增加而不是减少

时间:2014-12-04 14:34:07

标签: c++ math

我正在研究一些模拟软件,其中我有一个围绕特定点旋转的实体。

当实体开始围绕该点旋转,并且螺旋的半径继续增长时,我想向用户显示实体已完成的电路数量(电路的完成被定义为位置/时间实体与起始螺旋时的原点达到相同的角度。 我还想向用户显示从飞机当前位置到完成当前电路的距离。

我使用以下代码部分执行此操作:

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
}

3 个答案:

答案 0 :(得分:0)

由于您将角度标准化,使其位于0360之间,因此应该只有两种可能性。角度从某个值开始并减小到0,在这种情况下

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

应该有效,或者角度从某个值开始增加到360,在这种情况下

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

应该有用。

您可以在两种情况下使用第一个版本。

如果两个版本都不起作用,我认为角度不是应该的。也许您可以输出arcAngle的值来检查。

答案 1 :(得分: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

答案 2 :(得分: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(...)解决了我遇到的问题。