Ecco un puzzle di geometria ingannevolmente stimolante per te!
Dato un cerchio Ae naltri cerchi B[n], trova l'area totale contenuta all'interno Ache 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
ndi cerchi in B. Questo input non è richiesto.
Si presume che il centro del cerchio Asia l'origine, cioè il punto (0, 0).
È garantito che non esistono due cerchi in Bsono identiche, ma è non assicurata: tutti i cerchi di Bintersezione A, tutti i centri di Bsono fuori A, o nessun due cerchi in Bintersecano 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 Anon 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 Bdelineati 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 .
Bcontiene 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.69009come risposta.








