我正在研究一些模拟软件,其中我有一个围绕特定点旋转的实体。
当实体开始围绕该点旋转,并且螺旋的半径继续增长时,我想向用户显示实体已完成的电路数量(电路的完成被定义为位置/时间实体与起始螺旋时的原点达到相同的角度。 我还想向用户显示从飞机当前位置到完成当前电路的距离。
我使用以下代码部分执行此操作:
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 :(得分:0)
由于您将角度标准化,使其位于0
和360
之间,因此应该只有两种可能性。角度从某个值开始并减小到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(...)解决了我遇到的问题。