7
votes

Cubes qui se chevauchent

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.

Mon objectif est de générer un certain nombre de cubes non chevauchés de manière aléatoire et de taille.

Ces cubes sont représentés sur un plan X, Y, Z Cartésien.


0 commentaires

5 Réponses :


6
votes

Vous devriez pouvoir modifier Déterminer si deux rectangles se chevauchent mutuellement? à votre but assez facilement.

Supposons que vous ayez cubea et cubeb . L'une des 6 conditions garantit qu'aucun chevauchement ne peut exister: xxx

de sorte que la condition d'absence de chevauchement n'est: xxx

Par conséquent, une condition suffisante pour le chevauchement est le contraire (de morgan) xxx


13 commentaires

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 :)



3
votes

Les cubes sont composés de 6 faces rectangulaires (ok, carrées).

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

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

    Le message que vous avez lié peut être facilement étendu. Il suffit d'ajouter z.


2 commentaires

+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.



1
votes

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.

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é


1 commentaires

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).



10
votes

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> xxx pré>

    if (cubeA.maxZ > cubeB.minZ)
    if (cubeA.minZ < cubeB.maxZ)


0 commentaires

0
votes

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


0 commentaires