7
votes

Test d'intersection de la sphère cube?

Quel est le moyen le plus simple de le faire? J'échoue en mathématiques et j'ai trouvé des formules assez compliquées sur Internet ... je espérant si elle est plus simple?

J'ai juste besoin de savoir si une sphère se chevauche un cube, je ne me soucie pas de savoir quel point il fait cela, etc.

J'espère aussi que cela profiterait du fait que les deux formes sont symétriques.

EDIT: Le cube est aligné directement dans le x, y, z axe


8 commentaires

Si vous ne postez pas les complications, comment pouvons-nous savoir si nous en avons un plus simple?


Eh bien, je pensais pouvoir constituer une formule simple sur votre tête. Mais si vous ne pouvez pas, alors je ne pense pas qu'il est possible de rendre plus simple que les compliqués que j'ai trouvés ...


Probablement les complications sont principalement dues à considérer les orientations potentielles du cube. Si les visages du cube sont parallèles à coordonner des plans, les idées sont assez simples à expliquer. Dans votre cas, l'orientation de la variable cube est-elle?


Oh, j'ai oublié de mentionner ce fait aussi, de sorte que le cube n'est effectivement pas pivoté du tout, les côtés vont toujours directement dans les axes X, Y, Z


@Newbie, voulez-vous savoir si cube et sphère se croisent, ou si Cube est complètement à l'intérieur de la sphère?


@Dialecticus: Oui, je veux savoir si Sphere "touche" Cube de quelque manière que ce soit.


Au fait, au cas où vous devriez avoir à faire face aux mathématiciens, à eux (bien, nous), une "sphère" est ce que les civils appellent "la surface d'une sphère" et une "balle" inclut le volume au milieu ( le soi-disant "intérieur" de la sphère). Ce n'est que pertinent ici car dans cette terminologie, un cube de latéral 1 intersecte avec la Ball du rayon 1 et du même centre, mais ne se croisit pas avec la Sphere de la même rayon et centre, car le cube est entièrement à l'intérieur.


@Steve: D'où ma réponse disant "supposer que les deux objets sont solides".


3 Réponses :


23
votes

En ce qui concerne les demi-espaces ne suffit pas, vous devez également envisager le point de l'approche la plus proche:

Emprunter la notation d'Adam:

supposant un cube aligné à l'axe et en laissant C1 et C2 des coins opposés, S le centre de la sphère et le rayon de la sphère et que les deux objets sont solides: xxx


11 commentaires

Qu'est-ce que C1, C2, s signifie? Je suppose r = rayon de la sphère?


x = c1.x est la face la plus à gauche du cube, C2.x est la face latérale droite, C1.Y est la face la plus bas, c2.y est la plus grande plus grande Le visage, C1.z est le visage le plus éloigné, C2.Z est le visage le plus proche. S. {x, Y, Z} sont les coordonnées du centre de la sphère.


Quelle est la valeur initiale de dist ? sa non déclaré là-bas


Je pense que OP veut savoir si Cube est à l'intérieur de la sphère, pas l'inverse.


@Dialecticus: Non, je veux savoir si une sphère se chevauche cube


@Newbie: Désolé, dist était juste une faute de frappe pour dist_squared .


Cool, a eu ce travail, est-ce la manière la plus optimale de le calculer? Il a l'air de très rapide code ...


Je m'attendrais également à ce qu'elle fonctionne très rapidement, car il n'y a pas d'opérations lentes telles que SQRT si nécessaire. Je crois qu'il est optimal pour ce cas particulier (cube solide et sphère, avec des faces cubes perpendiculaires aux axes)


Cela ne vous dérangerait-il pas d'ajouter un code équivalent dans la métrique Taxicab (Manhattan)?


@MR_JIGSAW: Changer simplement carré sur ABS . Je pense.


Vous avez raison. C'est ce que j'ai fait en premier lieu mais mon programme n'a pas fonctionné. Mais il s'est avéré que j'ai eu une erreur ailleurs.



23
votes

Jim Arvo a un algorithme pour cela dans Graphics Gems 2 qui fonctionne dans N-Dimensions. Je pense que vous voulez "case 3" au bas de cette page: http: / /wwww.ics.uci.edu/~arvo/code/boxsphereintersect.c qui nettoyé pour votre cas est:

bool BoxIntersectsSphere(Vec3 Bmin, Vec3 Bmax, Vec3 C, float r) {
  float r2 = r * r;
  dmin = 0;
  for( i = 0; i < 3; i++ ) {
    if( C[i] < Bmin[i] ) dmin += SQR( C[i] - Bmin[i] );
    else if( C[i] > Bmax[i] ) dmin += SQR( C[i] - Bmax[i] );     
  }
  return dmin <= r2;
}


6 commentaires

N'est-ce pas exactement comme la réponse de Ben Voigt? (Je me demandais simplement pourquoi cela a été upvote mais son inconvénient).


@Newbie: J'ai voté pour cela parce qu'il a une référence, mais oui le code est le même


Le mien ne donne pas une référence parce que je n'en ai pas utilisé. J'ai la formule pour la distance dans l'espace euclidien mémorisé et que le reste était une géométrie simple.


Pourriez-vous donner un numéro de page ou un nom de section?


Si vous voulez savoir ce que fait , est-ce qu'il trouve le point sur l'AABB dmin le plus proche de la sphère. Il vérifie ensuite que dmin est à l'intérieur de la sphère.


Je suis uppote pour celui-ci parce qu'il est plus clair que la réponse de @benvoigt



-1
votes
intersectsSphere: ( function () {

    var closestPoint;

    return function intersectsSphere( sphere ) {

        if ( closestPoint === undefined ) closestPoint = new Vector3();

        // Find the point on the AABB closest to the sphere center.
        this.clampPoint( sphere.center, closestPoint );

        // If that point is inside the sphere, the AABB and sphere intersect.
        return closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );

    };

} )(),

1 commentaires

Parce que c ++ pas JS.