Comment faire pour calculer le plus petit de délimitation de la sphère englobante autres délimitation des sphères
Je suis à la recherche d'un algorithme de quelqu'un qui a accès à qui permettra de calculer le plus petit de délimitation de la sphère qui entoure un ensemble de autres de délimitation des sphères. J'ai pensé à ce sujet pendant un certain temps et ont trouvé quelques solutions, mais je ne crois pas que ce sont nécessairement les plus exactes ou le moins gourmand en ressources (le plus rapide).
Première Pensée
Ma première solution est la plus simple, naïve, qui est de faire la moyenne de la sphère centres pour obtenir le point central, puis calculer la distance maximale de la valeur calculée centre de chaque sphère de centre et de son rayon, le rayon. Donc le pseudo-code comme:
function containing_sphere_1(spheres)
center = sum(spheres.center) /count(spheres)
radius = max(distance(center, spheres.center) + radius)
return Sphere(center, radius)
end
Mais j'ai le sentiment que ce n'est pas que le calcul à bas prix, ni tout à fait exacte, puisque la sphère pourrait être bien plus grand qu'il doit être.
Deuxième Pensée
Ma deuxième pensée est d'utiliser un algorithme itératif pour calculer le minimum de délimitation de la sphère. Il est calculé par, successivement, de tester un autre sphère, si l'testé sphère est à l'intérieur des limites, alors rien n'est fait, sinon une nouvelle délimitation de la sphère est calculée à partir des deux sphères disponibles. La nouvelle délimitation de la sphère a un centre qui est à mi-chemin entre le vecteur entre les deux centres s'il a été étendu à toutes les sphères de surfaces, et le rayon est la moitié de la longueur de la ligne (à partir de la nouveau centre, soit de surface de la sphère).
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
J'ai d'abord pensé que ce serait le chemin à parcourir, car il est itératif et semble assez logiquement cohérente, cependant après avoir fait un peu de lecture, et plus particulièrement l'article "Petit joignant les disques (balles et des ellipsoïdes)" par Emo Welzl je ne suis pas si sûr.
Welzl l'Algorithme de
Si je comprends bien la base de cet algorithme est que le minimum de délimitation de la sphère sur un ensemble de points dans les 3 dimensions peut être déterminée par au plus 4 points (qui sont sur la surface de la sphère englobante). Donc, l'algorithme prend une approche itérative en sélectionnant 4 points, puis de le tester d'autres points à voir si ils sont à l'intérieur ou pas, si ils ne sont pas d'une nouvelle délimitation de la sphère est construit, mettant en vedette le nouveau point.
Maintenant l'algorithme traite strictement avec les points, mais je pense qu'il peut être appliqué à traiter avec des sphères, la principale complication étant accounding pour le rayon lors de la construction de la sphère englobante.
Revenir à la Question
Alors, quelle est la "meilleure", comme dans la moins coûteuse en termes de calcul, l'algorithme qui crée un minimum de délimitation de la sphère pour un ensemble de sphères?
Est l'un de ces je l'ai décrit ici la réponse? Pseudo-code de l'algorithme serait génial.
- Semble que votre approche naïve pourrait fonctionner si vous avez utilisé une pondéré centre de gravité (par rayon) plutôt qu'un simple centre de gravité. C'est, au centre de la délimitation de la sphère doit être plus près du centre d'une grande sphère qu'une petite.
- Malheureusement, je ne pense pas que l'approche naïve de travail, hacksoflife.blogspot.com/2009/01/..., semble indiquer qu'il y a beaucoup de contre-exemples où il se casse. Il va créer une sphère englobante, mais pas nécessairement l'minime.
- Ce livre de 2008 par Thomas Larsson a une utile bibliographie de la délimitation de la sphère des algorithmes (pour les collections de points, pas de collections de sphères).
- Je ne suis pas mathématicien (et devrait probablement juste de suivre cela avec intérêt), mais... pourrait-il la peine de dessiner un rectangle autour de l'sphères en dessinant un cadre cercle autour de qui? Je suppose que c'est encore beaucoup de calculs de la taille de la boîte, mais ne serait-il pas simplifier le calcul de l'origine déplacer à chaque itération? aussi, ce ne serait pas encore minimale nécessairement, mais serait plus réduit que votre option 1 avec une origine fixe. Juste une pensée...
- Un pathalogical cas pour ce qui serait juste un seul domaine, depuis que vous aviez créer une zone autour d'elle, puis une sphère autour de la boîte, donc le bloc à l'intérieur de la sphère serait bien plus grande que nécessaire. Bien que la solution serait de créer une petite sphère englobante dans l'option 1 du cas pathologique (beaucoup de sphères dans un cluster avec un en dehors).
- Ouais, j'avais compris que. Je me demande si vous pourriez faire de l'intérieur et l'extérieur des limites (comme dans, une à l'intérieur de la place, l'un environnant) et binaires puis-section (couper) la distance entre ces de voir à quel point tous les domaines sont complètement bornée. L'origine serait au moins en place. Faut bien l'avouer, peu de chances d'être optimale. Problème intéressant!
- Il s'avère que Welzl de l'Algorithme ne fonctionne pas pour les sphères, voir ma thèse de doctorat à inf.l'epf de zurich.ch/personnel/emo/DoctThesisFiles/fischer05.pdf, p. 93 pour un contre-exemple. Toutefois, comme indiqué dans la réponse de @hardmath, très rapide en C++ mise en œuvre est disponible dans CGAL.
Vous devez vous connecter pour publier un commentaire.
À l'étape d'joignant les points à enfermer les sphères est non-trivial, comme le discussion de Welzl de l'algorithme (qui fonctionne à joindre points) dans K. Fischer thèse explique, "la plus Petite enfermant boule de boules". Voir Sec. 5.1.
Le chapitre 4 présente l' "en joignant les points" du matériel, puis le Chapitre 5 présente "en joignant les sphères".
De l'algorithme décrit dans Fisher est la thèse a été mis en œuvre dans le CGAL paquet depuis la version 3.0, si vous recherchez seulement pour une mise en œuvre.
Voici un rapide, quasi optimale approche basée sur l'algorithme de Ritter
https://en.wikipedia.org/wiki/Bounding_sphere :
Pour chaque sphère, trouver son min/max x/y/z points. Jeter ces 6 points dans un seau. Lorsque vous avez fait toutes les sphères, vous aurez un seau d'6N points. Trouver une délimitation de la sphère de ces utilisant les algorithmes connus.
La délimitation de la sphère que vous obtiendrez très probablement être un peu trop petit, indépendamment de l'algorithme. Vous pouvez ensuite faire le 2ème passage de la méthode de Ritter, mais en utilisant les fesses des domaines comme les points de test. 'Dos', qui signifie pt sur la sphère la plus éloignée de courant bnd sphère de centre. Si une sphère de l'arrière pt est en dehors bnd sphère, grandir bnd sphère de l'inclure.
En plus des 6 extrema pts, vous pourriez d'abord inclure les 8 coins de la inscrit cube:
( [+/-]kR, [+/-]kR, [+/-]kR ), où k=sqrt(3)/3. Cela donne 14 pts qui sont assez bien réparties, geodesically.