2013-02-21 164 views
4

基本上我想生成一個角度(0 - 360度),不在其他角度的指定範圍內。我已經作出此功能檢查兩個角度:我需要幫助優化功能

function check(angle1, angle2, range) { 
    var diff = angle1 - angle2; 

    if(Math.abs(diff % 360) <= range || (360-Math.abs(diff % 360)) <= range) { 
     return true; 
    } else { 
     return false; 
    } 
} 

很簡單,但我需要檢查對所有其他角度的任意角度,如果它通過繼續,產生一個新的角度,如果失敗複檢​​,並承認當任何新角度都無法通過時。

,我認爲這會工作:

var others = [array of objects]; 

... 

for(var i = 0; i < 360; i++) { 
    var pass = true; 
    for(var n = 0; n < others.length; n++) { 
     if(check(i, others[n].angle, 5)) { 
      pass = false; 
      break; 
     } 
    } 
    if(pass) return i; 
} 

return false; 

當然,這是循環的很多,我會更喜歡一個隨機的角度,而不是增加。有沒有更快,更好的方法來做到這一點?謝謝。

編輯:決定做這樣的事情,從@ TheBronx的答案得到的想法。

var angles = []; 

var range = 5; 

function alterAngle(a, n) { 
    var angle = a + n; 
    if(angle < 0) angle = 360 + angle; 
    if(angle > 360) angle = angle - 360; 
    return angle; 
} 



// in the function 

var angle = Math.floor(Math.random() * 360); 

if(angles.indexOf(angle) == -1) { 
    for(var i = -range; i <= range; i++) 
    angles.push(alterAngle(angle, i)); 
} 
+1

也許[代碼審查。 se]可能是更適合這個問題的網站? – 2013-02-21 12:09:37

+0

只是好奇,範圍是一個小值?像5º?在最壞的情況下你有多少個角度? – TheBronx 2013-02-21 12:11:19

+0

你的角度是整數嗎? – 2013-02-21 12:12:16

回答

3

想法。想象一下你的角度是甲板上的牌。一旦你產生了一個隨機的角度,你可以從甲板上移除角度,也可以移除你的範圍內的角度。 當你不得不產生一個新的角度,而不是產生一個0..360之間的隨機數,你只需要「選擇一張牌」。這將始終有效,除非你沒有更多的「卡」可用。

問題是,你有很多卡嗎?你有沒有足夠的時間在開始時初始化「卡片」?

只是一個想法...不知道它是否好,但似乎很有前途。

+0

這是一個好主意!我會對它進行測試,如果有效,我會發布。謝謝。 – Suffick 2013-02-21 12:25:02

+0

管理範圍證明是相當困難的。我以爲我可以拼接數組中的一塊,但最終會拼接出之前拼接的跳躍。如果我弄明白這一點,它可能仍然有效。 – Suffick 2013-02-21 12:41:41

+0

是的,刪除是一個問題。一旦你選擇一個角度,你必須檢查並刪除'範圍* 2'角度。但是檢查並不是非常耗時,並且你可以一次刪除所有角度(當你知道從哪裏開始並完成拼接時)......它可能工作。 – TheBronx 2013-02-21 12:49:26

1

這一個

if(Math.abs(diff % 360) <= range || (360-Math.abs(diff % 360)) <= range) { 
    return true; 
    } else { 
    return false; 
} 

你可以做這樣一來,這將降低運營

return Math.abs(diff % 360) <= range || (360-Math.abs(diff % 360)) <= range; 
+1

,如果你將'Math.abs(diff%360)'存儲在一個var中,你不必計算兩次。它可能不是他想要的解決方案,但當他使用'功能檢查'很多次優化它是有道理的 – TheBronx 2013-02-21 12:24:02

+0

沒有跨過我的腦海,謝謝。 – Suffick 2013-02-21 13:03:21

0

基於我的前一個問題:Fischer Yates shuffle in coffee-script

var counter, i, permutations, shuffle, x, _i; 

// Fischer Yates shuffle algorithm 
shuffle = function(arr, required) { 
    var i, index, randInt, _i, _ref, _ref1, _ref2; 
    if (required == null) { 
    required = arr.length; 
    } 
    randInt = function(n) { 
    return Math.floor(n * Math.random()); 
    }; 
    if (required > arr.length) { 
    required = arr.length; 
    } 
    if (required <= 1) { 
    return arr[randInt(arr.length)]; 
    } 
    for (i = _i = _ref = arr.length - 1, _ref1 = arr.length - required; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = _ref <= _ref1 ? ++_i : --_i) { 
    index = randInt(i + 1); 
    _ref2 = [arr[i], arr[index]], arr[index] = _ref2[0], arr[i] = _ref2[1]; 
    } 
    return arr.slice(arr.length - required); 
}; 


// generate array of all possible angles 
var angles = [] 
for(i=0;i<360;i++){ angles.push(i) } 

// shuffle as many as you need (20 in this example) 
var shuffled = shuffle(angles,20) 

// check the result 
console.log(shuffled) 

// simply deal off values from this shuffled array as needed