2010-12-02 796 views
7

Al igual que el título dice, necesito romper un rectángulo en polígonos con forma aleatoria.Rompe un rectángulo en polígonos con forma aleatoria

ejemplo, con 7 polígonos:

+--------+--------+ 
|\  | 2 | 
| \ 1 |''--..__| 
| ------| 5  | 
| 3/ \________| 
| / /\ 6 | 
|__/ 4/\______| 
| /7  | 
+-----+-----------+ 

No sé si hay un algoritmo ya que hay para esto, pero parece que no puede conseguir mi cabeza alrededor de esto.

No me importa particularmente en qué idioma responda, pero lo implementaré en Java/Swing.

+2

No creo que signifique polígonos de "forma aleatoria"; esos polígonos en su ejemplo no tienen forma aleatoria. ¿Quiere decir que no le importa la forma de los polígonos? Eso es diferente de "forma aleatoria". –

+0

@McWafflestix: ¿Qué quiere decir con "forma aleatoria", entonces? Quiero decir que si ejecuta este algoritmo varias veces, los polígonos generados serán diferentes cada uno. –

+0

"aleatorio" no implica ninguna relación con otros miembros del conjunto; para un rectángulo dividido en la forma que indica, algunos miembros tienen una relación con otros miembros (por ejemplo, una longitud de borde común). –

Respuesta

13

Usted puede dejar un montón de puntos al azar en el rectángulo, y calcular el diagrama de Voronoi.

Here is a Java/Swing implementation.

Hice algunas muestras (pero using Mathematica, no la implementación anterior)

alt text

alt text

alt text

HTH!

+0

+1 por pensar lo que estaba pensando :) Tenga en cuenta que las piezas de Voronoi son convexas, mientras que el ejemplo original tenía algunas piezas cóncavas. Podrías fusionar aleatoriamente algunos Negbors Voronoi para obtener cóncavos. – celion

+0

@celion Creo que "con forma aleatoria" es solo un concepto intuitivo ... y el diagrama de Voronoi proporciona un buen patio de recreo para obtener formas extrañas simplemente eliminando algunos bordes. (¡ups! de nuevo pensando lo mismo: D) –

3

Dibujaba un montón de líneas al azar en todo el rectángulo y luego "dividía" las líneas en cada intersección de línea, para que básicamente tuviera algún tipo de red de líneas. A continuación, elimine tantos segmentos de líneas aleatorias como desee hasta llegar al número deseado de polígonos.

Editar: Así que para la muestra hubiera sido así después de la adición de las líneas:

+----+---+----+---+ 
|\'--.\_/| / | 
| \ X |''/-..__| 
|--\--+-\+-/------| 
|___\/___\/_______| 
| /\ /\  | 
|__/__\_/|_\______| 
|/ X | \  | 
++----+-++---+----+ 
+0

Esto me recuerda una versión 2D del [algoritmo de falla] (http://www.lighthouse3d.com/opengl/terrain/index.php3?fault). – Seth

+0

El problema que veo con esto es que es difícil determinar de forma programática qué líneas eliminar. Además, esto tiene la posibilidad de generar pequeños polígonos pequeños, lo que me gustaría evitar si es posible. –

+0

No sabía el algoritmo de falla, pero sí, ¡es muy similar! – Lucero

Cuestiones relacionadas