Oto zwodniczo trudna łamigłówka geometrii dla Ciebie!
Biorąc pod uwagę krąg A
i n
inne kręgi B[n]
, znajdź całkowity obszar w nim zawarty, A
który nie znajduje się w żadnym kręgu B
.
Twój kod powinien być jak najkrótszy.
Wejście
Twój wkład powinien zawierać następujące informacje:
- Liczba zmiennoprzecinkowa reprezentująca promień okręgu
A
. - Lista liczb zmiennoprzecinkowych reprezentujących promienie okręgów
B
. - Lista centrów kół w
B
. Twój program może oczekiwać centrów we współrzędnych biegunowych lub kartezjańskich. - Opcjonalnie możesz otrzymać liczbę
n
kręgów w B. To wejście nie jest wymagane.
Należy założyć, że środek koła A
jest początkiem, to znaczy punktem (0, 0)
.
To jest zagwarantowane, że żadne dwa okręgi B
są identyczne, ale to nie gwarantuje, że: wszystkie okręgi B
przecinają się A
, wszystkie ośrodki B
są na zewnątrz A
, a nie dwa okręgiB
przecinają się nawzajem. Upewnij się, że Twoje rozwiązanie obsługuje różne przypadki brzegowe.
Możesz otrzymywać dane wejściowe w dowolnej kolejności, w formie wprowadzania tekstu (przez stdin lub odpowiednik twojego języka), parametrów funkcji lub argumentów wiersza poleceń.
Jeśli zdecydujesz się na wprowadzanie tekstu, pomiędzy fragmentami tekstu powinien znajdować się jeden lub dwa znaki ograniczające ASCII.
Wynik
Twój program lub funkcja powinna wypisać pojedynczą liczbę zmiennoprzecinkową reprezentującą całkowity obszar A
spoza żadnego z okręgówB
. Twoje odpowiedzi powinny być zgodne z co najmniej trzema znaczącymi liczbami dla wszystkich przypadków testowych.
Obowiązują ogólne zasady gry w golfa .
Twoje rozwiązanie nie powinno opierać się na punktach próbkowania w okręgach, aby określić obszar.
Wbudowane funkcje, które automatycznie lokalizują przecięcia okręgów, znajdują obszary w przecięciach okręgów lub natychmiast rozwiązują ten problem, są niedozwolone.
Przypadki testowe
Na każdym zdjęciu koło A
jest obrysowane na niebiesko, a koła B
na zielono i wypełnione czernią. Obszar, który należy zwrócić, jest wypełniony na czerwono.
(Specjalne podziękowania dla Rainera P. za sprawdzenie moich rozwiązań)
Przypadek testowy 1:
A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}
Result: 0.00
Przypadek testowy 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
Przypadek testowy 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
Przypadek testowy 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
Przypadek testowy 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
Sugerowane czytanie:
Fewell, MP „Obszar wspólnego nakładania się trzech kół”. Październik 2006. Internet. http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf .
B
zawiera inne. Może warto to dodać.
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
, który daje 18969.69009
jako odpowiedź.