¡Aquí hay un rompecabezas de geometría engañosamente desafiante para ti!
Dado un círculo A
y n
otros círculos B[n]
, encuentre el área total contenida dentro de la A
cual no está dentro de ningún círculo B
.
Su código debe ser lo más corto posible.
Entrada
Su entrada debe contener la siguiente información:
- Un número de coma flotante para representar el radio del círculo
A
. - Una lista de números de coma flotante para representar los radios de los círculos
B
. - Una lista de los centros de círculos en
B
. Su programa puede esperar los centros en coordenadas polares o cartesianas. - Opcionalmente, puede recibir el número
n
de círculos en B. Esta entrada no es necesaria.
Se supondrá que el centro del círculo A
es el origen, es decir, el punto (0, 0)
.
Se garantiza que no hay dos círculos en B
son idénticos, pero se no garantiza que: todos los círculos de B
intersecan A
, todos los centros de B
están fuera A
, o no hay dos círculos en B
intersecan entre sí. Asegúrese de que su solución pueda manejar varios casos extremos.
Puede recibir entradas en cualquier orden y en forma de entrada de texto (a través de stdin o el equivalente de su idioma), parámetros de función o argumentos de línea de comandos.
Si elige recibir entrada de texto, debe haber delimitadores ASCII imprimibles de uno o dos caracteres entre las entradas.
Salida
Su programa o función debe generar un único número de punto flotante que represente el área total de A
no dentro de ninguno de los círculos de B
. Sus respuestas deben tener una precisión de al menos tres cifras significativas para todos los casos de prueba.
Se aplican reglas generales de código de golf .
Su solución no debe basarse en puntos de muestreo dentro de los círculos para determinar un área.
Los elementos incorporados que localizan automáticamente las intersecciones de los círculos, encuentran áreas dentro de las intersecciones de los círculos o resuelven este problema de inmediato no están permitidos.
Casos de prueba
En cada imagen, el círculo A
se delinea en azul, con círculos B
en verde y negro lleno. El área que debe devolverse se llena de rojo.
(Un agradecimiento especial a Rainer P. por verificar mis soluciones)
Caso de prueba 1:
A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}
Result: 0.00
Caso de prueba 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 prueba 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 prueba 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 prueba 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
Lectura sugerida:
Fewell, MP "Área de superposición común de tres círculos". Octubre de 2006. Web. http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf .
B
contenga otro. Podría valer la pena agregar eso.
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
, lo que da 18969.69009
como la respuesta.