2013-02-21 116 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