Aqui está um quebra-cabeça de geometria enganosamente desafiador para você!
Dado um círculo Ae noutros círculos B[n], encontre a área total contida dentro dela e Aque 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
nde 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 Bsão idênticos, mas é não garantida que: todos os círculos de Bintersecção A, todos os centros de Bestão fora A, ou há dois círculos em Bcruzam 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 Anã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 Bdestacados 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 .
Bcontenha 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.69009como resposta.








