Question

Je voudrais tester si un point est à une certaine distance d'une sphère.

Vous avez donc ces variables ...

Point3F spherePnt;
F32 sphereRadius;
Point3F testPnt;

Je pourrais 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 fonction racine carrée à l'intérieur du len (), vous pouvez essayer ...

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

Ok cela ressemble à elle fait depuis au premier coup d'œil, mais apparemment son me donner en fait 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 à être la même que la racine carrée de 3 ... la question est donc, je suppose ...

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

Était-ce utile?

La solution

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top