Aqui está um quebra-cabeça de geometria enganosamente desafiador para você!
Dado um círculo A
e n
outros círculos B[n]
, encontre a área total contida dentro dela e A
que não esteja em nenhum círculo de B
.
Seu código deve ser o mais curto possível.
Entrada
Sua entrada deve conter as seguintes informações:
- Um número de ponto flutuante para representar o raio do círculo
A
. - Uma lista de números de ponto flutuante para representar os raios dos círculos
B
. - Uma lista dos centros de círculos em
B
. Seu programa pode esperar os centros em coordenadas polares ou cartesianas. - Opcionalmente, você pode receber o número
n
de círculos em B. Esta entrada não é necessária.
Deve-se assumir que o centro do círculo A
é a origem, ou seja, o ponto (0, 0)
.
É garantido que há dois círculos em B
são idênticos, mas é não garantida que: todos os círculos de B
intersecção A
, todos os centros de B
estão fora A
, ou há dois círculos em B
cruzam entre si. Verifique se sua solução pode lidar com vários casos extremos.
Você pode receber entrada em qualquer ordem e na forma de entrada de texto (por meio de stdin ou equivalente do seu idioma), parâmetros de função ou argumentos da linha de comando.
Se você optar por receber entrada de texto, deve haver delimitadores ASCII imprimíveis de um ou dois caracteres entre as partes da entrada.
Resultado
Seu programa ou função deve gerar um único número de ponto flutuante representando a área total que A
não está dentro de nenhum dos círculos de B
. Suas respostas devem ter precisão de pelo menos três números significativos para todos os casos de teste.
Aplicam-se as regras gerais de código-golfe .
Sua solução não deve contar com pontos de amostragem dentro dos círculos para determinar uma área.
Os incorporados que localizam automaticamente interseções de círculos, localizam áreas dentro de interseções de círculos ou resolvem esse problema imediatamente não são permitidos.
Casos de teste
Em cada imagem, o círculo A
é destacado em azul, com círculos B
destacados em verde e preto preenchido. A área que deve ser retornada é preenchida em vermelho.
(Agradecimentos especiais a Rainer P. por verificar minhas soluções)
Caso de teste 1:
A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}
Result: 0.00
Caso de teste 2:
A = {x: 0, y: 0, rad: 100.000000}
B[0] = {x: 100.000000, y: 0.000000, rad: 50.000000}
B[1] = {x: 30.901699, y: -95.105652, rad: 50.000000}
B[2] = {x: -80.901699, y: -58.778525, rad: 50.000000}
B[3] = {x: -80.901699, y: 58.778525, rad: 50.000000}
B[4] = {x: 30.901699, y: 95.105652, rad: 50.000000}
Result: 1.3878e+04
Caso de teste 3:
A = {x: 0, y: 0, rad: 138}
B[0] = {x: 100, y: 0, rad: 100}
B[1] = {x: -50, y: -86, rad: 100}
B[2] = {x: -93, y: 135, rad: 50}
Result: 1.8969e+04
Caso de teste 4:
A = {x: 0, y: 0, rad: 121.593585}
B[0] = {x: 81.000000, y: 107.000000, rad: 59.841457}
B[1] = {x: -152.000000, y: -147.000000, rad: 50.000000}
B[2] = {x: 43.000000, y: -127.000000, rad: 105.118980}
B[3] = {x: 0.000000, y: -72.000000, rad: 57.870545}
B[4] = {x: -97.000000, y: -81.000000, rad: 98.488578}
B[5] = {x: -72.000000, y: 116.000000, rad: 66.468037}
B[6] = {x: 2.000000, y: 51.000000, rad: 50.000000}
Result: 1.1264e+04
Caso de teste 5:
A = {x: 0, y: 0, rad: 121.605921}
B[0] = {x: 0.000000, y: -293.000000, rad: 250.000000}
B[1] = {x: 0.000000, y: -56.000000, rad: 78.230429}
B[2] = {x: 0.000000, y: -102.000000, rad: 100.000000}
Result: 2.6742e+04
Leitura sugerida:
Ademais, MP "Área de sobreposição comum de três círculos". Outubro de 2006. Web. http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf .
B
contenha outro. Pode valer a pena acrescentar isso.
1.8970e+04
.
B[0] - A intersection: 20653.659515
, B[1] - A intersection: 20757.824115
, B[1] - B[0] intersection: 1841.847766
, B[2] - A intersection: 1289.164541
, que produz 18969.69009
como resposta.