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

#javascript #math #raphael

#javascript #математика #рафаэль

Вопрос:

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

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

Редактировать

проверьте мой код до сих пор

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

Комментарии:

1. Вы что-нибудь пробовали?

2. Я ввел минимизированную версию своего кода

3. если круг находится в середине 400×400 (центр в 200×200), вы могли бы вычислить положение, чтобы проверить, находится ли оно на расстоянии 50 пикселей от этой точки в любом заданном направлении.

4. Итак, упрощенный 150 — это нормально, но 151 — это не нормально, и 250 — это нормально, но 249 — это не так?

Ответ №1:

Три потенциальных варианта, которым я бы следовал::

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

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

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

Комментарии:

1. Чтобы добавить к моему второму пункту, вы можете отобразить круглое кольцо, сгенерированное с помощью предложенных мной упрощенных полярных координат, произвольно близко к «прямоугольному кольцу»: вашему квадрату с отверстием посередине… Хотя, возможно, это немного переработано!!

Ответ №2:

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

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

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

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

Комментарии:

1. Я не могу понять добавление 150 к части вашего ответа

2. Извините, я должен был сделать это более понятным. Квадрат имеет размер 200 x 200, но в середине есть участок 100 x 100, которого мы хотим избежать. Таким образом, допустимые диапазоны для координаты равны 0-50 (до квадрата), а затем 150-200 (после квадрата). Итак, вы хотите отобразить число от 0 до 100 в объединение этих диапазонов; первая половина случайного диапазона отображается в разделе «до», а вторая половина случайного диапазона отображается в разделе «после». За исключением этих ограничений, действительно следует добавить 100 элементов — отредактированный ответ.

Ответ №3:

Я бы начал с системы координат с центром в 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);
}
  

Комментарии:

1. Вы используете теорему Пифагора для вычисления расстояния? Возникнет ли проблема, если я применю эти x, y к блокам шириной: 100 и высотой: 20?

2. Это просто генерирует точки, которые находятся за пределами центрального круга. Это становится более сложным, когда у вас есть прямоугольники, которые должны «полностью находиться за пределами круга» (это верно?) Если бы это были круги, вы могли бы просто добавить радиус круга к радиусу центральной окружности в 50 пикселей (т. Е. Радиус исключения равен 50 r). Насколько точно вам это нужно?

3. Мне нужно заполнить сцену n прямоугольниками без перекрытия и держать их подальше от центра сцены в радиусе x. Размеры сцены, боксов и радиуса могут измениться…