2013-04-24 169 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) 
    }