Wie berechnen Sie die kleinste umschließende Kugel umschließenden anderen bounding-Sphären
Ich bin auf der Suche nach einem Algorithmus, welcher Benutzer Zugriff hat, berechnet die kleinste umschließende Kugel umschließt eine Reihe von anderen bounding-Sphären. Ich habe darüber nachgedacht für eine Weile und haben einige Lösungsansätze, aber ich glaube nicht, dass diese notwendigerweise die Genaueste oder die am wenigsten rechenintensiv (die schnellsten).
Erster Gedanke
Meine erste Lösung ist die einfachste, naive eine, die durchschnittlich aus der Sphäre Zentren um den center-Punkt und berechnen Sie den Abstand zwischen dem berechneten Mittelpunkt zu jedem Bereich center plus den radius als der radius. So pseudo-code geht so:
function containing_sphere_1(spheres)
center = sum(spheres.center) /count(spheres)
radius = max(distance(center, spheres.center) + radius)
return Sphere(center, radius)
end
Aber ich habe das Gefühl, dass es nicht, dass rechnerisch Billig, noch ist es ganz genau ist, da der resultierende Bereich könnte durchaus größer, als es sein muss.
Zweiten Gedanken
Mein zweiter Gedanke ist die Verwendung eines iterativen Algorithmus zur Berechnung der minimal bounding-sphere. Er wird berechnet, indem nacheinander testen eine andere Sphäre, wenn der geprüfte Bereich ist innerhalb der Grenzen, dann geschieht nichts, andernfalls wird ein neues bounding-sphere berechnet sich aus den beiden Bereichen zur Verfügung. Die neue bounding-sphere hat ein Zentrum, auf halbem Weg zwischen dem Vektor zwischen den beiden Zentren, wenn es erweitert wurde, um die Kugeln Flächen, und der radius ist die Hälfte der Länge der Zeile wird (von der neuen Mitte, um entweder sphere Oberfläche).
function containing_sphere_2(spheres)
bounds = first(spheres)
for each sphere in spheres
if bounds does not contain sphere
line = vector(bounds.center, sphere.center)
extend(line, bounds.radius)
extend(line, sphere.radius)
center = midpoint(line)
radius = length(line) /2
bounds = Sphere(center, radius)
end
end
return bounds
end
Anfangs dachte ich, dies wäre der Weg zu gehen, denn es ist ein iterativer und scheint ziemlich logisch konsistent, aber nach etwas Lesen, insbesondere der Artikel "Kleinsten einschließenden Scheiben (Kugeln und Ellipsoide)" von Emo Welzl ich bin nicht so sicher.
Welzl-Algorithmus
Wie ich es verstehe, die Grundlage dieses Algorithmus ist, dass die minimum bounding-sphere über eine Reihe von Punkten in 3 Dimensionen bestimmt werden kann, auf höchstens 4 Punkte (die auf der Oberfläche der umschließenden sphere). Also der Algorithmus verwendet einen iterativen Ansatz, indem Sie 4 Punkte, und dann der Prüfung anderer Punkte, um zu sehen, ob Sie innerhalb oder nicht, wenn Sie nicht eine neue bounding-Sphäre konstruiert wird mit dem neuen Punkt.
Nun der Algorithmus befasst sich ausschließlich mit Punkte, aber ich denke, es kann an den Umgang mit Sphären, die wichtigste Komplikation wird accounding für den radius bei der Konstruktion der umschließenden sphere.
Zurück zu der Frage
Also, was ist die 'beste', wie in den am wenigsten rechenintensiv, Algorithmus, erzeugt eine minimal bounding sphere für einen Satz von bestimmten Bereichen?
Ist eine davon, die ich beschrieben habe, hier die Antwort? Einige pseudo-code oder der Algorithmus wäre toll.
Leider denke ich nicht, dass der naive Ansatz funktioniert, hacksoflife.blogspot.com/2009/01/... scheint zu zeigen, dass es zahlreiche Gegenbeispiele, wo es bricht. Es wird das erstellen einer umschließenden Sphäre, aber nicht unbedingt minimal.
Dieses Papier 2008 von Thomas Larsson hat eine nützliche Bibliographie der bounding-sphere-algorithmen (für Sammlungen Punkte, nicht Sammlungen von Bereichen).
Ich bin kein Mathematiker (und sollte wohl Folgen, die dieses mit Zinsen), aber... könnte es sein, lohnt sich die Zeichnung ein umschließendes ein um die Kugeln dann zeichnen einer bounding-Kreis? Ich denke, es ist immer noch eine Menge von Berechnungen, um die Größe der box aber noch nicht, es vereinfacht die Berechnung der Herkunft bewegen, die bei jeder iteration? auch, es würde immer noch nicht minimal sein, unbedingt, wäre aber minimal mehr als die option 1 mit einer festen Ursprung. Nur so ein Gedanke...
Es stellt sich heraus, dass Welzl-Algorithmus funktioniert nicht für Kugeln, siehe meine these am inf.ethz.ch/personal/emo/DoctThesisFiles/fischer05.pdf, S. 93 für ein Gegenbeispiel. Jedoch, wie bereits in der Antwort von @hardmath, sehr schnelle C++ Implementierung ist verfügbar in CGAL.
InformationsquelleAutor Daemin | 2012-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Schritt von der umgebenden Punkte zu umschließenden Bereich ist nicht trivial, da die Diskussion des Welzl-Algorithmus (die Werke einschließen Punkte) in K. Fischers these erläutert, "Kleinsten umschließenden ball der Bälle". Siehe Sec 5.1.
Kapitel 4 präsentiert die "einschließenden Punkte" material, dann Kapitel 5 präsentiert den "einschließenden Kugeln".
Den beschriebenen Algorithmus in Fisher ' s thesis implementiert wurde in der CGAL-Paket seit release 3.0, wenn Sie gerade auf der Suche für eine Implementierung.
Nur zur Ergänzung deiner sehr präzise Antwort: die CGAL-Implementierung bietet eine floating-point und exakte Arithmetik-Implementierung für den Fall der minsphere spheres. Sie müssen nicht alle CGAL, nur extrahieren Sie die erforderlichen Kopf-und es wird funktionieren. – Für den Fall der minsphere Punkte, dort ist eine C++ - Bibliothek zur Verfügung unter github.com/hbf/miniball.
InformationsquelleAutor hardmath
Hier ist eine schnelle, nahezu optimale Ansatz, der auf Ritter ' s Algorithmus
https://en.wikipedia.org/wiki/Bounding_sphere :
Für jede Kugel, getroffen min/max x/y/z Punkte. Werfen Sie diese 6 Punkte in einen Eimer. Wenn Sie haben alles getan, die N Kugeln, Sie haben einen Eimer 6N Punkte. Finden Sie eine bounding sphere für diese mit einer der bekannten algorithmen.
Die bounding-Sphäre bekommen Sie sehr wahrscheinlich ein wenig zu klein ist, ungeachtet des Algorithmus. Sie könnten dann den 2nd pass von Ritter ' s Methode, aber mit den Rückseiten der Sphären, wie die Punkte zu testen. 'Rückseite' Bedeutung pt auf der Sphäre die am weitesten von der aktuellen bnd-sphere-center. Wenn eine Kugel in den Hintern pt ist außerhalb der aktuellen bnd-Bereich, wachsen bnd Sphäre gehören.
Zusätzlich zu den 6 extrema pts, könnte man zunächst schließen die 8 Ecken die beschrifteten Würfel:
( [+/-]kR, [+/-]kR, [+/-]kR ), wobei k=sqrt(3)/3. Dies ergibt 14 Punkte, die Recht gut verteilt, geodesically.
InformationsquelleAutor Jack Ritter