2009-09-04 6 views
0

Je voudrais tester si un point se trouve à une distance donnée d'une sphère.Optimisation de la distance des points au test de sphère

Vous avez ces variables ...

Point3F spherePnt; 
F32 sphereRadius; 
Point3F testPnt; 

que je pouvais faire ...

F32 dist = (spherePnt - testPnt).len() - sphereRadius; 

Si dist est positif, il est en dehors du rayon, si dist est négatif, il est à l'intérieur du rayon.

Ou comme une optimisation pour éviter la racine carrée à l'intérieur du len() la fonction que vous pouvez essayer ...

F32 dist = (spherePnt - testPnt).lenSquared() - (sphereRadius * sphereRadius); 

Ok cela ressemble à elle fait depuis au premier coup d'œil, mais apparemment son réellement donner moi des résultats incorrects.

Par exemple, certaines variables sont configurées comme ça ...

SpherePnt(0, 0, 0) 
SphereRadius(1) 
testPnt(1, 1, 1) 

Prenez le résultat de ...

F32 dist = (spherePnt - testPnt).len() - sphereRadius; 
F32 dist2 = mSqrt((spherePnt - testPnt).lenSquared() - (sphereRadius * sphereRadius)); 

dist = 0.7320508075688772935274463415059; 
dist2 = 0.4142135623730950488016887242097; 

Il est assez évident que c'est en fait, mal, mathématiquement . Il se réduit à attendre la racine carrée de 2 pour être la même que la racine carrée de 3 ... donc la question est, je suppose ...

Étant donné que je ne veux pas effectuer ce test, "est le point p à portée r d'une sphère ", existe-t-il un moyen de le faire en évitant la racine carrée?

Répondre

6

Vous n'avez pas besoin du calcul de sqrt dans l'approche des "distances au carré"! La distance entre les deux points (centre de la sphère et point de test) est inférieure au rayon de la sphère si la distance au carré est inférieure au rayon carré - dans le seul but de tester "dans la sphère ou hors de celle-ci?", Le fait que la racine carrée de la différence n'est pas la différence des racines carrées, est totalement hors de propos.

+0

Exactement. Comparez le carré de la distance au point central avec le carré du rayon. –

+1

Droite. Et si c'est la "boucle interne" en utilisant tout votre temps, vous pourriez obtenir une accélération en ajoutant un axe^2 à la fois. Dès que vous obtenez> R^2, vous pouvez arrêter. –

+0

@Mike, bonne idée, je me demande combien de temps cela permettrait d'économiser (en fonction de la distribution des points bien sûr - si les points sont très dispersés loin de la sphère, cela pourrait être significatif). –

Questions connexes