三角学和角度收敛

时间:2013-04-24 10:48:54

标签: java scala trigonometry angle

这是我的问题:

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

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

例如,如果我的收敛速度为0.5和两个角度:80°和40°,则输出应为70°和50°的几个角度(因此它们距会聚角度为60°的一半) )。这个配置相当明显,但我很难在一般情况下解决这个问题,因为我在三角测量方面非常糟糕,而且在我的职业生涯中从未使用角度,所以我没有经验。所以这个函数需要适用于角度的任何配置,并且出现问题,因为例如,如果差值> 180,我需要反转操作,因为角度表示为整数,我必须使用求和减法

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

解决方案越轻越好。

2 个答案:

答案 0 :(得分:1)

原始角度= o1 o2。

差异D = o2-o1(注意这是积极的,假设o1

中角M = o1 +(D / 2)

收敛因子= F

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

如果我是正确的,这就是所需要的。因为角度总是在0-360之间,并且假设你只需逆时针去寻找中间值和所有。

答案 1 :(得分:0)

这是我的朋友制作的一个实现。我知道它是 shitty 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)
    }