4

基本的に、他の多くの角度の指定された範囲内にない角度(0〜360度)を生成したいと思います。私はすでに2つの角度をチェックするためにこの関数を作成しました:

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

3 に答える 3

3

考え。あなたの角度がデッキのカードだと想像してください。ランダムな角度を生成したら、デッキからその角度を削除し、範囲内の角度も削除します。新しい角度を生成する必要がある場合は、0..360 の間でランダムに生成する代わりに、「カードを選ぶ」だけで済みます。利用可能な「カード」が他にない限り、これは常に機能します。

問題は、カードをたくさん持っているかどうかです。開始時に「カード」を初期化するのに十分な時間がありますか?

単なるアイデアです...それが良いかどうかはわかりませんが、有望なようです.

于 2013-02-21T12:15:39.517 に答える
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;
于 2013-02-21T12:17:00.493 に答える
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
于 2013-02-21T12:25:04.377 に答える