Ecco un puzzle di geometria ingannevolmente stimolante per te!
Dato un cerchio A
e n
altri cerchi B[n]
, trova l'area totale contenuta all'interno A
che non è all'interno di alcun cerchio di B
.
Il tuo codice dovrebbe essere il più breve possibile.
Ingresso
Il tuo input dovrebbe contenere le seguenti informazioni:
- Un numero in virgola mobile per rappresentare il raggio del cerchio
A
. - Un elenco di numeri in virgola mobile per rappresentare i raggi dei cerchi in
B
. - Un elenco dei centri dei cerchi in
B
. Il tuo programma potrebbe prevedere i centri in coordinate polari o cartesiane. - Facoltativamente, potresti ricevere il numero
n
di cerchi in B. Questo input non è richiesto.
Si presume che il centro del cerchio A
sia l'origine, cioè il punto (0, 0)
.
È garantito che non esistono due cerchi in B
sono identiche, ma è non assicurata: tutti i cerchi di B
intersezione A
, tutti i centri di B
sono fuori A
, o nessun due cerchi in B
intersecano reciprocamente. Assicurati che la tua soluzione sia in grado di gestire vari casi limite.
È possibile ricevere input in qualsiasi ordine e sotto forma di input di testo (tramite stdin o l'equivalente della propria lingua), parametri di funzione o argomenti della riga di comando.
Se si sceglie di ricevere input di testo, dovrebbero essere presenti delimitatori ASCII stampabili a uno o due caratteri tra le parti di input.
Produzione
Il tuo programma o funzione dovrebbe generare un singolo numero in virgola mobile che rappresenta l'area totale di A
non all'interno di nessuno dei cerchi di B
. Le risposte devono essere accurate per almeno tre cifre significative per tutti i casi di test.
Si applicano le regole generali di code-golf .
La tua soluzione non dovrebbe fare affidamento su punti di campionamento all'interno dei cerchi per determinare un'area.
Gli built-in che individuano automaticamente le intersezioni dei cerchi, trovano aree all'interno delle intersezioni dei cerchi o risolvono immediatamente questo problema non sono consentiti.
Casi test
In ogni immagine, il cerchio A
è delineato in blu, con i cerchi B
delineati in verde e riempiti di nero. L'area che deve essere restituita è riempita in rosso.
(Un ringraziamento speciale a Rainer P. per aver verificato le mie soluzioni)
Caso di prova 1:
A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}
Result: 0.00
Caso di prova 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 di prova 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 di prova 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 di prova 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
Letture consigliate:
Fewell, MP "Area di sovrapposizione comune di tre cerchi". Ottobre 2006. Web. http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf .
B
contiene un altro. Potrebbe valere la pena aggiungerlo.
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
, che produce 18969.69009
come risposta.