【问题标题】:Smallest difference between two angles?两个角度之间的最小差异?
【发布时间】:2011-07-17 06:22:07
【问题描述】:

我正在尝试计算两个角度之间的最小差异。

这是我当前的代码(与我在网上找到的内容略有不同):

float a1 = MathHelper.ToDegrees(Rot);
float a2 = MathHelper.ToDegrees(m_fTargetRot);

float dif = (float)(Math.Abs(a1 - a2);

if (dif > 180)
  dif = 360 - dif;

dif = MathHelper.ToRadians(dif);

除了在圆形边缘的情况外,它工作正常。例如,如果当前角度为 355 度,目标角度为 5 度,则计算出的差值为 -350 而不是 10,因为 365 度等于 5 度。

关于我可以做些什么来完成这项工作的任何想法?

【问题讨论】:

  • 这看起来是正确的。你也不需要转换成度数然后再转换成弧度 - 你可以用弧度计算
  • 答案中不喜欢MathHelper.WrapAngle :(
  • 很棒的电话,@Andrew。我在没有任何 MathHelper 知识的情况下来到这里,但 WrapAngle 似乎是写解决方案。希望您发布了解决方案,但既然您没有发布,我将更新我的答案。

标签: c# math xna


【解决方案1】:

你基本上拥有它。只需在检查是否大于 180 之前取 dif 模数 360:

float a1 = MathHelper.ToDegrees(Rot);
float a2 = MathHelper.ToDegrees(m_fTargetRot);

float dif = (float)Math.Abs(a1 - a2) % 360;

if (dif > 180)
    dif = 360 - dif;

dif = MathHelper.ToRadians(dif);

编辑:@Andrew Russell 在 cmets 中对您的问题提出了一个很好的观点,下面的解决方案利用了他建议的 MathHelper.WrapAngle 方法:

diff = Math.Abs(MathHelper.WrapAngle(a2 - a1));

【讨论】:

  • 我怎么知道是增加还是减少差异?
  • 抱歉,我不太确定你在问什么...代码应该是完整的,并且总是返回一个介于 0 和 180(含)之间的正值。
  • 请注意MathHelper.WrapAngle 以弧度为单位,因此如果使用它,请不要进行度数转换。 (真的从来没有必要:2π 弧度 = 360 度。别忘了我们的朋友MathHelper.TwoPi!)
  • 好点,@Andrew。我应该指出没有必要转换为学位的事实。
【解决方案2】:

您将扩大检查范围之外的角度:

if (dif < 0) dif = dif + 360;
if (dif > 180) dif = 360 - dif;

【讨论】:

  • 为什么投反对票?如果你不解释你认为错误的地方,它就无法改进答案。
【解决方案3】:

我从不喜欢用 case 语句处理零包装。相反,我使用点积的定义来计算两个角度之间的(无符号)角度:

vec(a) . vec(b) = ||a|| ||b|| cos(theta)

我们只是要制作 a 和 b 单位向量,所以||a|| == ||b|| == 1

由于vec(x) = [cos(x),sin(x)],我们得到:

unsigned_angle_theta(a,b) = acos(cos(a)cos(b) + sin(a)sin(b))

(n.b. 所有角度的弧度)

【讨论】:

    【解决方案4】:

    您可以将结果归一化为 0

    while(theta < 0) { theta += 360; }
    

    如果您想以弧度表示答案(推荐):

    const Double TwoPi = 2 * Math.Pi;
    while(theta < 0) { theta += TwoPi; }
    

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2019-10-06
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多