【问题标题】:Move from angle A to B, find shortest direction从角度 A 移动到 B,找到最短的方向
【发布时间】:2011-08-30 19:55:47
【问题描述】:

我有一个角度 A 和一个目标角度 B

角度的范围是 -180 到 180

我希望角度 A 向角度 B 移动 X 度

我面临的问题是,如果 A 是 170 而 B 是 -170,显然增加到 180 并跳到 -180 会更快,但是在比较角度时我总是得到一个负 X。所以不是走最快的路,而是走最长的路。

我希望有人能理解我表述不当的问题:)

A = A + ((A-B) / Math.Abs(A-B)) * speed * -1;

编辑:添加代码

【问题讨论】:

  • 请展示您目前已实现的代码,建议对已编写的内容进行更改会更容易:)
  • 好的,我添加了用于移动角度 A 的公式
  • 只是一点评论,因为我认为这是一些家庭作业:......你的问题是你的范围 - 如果你切换到 [0..360) 并做一些小的“模”魔法问题会容易得多:)
  • 相关:如果在游戏(或其他一些图形应用程序)中使用它,您需要一个对象向另一个对象旋转,请参阅here 以获取不涉及三角学的解决方案。

标签: c# math angle


【解决方案1】:

计算两个角度的差。如果生成的角度x 大于 180 度,则使用此角度向另一个方向走:360-x

如果您使用 0 到 360 的范围,您可以更轻松地计算差异。

【讨论】:

  • 好的,我添加了一个变量,如果绝对距离大于 180 则为 -1,并将运动乘以该变量。现在一切正常。非常感谢。
【解决方案2】:

这是一个完整的例子:

void Main()
{
    int speed = 5;

    int angleA = 170;
    int angleB = -170;

    int antiClockwiseDistance = Math.Abs(180 - angleA) + Math.Abs(-180 - angleB);
    int clockwiseDistance = angleB - angleA;

    Console.WriteLine(clockwiseDistance);
    Console.WriteLine(antiClockwiseDistance);

    if(clockwiseDistance < antiClockwiseDistance)
    {
        angleA += speed;
    }
    else
    {
        angleA -= speed;
    }

    // TODO: Code to wrap an angle outside the range (i.e. 190 => -170)

    Console.WriteLine(angleA);
}

【讨论】:

    【解决方案3】:

    想象你是一个人,你需要解决这个问题。你会怎么做?

    写五六个例子,包括“特殊”角度,如 0、180、-180 和接近它们的值。

    画出每一个例子。

    不难找到一种简单易懂的算法,它使用一两个条件并得出结果。

    特别是,你只需要找到两条路径中最短的一条,所以一个很好的抽象是找出每条路径的长度,然后比较它们并选择一个长度更小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多