2010-11-07 11 views
1

J'ai une "boîte" faite de deux vecteurs tridimensionnels. Un pour le coin avant-inférieur gauche et un pour le coin arrière-haut-droit.Vérifier si un vecteur est entre deux autres

Existe-t-il un moyen simple de vérifier si un troisième vecteur tridimensionnel se trouve n'importe où dans cette "boîte"?

D'abord je l'ai écrit comme simething (psuedo):

p = pointToCompare; 
a = frontLowerLeft; 
b = backUpperRight; 

if(p.x >= a.x && p.x <= b.x && p.y >= a.y ... 

Mais cela ne fonctionne que si toutes les coordonnées sont positives, qu'ils ne seront pas toujours. Devrais-je faire quelque chose comme ce qui précède, ou y a-t-il une meilleure façon de faire ce calcul?

Si vous voulez savoir, c'est le vecteur et il est la méthode que je utilise: http://www.jmonkeyengine.com/doc/com/jme/math/Vector3f.html

+2

Cette approche devrait fonctionner même pour les coordonnées négatives! Le seul cas où cela ne fonctionnera pas est si les coordonnées de votre boîte ne sont pas vraiment avant-bas-gauche et arrière-haut-droit. –

+1

Cela semble sous-estimé pour moi. La boîte est-elle supposée être alignée sur l'axe? –

+0

Erreur par moi. La méthode décrite fonctionne même avec des coordonnées négatives. Et oui, la boîte est alignée sur l'axe. – EClaesson

Répondre

4

Si vous voulez faire un peu plus robuste, vous pourriez faire invariant à la position des coins :

if (a.x <= p.x && p.x <= b.x || b.x <= p.x && p.x <= a.x) { 
    // similar to the y- and z-axes. 
} 

a plus intutive (mais slightliy plus lent) variante serait d'utiliser min/max sur chaque axe:

if (Math.min(a.x, b.x) <= p.x && p.x <= Math.max(a.x, b.x)) { 
    // ... 
} 
0

Voici une solution générale pour une boîte e à ne peut pas être même des angles droits, c'est-à-dire un parallélépipède générique.

L'astuce ici est de trouver la transformation qui transforme votre boîte en cube unité. Si vous lancez ensuite votre vecteur que vous souhaitez tester à travers cette transformation, vous devrez simplement vérifier que X, Y et Z sont tous compris entre zéro et un. Considérez un point d'angle sur votre boîte comme étant votre origine. Appelons cela K. Maintenant, construisez vos trois axes principaux P Q R comme les vecteurs qui s'étendent le long des trois arêtes qui touchent ce point.

Maintenant, tout point dans l'espace tridimensionnel peut être représenté par K + aP + bQ + cR. De plus, il n'y a qu'un seul (a, b, c) qui satisfait.

Si vous pouvez déterminer (a, b, c), il vous suffit de vérifier que chacun est compris entre 0 et 1.

Si quelqu'un est intéressé par le calcul de la matrice, donnez-moi une cloche!

Questions connexes