Dadas las coordenadas de varios puntos en un plano, y el radio de un círculo que rodea cada punto, dibuje polígonos que representen los círculos y los bordes donde los círculos se encuentran. Los bordes rectos siempre caerán a lo largo de las líneas de intersección círculo-círculo , pero podrían no seguir la longitud total de estas líneas.
Según la sugerencia de mbomb007 , imagine el comportamiento de las pompas de jabón 2D. Eso es técnicamente incorrecto, porque las burbujas de jabón siempre se encontrarían en ángulos de 120 ° para minimizar la energía, mientras que estos círculos pueden encontrarse en cualquier ángulo.
Este es un diagrama de Voronoi, menos un plano de área definida. Gracias Andreas . Esto es en realidad una generalización de un diagrama de Voronoi llamado diagrama de poder .
Ejemplos
Por ejemplo, dados dos puntos y dos radios, la salida podría verse así:
Agregue otro punto y radio y la salida podría verse así:
Entrada
Puede estructurar la entrada como lo desee. Por favor, publique los resultados con las siguientes entradas.
Prueba 1
- x: 10, y: 10, r: 10
- x: 25, y: 12, r: 8
Prueba 2
- x: 8, y: 10, r: 6
- x: 20, y: 8, r: 4
- x: 18, y: 20, r: 12
Salida
La salida debe ser gráfica y debe incluir bordes de polígono, pero no se requiere nada más. Los puntos e intersecciones no necesitan ser representados como lo están en los ejemplos.
Restricciones
- No existirá ningún punto dentro del radio de otro círculo.
- Reglas estándar de codegolf.
- No se aceptarán respuestas con lagunas , pero siéntase libre de divertirse con eso.
fuente
Respuestas:
Python 2,
473355bytesEsto lee un conjunto de círculos como
(x,y,r)
tuplas en stdin, y genera una imagen en formato PGM para stdout. Funciona aproximadamente calculando una función de distancia del diagrama en cada píxel y sombreando cada píxel a menos de un píxel de forma proporcional a su distancia.Aquí la función de distancia se ha dividido entre 32 para que sea visible:
fuente
exec"%s=m%s(%s for u,v,r in L);"*4%('a','in','u-r','b','ax','v-r','c','in','u+r','d','ax','v+r')
C # ~ 2746
Esta es una solución en C #. Probablemente lejos de ser óptimo, pero C # no ganará esto de todos modos. Solo quería demostrar que puedo hacerlo.
La entrada a través de la línea de comandos especificando los valores separados con un espacio en el orden xyr La salida es un archivo 'l.bmp' dentro del directorio de ejecución.
El programa acepta cualquier cantidad de círculos.
Prueba 1: 10 10 10 25 12 8
Prueba 2: 8 10 6 20 8 4 18 20 12
Toda la matemática involucrada aquí se basa en esto . Las coordenadas de las líneas fueron fáciles de obtener utilizando los formuladores del enlace. Sin embargo, tenían que ser rotados por el ángulo entre los dos centros de crículos involucrados.
Para reducir la longitud de las líneas, calculé sus intersecciones. Luego, para esa intersección, verifiqué si el final de las líneas actuales llega a un círculo que no es el "padre de la línea" y también contiene la intersección en sí. Si ese fuera el caso, ese extremo de la línea se reduciría a la ubicación de la intersección.
Los círculos eran simples de dibujar, las partes "innecesarias" eran difíciles de quitar, así que se me ocurrió una solución "de goma", que elimina las cosas que ya no se necesitan al pintarlas de blanco nuevamente. Tipo de bruto que lo obliga. Esto se hace caminando a lo largo de cada borde de los círculos y verificando si ese píxel está dentro del alcance de otro círculo.
Inicialmente, quería rodar mi propio método de dibujo circular que solo dibuja el círculo con ángulos específicos pero que no resultó bien y tomó aún más líneas de código.
Realmente me resulta difícil explicar esto si no te has dado cuenta ... El inglés no es mi lengua materna, así que lo siento.
Golfed
Ejemplos más complejos (el círculo superior se convierte en valores negativos de y)
fuente