Coloque rectángulos al azar pero no dentro del radio x en el centro

¿Cómo puedo colocar rectángulos con ancho y alto variables, aleatoriamente en un escenario pero lejos de un círculo en el centro que tiene un radio de x?

Gracias por adelantado

EDITAR

revisa mi código hasta ahora

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

preguntado el 08 de noviembre de 11 a las 10:11

¿Has probado algo? -

Ingresé una versión minimizada de mi código -

Si el círculo está en el medio de 400x400 (centro en 200x200), puede calcular la posición para verificar si está a 50px de ese punto en cualquier dirección dada. -

Entonces, ¿150 simplificado está bien, pero 151 no está bien y 250 está bien pero 249 no? -

3 Respuestas

Las tres posibles opciones que seguiría son:

  • Genere coordenadas aleatorias en [400,400] y luego verifique que la distancia desde [200,200] sea menor que 50. Si es así, está bien; si no, empiece de nuevo.

  • Genere coordenadas polares aleatorias (es decir, ángulo y distancia), donde la distancia es mayor que 50. Luego conviértalas a cartesianas, centradas alrededor de [200,200] y limitadas a su área ... El problema con este enfoque es que introduciría sesgo en los extremos de su área rectangular.

  • Ignore el círculo y delimítelo con un cuadrado, luego use el primer enfoque pero con lógica simplificada.

respondido 08 nov., 11:14

Para agregar a mi segundo punto, es posible que pueda mapear el anillo circular generado por las coordenadas polares simplistas, que sugerí, arbitrariamente cerca de un "anillo rectangular": su cuadrado con un agujero en el medio ... Quizás un poco ¡¡Aunque sobredimensionado !! - Xophmeister

Un enfoque podría ser pensar en cómo mapear números aleatorios uniformes en posiciones legales.

Por ejemplo (simplificando un poco), si tuvieras un cuadrado de 200 x 200 y quisieras evitar cualquier punto en un cuadrado de 100x100 en el medio, podrías hacer lo siguiente para cada coordenada. Genere un número aleatorio entre 0 y 100. Si es menor que 50, úselo directamente; de lo contrario, agréguele 100 (para ponerlo en el rango de 150-200)

Conceptualmente, esto extiende el rango alrededor del "agujero" en el medio, dejando los puntos resultantes distribuidos uniformemente.

Será más complicado con su círculo, ya que los ejes no son independientes, pero valdría la pena considerar una variación de este método. (Especialmente si solo tiene requisitos "suaves" para la aleatoriedad y, por lo tanto, puede relajar un poco las restricciones en la distribución).

respondido 08 nov., 11:15

No puedo entender el agregado 150 a parte de su respuesta: Cristo

Lo siento, debería haberlo dejado más claro. El cuadrado mide 200 x 200, pero hay una sección de 100 x 100 en el medio que queremos evitar. Entonces, los rangos válidos para una coordenada son 0-50 (antes del cuadrado) y luego 150-200 (después del cuadrado). Entonces, desea mapear un número del 0 al 100 en la unión de estos rangos; la primera mitad del rango aleatorio se asigna a la sección "antes", y la segunda mitad del rango aleatorio se asigna a la sección "después". Excepto dadas estas limitaciones, es realmente 100 que debe agregarse - respuesta editada. - Andrzej Doyle

Comenzaría con un sistema de coordenadas centrado en 0,0 y después de haber generado coordenadas válidas, mapearlas en su cuadrado / rectángulo.

He aquí un ejemplo sencillo:

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

respondido 08 nov., 11:17

¿Usas el teorema de Pitágoras para calcular la distancia? ¿Habrá algún problema si aplico esas x, y a cuadros con ancho: 100 y alto: 20? - Cristo

Esto solo genera puntos que están fuera del círculo central. Se vuelve más complejo cuando tiene cajas de naturaleza rectangular que necesitan "residir completamente fuera del círculo" (¿es así?) Si fueran círculos, podría simplemente agregar el radio del círculo al radio de 50 px del círculo central ( es decir, el radio de exclusión es 50 + r). ¿Qué tan preciso necesitas esto? - James

Necesito llenar un escenario con n cuadros sin superposición y mantenerlos alejados del centro del escenario en un radio x. Las dimensiones del escenario, las cajas y el radio pueden cambiar ... - Cristo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.