我需要帮助优化功能
问题描述:
基本上我想生成一个角度(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));
}
答
想法。想象一下你的角度是甲板上的牌。一旦你产生了一个随机的角度,你可以从甲板上移除角度,也可以移除你的范围内的角度。 当你不得不产生一个新的角度,而不是产生一个0..360之间的随机数,你只需要“选择一张牌”。这将始终有效,除非你没有更多的“卡”可用。
问题是,你有很多卡吗?你有没有足够的时间在开始时初始化“卡片”?
只是一个想法...不知道它是否好,但似乎很有前途。
答
这一个
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;
答
基于我的前一个问题: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
也许[代码审查。 se]可能是更适合这个问题的网站? – 2013-02-21 12:09:37
只是好奇,范围是一个小值?像5º?在最坏的情况下你有多少个角度? – TheBronx 2013-02-21 12:11:19
你的角度是整数吗? – 2013-02-21 12:12:16