Dadas as coordenadas de vários pontos em um plano e o raio de um círculo em torno de cada ponto, desenhe polígonos representando os círculos e as arestas onde os círculos se encontram. As arestas retas sempre caem ao longo das linhas de interseção círculo-círculo , mas podem não seguir o comprimento total dessas linhas.
Por sugestão do mbomb007 , imagine o comportamento das bolhas de sabão 2D. Isso é tecnicamente errado, porque as bolhas de sabão sempre se encontravam em ângulos de 120 ° para minimizar a energia, enquanto esses círculos podem se encontrar em qualquer ângulo.
Este é um diagrama de Voronoi, menos um plano de área definida. Obrigado Andreas . Esta é realmente uma generalização de um diagrama de Voronoi chamado diagrama de potência .
Exemplos
Por exemplo, dados dois pontos e dois raios, a saída pode ser assim:
Adicione outro ponto e raio e a saída poderá ser assim:
Entrada
Você pode estruturar a entrada da maneira que desejar. Poste os resultados com as seguintes entradas.
Teste 1
- x: 10, y: 10, r: 10
- x: 25, y: 12, r: 8
Teste 2
- x: 8, y: 10, r: 6
- x: 20, y: 8, r: 4
- x: 18, y: 20, r: 12
Saída
A saída deve ser gráfica e incluir bordas poligonais, mas nada mais é necessário. Pontos e interseções não precisam ser representados como estão nos exemplos.
Restrições
- Nenhum ponto existirá dentro do raio de outro círculo.
- Regras padrão do codegolf.
- Nenhuma resposta com brechas será aceita, mas fique à vontade para se divertir.
fonte
Respostas:
Python 2,
473355 bytesIsso lê um conjunto de círculos como
(x,y,r)
tuplas no stdin e gera uma imagem no formato PGM para o stdout. Ele funciona aproximadamente calculando uma função de distância do diagrama em cada pixel e sombreando cada pixel a menos de um pixel proporcionalmente à sua distância.Aqui, a função de distância foi dividida por 32 para torná-la visível:
fonte
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 é uma solução em c #. Provavelmente longe do ideal, mas o C # não ganhará isso de qualquer maneira. Só queria provar que posso fazer isso.
Entrada via linha de comando, especificando os valores separados por um espaço na ordem xyr Output é um arquivo 'l.bmp' dentro do diretório em execução.
O programa aceita qualquer quantidade de círculos.
Teste 1: 10 10 10 25 12 8
Teste 2: 8 10 6 20 8 4 18 20 12
Toda a matemática envolvida aqui é baseada nisso . As coordenadas das linhas eram fáceis de obter usando os formulários do link. No entanto, eles precisavam ser rotacionados pelo ângulo entre os dois centros envolvidos.
Para reduzir o comprimento das linhas, calculei suas interseções. Então, para essa interseção, verifiquei se o final das linhas atuais alcança um círculo que não é o "pai da linha" e também contém a própria interseção. Se fosse esse o caso, esse final da linha era reduzido ao local do cruzamento.
Os círculos eram simples de desenhar, as partes "desnecessárias" eram difíceis de remover, então eu vim com uma solução "de borracha", que remove as coisas que não são mais necessárias, pintando de branco novamente. Tipo de bruto forçando-o. Isso é feito caminhando pela borda de cada círculo e verificando se esse pixel está ao alcance de outro círculo.
Inicialmente, eu queria rolar meu próprio método de desenho de círculo que só desenha o círculo dentro de ângulos especificados, mas que não saiu bem e levou ainda mais linhas de código.
Realmente tendo dificuldade em explicar isso, se você ainda não percebeu ... Inglês não é minha língua materna, então sinto muito por isso.
Golfe
Exemplos mais complexos (o círculo superior entra em valores y negativos)
fonte