Разместите прямоугольники случайным образом, но не в пределах радиуса х в центре - PullRequest
0 голосов
/ 08 ноября 2011

Как я могу разместить прямоугольники с переменной шириной и высотой, произвольно на сцене, но вдали от круга в центре с радиусом x

Заранее спасибо

РЕДАКТИРОВАТЬ

пока проверьте мой код

http://jsfiddle.net/chchrist/cAShH/1/

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Три возможных варианта, которые я бы выбрал:

  • Создайте случайные координаты в [400,400], а затем проверьте, что расстояние от [200,200] меньше 50. Если это так, хорошо; если нет, начните снова.

  • Генерация случайных полярных координат (т. Е. Угла и расстояния), где расстояние больше 50. Затем преобразуйте их в декартову, с центром в районе [200,200] и ограниченную вашей областью ... Проблема с этим подходом является то, что это приведет к смещению в конечностях вашей прямоугольной области.

  • Игнорируйте круг и ограничьте его квадратом, затем используйте первый подход, но с упрощенной логикой.

1 голос
/ 08 ноября 2011

Один из подходов может заключаться в том, чтобы подумать о том, как отобразить единообразные случайные числа в допустимые позиции.

Например (слегка упростить), если у вас был квадрат 200 x 200, и вы хотели избежать любых точекквадрат 100x100 в середине, вы можете сделать следующее для каждой координаты.Генерация случайного числа от 0 до 100. Если оно меньше 50, используйте его напрямую;в противном случае добавьте 100 к нему (чтобы поместить его в диапазон 150-200)

Концептуально это расширяет диапазон вокруг «дыры» в середине, в то же время оставляя полученные точки равномерно распределенными.

С вашим кругом будет сложнее, поскольку оси не являются независимыми, но стоит рассмотреть вариант этого метода.(Особенно если у вас есть только «мягкие» требования к случайности, и вы можете немного ослабить ограничения на распределение).

0 голосов
/ 08 ноября 2011

Я бы начал с системы координат с центром в 0,0, и после того, как вы сгенерировали действительные координаты, отобразите их на свой квадрат / прямоугольник.

Вот простой пример:

function getValidCoordinates() {
    var x, y, isValid = false;

    while (!isValid) {
        x = Math.random() * 400 - 200;
        y = Math.random() * 400 - 200;

        if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) > 50)
            isValid = true;
        //else alert('too close ' + x + ',' + y);
    }

    return {x: x + 200, y: y + 200};
}

for (var i=0; i < 10; i++) {
    var co = getValidCoordinates();
    alert('x=' + co.x + ', y=' + co.y);
}
...