Hier ist ein täuschend herausforderndes Geometrie-Puzzle für Sie!
Finden Sie bei einem Kreis A
und n
anderen Kreisen B[n]
die Gesamtfläche, die in A
diesem Kreis enthalten ist, und nicht in einem Kreis von B
.
Ihr Code sollte so kurz wie möglich sein.
Eingang
Ihre Eingabe sollte die folgenden Informationen enthalten:
- Eine Gleitkommazahl zur Darstellung des Kreisradius
A
. - Eine Liste von Gleitkommazahlen zur Darstellung der Radien von Kreisen in
B
. - Eine Liste der Zentren der Kreise in
B
. Ihr Programm kann die Zentren entweder in Polarkoordinaten oder in kartesischen Koordinaten erwarten. - Optional können Sie die Anzahl
n
der Kreise in B erhalten. Diese Eingabe ist nicht erforderlich.
Es wird angenommen, dass der Mittelpunkt des Kreises A
der Ursprung, das heißt der Punkt ist (0, 0)
.
Es wird garantiert, dass keine zwei Kreise in B
identisch sind, aber es wird nicht garantiert, dass: alle B
Schnittkreise A
, alle Zentren von B
außerhalb A
sind oder keine zwei Kreise in B
einander schneiden. Stellen Sie sicher, dass Ihre Lösung verschiedene Edge Cases verarbeiten kann.
Sie können Eingaben in beliebiger Reihenfolge und in Form von Texteingaben (über stdin oder die entsprechende Sprache), Funktionsparametern oder Befehlszeilenargumenten erhalten.
Wenn Sie Texteingaben erhalten möchten, sollten zwischen den Eingaben ein oder zwei druckbare ASCII-Trennzeichen stehen.
Ausgabe
Ihr Programm oder Ihre Funktion sollte eine einzelne Gleitkommazahl ausgeben, die die Gesamtfläche von A
in keinem der Kreise von repräsentiert B
. Ihre Antworten sollten für alle Testfälle auf mindestens drei signifikante Zahlen genau sein.
Es gelten die allgemeinen Code-Golf- Regeln.
Ihre Lösung sollte sich nicht auf Stichprobenpunkte innerhalb der Kreise stützen, um eine Fläche zu bestimmen.
Integrierte Funktionen, mit denen Schnittpunkte von Kreisen automatisch lokalisiert, Bereiche innerhalb von Schnittpunkten von Kreisen gefunden oder dieses Problem sofort behoben werden können, sind nicht zulässig.
Testfälle
In jedem Bild ist der Kreis A
blau umrandet, die Kreise B
grün umrandet und schwarz ausgefüllt. Der Bereich, der zurückgegeben werden soll, ist rot ausgefüllt.
(Besonderer Dank geht an Rainer P. für die Prüfung meiner Lösungen)
Testfall 1:
A = {x: 0, y: 0, rad: 50}
B[0] = {x: 0, y: 0, rad: 100}
Result: 0.00
Testfall 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
Testfall 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
Testfall 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
Testfall 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
Vorgeschlagene Literatur:
Fewell, MP "Bereich der gemeinsamen Überlappung von drei Kreisen." Okt. 2006. Web. http://dspace.dsto.defence.gov.au/dspace/bitstream/1947/4551/4/DSTO-TN-0722.PR.pdf .
B
einen anderen enthält. Könnte es wert sein, das hinzuzufügen.
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
, das ergibt 18969.69009
als die Antwort.