2013-04-24 102 views
0

的收敛是我的问题:三角和角度

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

我需要编写一个函数,将角度拉近一个等于收敛速度的因子。例如,如果我具有0.5的会聚率和两个角度:80°和40°,则输出应该是一对角度70°和50°(以便它们在60°的会聚角的一半处) °)。这个配置相当明显,但在一般情况下我很难处理这个问题,因为我在三角学方面非常糟糕,而且从未与我的职业角度合作过,所以我没有经验。所以这个函数需要适用于任何角度配置,因为例如,如果差值> 180,我需要反转操作,因为角度表示为整数,我必须使用加减运算

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

解决方案越轻松越好。

+0

@dhg我发现了一个函数来计算差异,调整到比率,然后我必须写条件来选择哪个角度应该增加,哪一个减少。 – Chobeat 2013-04-24 10:57:19

+0

@ alex23一般的解释就足够了或伪代码。如果有人有兴趣直接写代码而不是解释,我只是写了这些语言,但显然这不是我要求的 – Chobeat 2013-04-24 10:58:23

回答

1

Original Angles = o1 o2。

差d = O2-O1(注意这是肯定的,假定O1 < O2)

中间角M = O1 +(d/2)

收敛因子= F

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

如果我是正确的,这是必需的。因为角度始终在0-360之间,并且假设您只需要逆时针找到中间值并且所有。

+0

是和不是。 +后面的逻辑是我的问题,因为它并不明显 – Chobeat 2013-04-24 11:00:48

+0

为什么这么说?你能解释一下使用值吗? – 2013-04-24 11:02:05

+0

为什么是-1?请至少留下评论来解释-1 – 2013-04-24 11:07:35

0

这是由我的一位朋友生成的实现。我知道这是垃圾斯卡拉代码,但他写在命令性的伪代码,我没有转换它的功能,但它是一个公平的解决方案。测试了一堆输入,看起来很好。

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) 
    }