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.

InformationsquelleAutor Daemin | 2012-01-30