#javascript #math #raphael
#javascript #математика #рафаэль
Вопрос:
Как я могу размещать прямоугольники с переменной шириной и высотой случайным образом на сцене, но вдали от круга в центре, радиус которого равен x
Заранее спасибо
Редактировать
проверьте мой код до сих пор
Комментарии:
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. Размеры сцены, боксов и радиуса могут измениться…