2011-02-15 17 views
5

Estoy tratando de determinar si dos cubos se superponen. He leído en overlapping rectangles, pero no estoy seguro de cómo traducirlo a la tercera dimensión.Cubos superpuestos

Mi objetivo es generar un número de cubos no superpuestos y colocados al azar.

Estos cubos se representan en un plano cartesiano x, y, z.

Respuesta

6

Debería poder modificar Determine if two rectangles overlap each other? para su propósito con bastante facilidad.

Supongamos que tiene CubeA y CubeB. Cualquiera de 6 condiciones garantiza que no puede existir solapamiento:

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 

Así que la condición para que no se superponen es:

Cond1 or Cond2 or Cond3 or Cond4 or Cond5 or Cond6 

Por lo tanto, una condición suficiente para la superposición es lo contrario (De Morgan)

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

¿qué quiere decir con bordes ?, ¿tal vez con caras? –

+0

@Dave, tienes razón. Cambiado – btilly

+0

¿Su algoritmo supone que los cubos están alineados con el eje? Sry por molestarte ^^ –

3

Los cubos se componen de 6 caras rectangulares (bien, cuadradas).

Dos cubos no se cruzan si se cumplen las siguientes condiciones.

  • Ninguna de las caras de 2 cubos se cruzan.
  • Un cubo no contiene completamente el otro.

La publicación que enlazó se puede extender fácilmente. Solo agregue Z.

+0

+1 fácil de implementar si ya tiene el código que prueba el caso 1 –

+2

Solo una nota al margen ...el cubo A contiene completamente el cubo B si el cubo A contiene cualquier vértice del cubo B. Solo necesita comprobar un vértice de cada cubo para contenerlo en el otro cubo; si las caras del cubo no se intersectan, ninguno de los vértices quedará contenido o todos lo estarán. – jprete

+0

@jprete: Buen punto. – nmichaels

0

Supongo (no pensé mucho, tal vez mi condición no es suficiente) compruebe si todos los vértices del primer cubo están fuera del segundo e inverso: todos los vértices del segundo están fuera del primero.

Para verificar si el vértice está en el cubo o no, transforme sus coordenadas al sistema de coordenadas relacionadas con el cubo (aplique la traducción al centro del cubo y la rotación del cubo). Luego simplemente verifique que cada coord (x, y, z) es más pequeña que la mitad de un lado

+0

Esa condición no es suficiente, porque todos los vértices de cada cubo pueden estar fuera del otro y aún así se cruzan (por ejemplo, si el cubo A es una copia ligeramente girada del cubo B, debe poder organizarlos de manera que que la condición anterior es verdadera, pero aún se cruzan). – jprete

+0

@jprete: tienes razón – Andrew

Cuestiones relacionadas