3 votes

Algorithme qui détermine une relation entre un carré et un rectangle

Je dois trouver un algorithme qui détermine une relation entre un carré et un rectangle. Il doit être capable de déterminer si :

  • Le carré est complètement à l'intérieur du rectangle
  • Le carré est partiellement à l'intérieur (chevauche) du rectangle.
  • Le coin d'un carré ne touche que le coin d'un rectangle.
  • Le bord du carré est sur le bord du rectangle.

Et voici les entrées (valeurs données) qui nous aideront à extraire une formule mathématique pour chaque cas :

  • Coordonnée x du centre du carré = squareX
  • coordonnée y du centre du carré = squareY
  • largeur du carré = squareW
  • Coordonnée x du centre du rectangle = recX
  • Coordonnée y du centre du rectangle = recY
  • largeur du rectangle = recW
  • longueur du rectangle = recL

P.S. : La taille des rectangles est toujours supérieure à la largeur des carrés.

J'écrirai le code en Java une fois que nous pourrons extraire un algorithme en utilisant des opérations mathématiques.

Editar:

Pour le cas des coins en contact, voici le code que j'ai écrit, et il fonctionne (Math.abs signifie la valeur absolue) :

((Math.abs(Math.abs(recX-squareX)-(recW+squareW)/2))<=0.001) && ((Math.abs(Math.abs(recY-squareY)-(recL+squareW)/2))<=0.001)

2voto

Lev Khomich Points 1781

mis à jour pour les doubles

double dx = Math.abs(rectX - squareX);
double dy = Math.abs(rectY - squarey);
double dw2 = (rectW + squareW) / 2;
double dh2 = (rectL + squareW) / 2;

if (Double.compare(dx, dw2) == 0 && Double.compare(dy, dh2) == 0)
    return CORNER_TOUCH;
else if (Double.compare(dx, dw2) > 0 || Double.compare(dy, dh2) > 0)
    return OUTSIDE;
else if (Double.compare(dx, dw2) == 0 || Double.compare(dy, dh2) == 0)
    return EDGE_TOUCH;
else if (Double.compare(dx, rectW - dw2) <= 0 &&
        Double.compare(dy, rectL - dh2) <= 0)
    return INSIDE;
else 
    return OVERLAPS;

1voto

lweller Points 5252
squareX1 = squareX - squareW/2
squareY1 = squareY - squareW/2
squareX2 = squareX + squareW/2
squareY2 = squareY + squareW/2

recX1 = recX - recW/2
recY1 = recY - recL/2
recX2 = recX + recW/2
recY2 = recY + recL/2

inside = squareX1 > recX1 && squareX2 < recX2 && squareY1 > recY1 && squareY2 < recY2
overlaps = squareX1 < recX2 && squareX2 > recX1 && squareY1 < recY2 && squareY2 > recY1

les deux dernières devraient être triviales

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X