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.

Scheint, wie Ihre naive Ansatz sein könnte, um zu arbeiten, wenn Sie ein weighted centroid (von radius) eher als eine Reine Schwerpunkt. Das heißt, das Zentrum der bounding sphere sollte näher an der Mitte einer großen Kugel als kleine.
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

Schreibe einen Kommentar