0

这是我的问题:

2 个角度表示为从 0 到 360(或 359,如果需要)的整数 1 个从 0 到 1 的双倍,表示收敛速度。

我需要编写一个函数,将角度拉近一个等于收敛速度的因子。

例如,如果我的收敛率为 0.5 和两个角度:80° 和 40°,则输出应该是 70° 和 50° 的几个角度(这样它们就在 60° 会聚角的中间)。这种配置相当明显,但在一般情况下我很难解决这个问题,因为我在三角学方面真的很差,而且在我的职业生涯中从未使用过角度,所以我没有经验。所以这个函数需要处理任何角度的配置,问题就出现了,因为例如,如果差值大于 180,我需要反转操作,因为角度表示为整数,我必须使用求和和减法

我需要在 Scala 中实现它,但可以随意用 Java、伪代码或任何其他流行语言编写您的建议,我希望将您的代码翻译成 Scala 不会出现问题。

溶液越轻越好。

4

2 回答 2

1

原始角度 = o1 o2。

差异 D= o2-o1(注意这是正数,假设 o1 < o2)

中角 M= o1 + (D/2)

收敛因子 = F

新角度 = M +- (D/2)*F

如果我是正确的,这就是所需要的。由于角度始终在 0-360 之间,并且假设您只需要逆时针方向即可找到中间值和所有值。

于 2013-04-24T10:59:19.220 回答
0

这是我的一个朋友制作的一个实现。我知道这是糟糕的scala代码,但他用命令式伪代码编写了它,我还没有将它转换为函数式,但这是一个公平的解决方案。在一堆输入上进行了测试,看起来不错。

  def adjustAngles(aa1: Int, aa2: Int):(Int,Int)= {
        def convergenceRate=0.5
      var diff = aa2 - aa1;
      var a1 = aa1
      var a2 = aa2
      if (diff > 180) {
        diff -= 360;
      } else if (diff < -180) {
        diff += 360;
      }

      a1 = ((a1 + diff / 2 * convergenceRate) % 360).toInt; 
      if (a1 < 0) {
        a1 += 360;
      }

      a2 = ((a2 - diff / 2 * convergenceRate) % 360).toInt
      if (a2 < 0) {
        a2 += 360;
      }
      (a1, a2)
    }
于 2013-04-24T17:06:18.907 回答