2011-02-15 4 views
5

J'essaie de déterminer si deux cubes se chevauchent. J'ai lu sur overlapping rectangles, mais je ne suis pas sûr de savoir comment le traduire dans la troisième dimension.Cubes superposés

Mon but est de générer un certain nombre de cubes sans chevauchement positionnés de manière aléatoire et dimensionnés.

Ces cubes sont représentés sur un plan cartésien x, y, z.

Répondre

6

Vous devriez être en mesure de modifier Determine if two rectangles overlap each other? à votre but assez facilement.

Supposons que vous ayez CubeA et CubeB. L'une des 6 conditions garantit qu'aucun recouvrement ne peut exister:

Cond1. If A's left face is to the right of the B's right face, 
      - then A is Totally to right Of B 
       CubeA.X2 < CubeB.X1 
Cond2. If A's right face is to the left of the B's left face, 
      - then A is Totally to left Of B 
       CubeB.X2 < CubeA.X1 
Cond3. If A's top face is below B's bottom face, 
      - then A is Totally below B 
       CubeA.Z2 < CubeB.Z1 
Cond4. If A's bottom face is above B's top face, 
      - then A is Totally above B 
       CubeB.Z2 < CubeA.Z1 
Cond5. If A's front face is behind B's back face, 
      - then A is Totally behind B 
       CubeB.Y2 < CubeA.Y1 
Cond6. If A's left face is to the left of B's right face, 
      - then A is Totally to the right of B 
       CubeB.X2 < CubeA.X1 

donc la condition sans chevauchement est:

Cond1 or Cond2 or Cond3 or Cond4 or Cond5 or Cond6 

Par conséquent, une condition suffisante pour Overlap est le contraire (De Morgan)

Not Cond1 AND Not Cond2 And Not Cond3 And Not Cond4 And Not Cond5 And Not Cond6 
+0

que voulez-vous dire par des bords ?, peut-être des visages? –

+0

@Dave, vous avez raison. Modifié. – btilly

+0

Votre algorithme suppose-t-il que les cubes sont alignés sur l'axe? Sry pour t'avoir dérangé ^^ –

3

cubes sont constitués de 6 rectangulaire (ok, carré) fait face.

Deux cubes ne se croisent pas si les conditions suivantes sont remplies.

  • Aucune des faces de 2 cubes ne se croisent.
  • Un cube ne contient pas complètement l'autre.

Le poste que vous lié peut être facilement étendu. Il suffit d'ajouter Z.

+0

+1 facilement mis en œuvre si vous avez déjà du code qui teste le cas 1 –

+2

Juste une note de côté ...le cube A contient complètement le cube B si le cube A contient un sommet quelconque du cube B. Il suffit de cocher un des sommets de chaque cube dans l'autre cube; Si les faces du cube ne se croisent pas, aucun des sommets ne sera contenu, ou ils le seront tous. – jprete

+0

@jprete: Bon point. – nmichaels

0

Je suppose (ne pensais pas beaucoup, peut-être que ma condition ne suffit pas) vérifier si tous les sommets du premier cube sont hors de la seconde et inversement: tous les sommets de la seconde sont hors de la première.

Pour vérifier si le sommet est dans le cube ou non, il est transform coordonnées au système de coordonnées liées cube (traduction appliquer au centre du cube et la rotation du cube). Ensuite, vérifiez simplement chaque coord (x, y, z) est plus petit que la moitié d'un côté

+0

Cette condition ne suffit pas, car tous les sommets de chaque cube peuvent être hors de l'autre et pourtant ils se croisent encore (par exemple, si le cube A est une copie légèrement inversée du cube B, vous devriez pouvoir les arranger que la condition ci-dessus est vraie mais ils se croisent encore). – jprete

+0

@jprete: tu as raison – Andrew