J'essaie de déterminer si deux cubes se chevauchent. J'ai lu sur rectangles superposés , mais je ne suis pas sûr de la traduire en troisième dimension. P>
Mon objectif est de générer un certain nombre de cubes non chevauchés de manière aléatoire et de taille. P>
Ces cubes sont représentés sur un plan X, Y, Z Cartésien. P>
5 Réponses :
Vous devriez pouvoir modifier Déterminer si deux rectangles se chevauchent mutuellement? à votre but assez facilement.
Supposons que vous ayez de sorte que la condition d'absence de chevauchement n'est: p> Par conséquent, une condition suffisante pour le chevauchement est le contraire (de morgan) p> cubea code> et cubeb code>. L'une des 6 conditions garantit qu'aucun chevauchement ne peut exister: p>
Qu'entendez-vous par les bords ?, peut-être des visages?
Votre algorithme suppose-t-il que les cubes sont alignés sur l'axe? Sry pour vous déranger ^^
@Dave, ça fait. Comme cela a fait les réponses à la question précédente. Si cette hypothèse est fausse, le problème devient plus complexe à résoudre.
Noone a probablement remarqué, mais il y avait une erreur dans le condo de la poste. Il se lit "cubea.y1
Ouais, et pile débordement "Modifier la révision" Brigade a rejeté mon édition sur la question, car il est "adressé à l'auteur". Ouais, bon travail. Laissons une mauvaise réponse marquée comme correcte, il reste que ça!
@Itrebitel Merci d'avoir souligné l'erreur, mais vous n'avez pas vraiment eu la bonne solution. Je l'ai corrigé correctement.
@billy êtes-vous sûr? Je suppose toujours Cond5 étant "cubeb.y2
@ Entrezbitel je viens de fixer 6.
@billy mais vous venez de dupliquer la condition 2, n'est-ce pas? voir!
Ce n'est toujours pas corrigé, ridicule
Et si Cubea contient Cubeb ou vice versa?
@shinxg alors aucune des conditions ne correspondra. :-)
@IREBITEL J'ai finalement réparé pour vous, grâce à ADVENTOFCODE.COM/2021/DIA/22 :)
Les cubes sont composés de 6 faces rectangulaires (ok, carrées). p>
Deux cubes ne se croisent pas si les conditions suivantes sont remplies. P>
Le message que vous avez lié peut être facilement étendu. Il suffit d'ajouter z. P>
+1 Facilement implémenté si vous avez déjà du code qui teste le cas 1
Juste une note latérale ... Cube A contient complètement Cube B Si le cube A contient n'importe quel sommet de cube B. Vous n'avez besoin que de vérifier un sommet de chaque cube pour le confinement dans l'autre cube; Si le cube est confronté à ne pas intersecter, alors aucun des sommets ne sera contenue, sinon ils seront tous.
Je suppose (ne pensais pas beaucoup, peut-être que ma condition ne suffit pas) Vérifiez si tous les sommets du premier cube sont hors du deuxième et inverse: tous les sommets de seconde sont hors du premier. P>
Pour vérifier si le sommet est dans le cube ou non, transformez les coordonnées du système de coordonnées associées à un cube (appliquer la traduction sur le cube centre et la rotation du cube). Ensuite, vérifiez simplement chaque coord (x, y, z) est plus petit que la moitié d'un côté p>
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 tournée de cube B, vous devriez être capable de les organiser de manière à ce que La condition ci-dessus est vraie mais elles se croisent toujours).
La réponse acceptée est fausse et très déroutante. Voici ce que j'ai proposé.
Détermination de chevauchement dans le plan X strong> p> if (cubeA.maxZ > cubeB.minZ)
if (cubeA.minZ < cubeB.maxZ)
Ceci est juste la réponse acceptée réécrit avec la correction. Il essaie de voir si les cuboïdes alignés à deux axes ont un segment de l'axe X, Y et Z en commun, s'ils ne leur sont pas alors impossibles à avoir une collision. La fonction suppose qu'il existe une collision et effectue les tests pour vérifier s'il n'y a pas.
Function func_Intersect(ByVal cuboid1_MinX As Double, ByVal cuboid1_MaxX As Double, ByVal cuboid1_MinY As Double, ByVal cuboid1_MaxY As Double, ByVal cuboid1_MinZ As Double, ByVal cuboid1_MaxZ As Double, ByVal cuboid2_MinX As Double, ByVal cuboid2_MaxX As Double, ByVal cuboid2_MinY As Double, ByVal cuboid2_MaxY As Double, ByVal cuboid2_MinZ As Double, ByVal cuboid2_MaxZ As Double) As Boolean
func_Intersect = True
If cuboid1_MaxX < cuboid2_MinX Then
func_Intersect = False
ElseIf cuboid2_MaxX < cuboid1_MinX Then
func_Intersect = False
ElseIf cuboid1_MaxY < cuboid2_MinY Then
func_Intersect = False
ElseIf cuboid2_MaxY < cuboid1_MinY Then
func_Intersect = False
ElseIf cuboid1_MaxZ < cuboid2_MinZ Then
func_Intersect = False
ElseIf cuboid2_MaxZ < cuboid1_MinZ Then
func_Intersect = False
End If
End Function