J'essaie d'écrire un programme C ++ qui prend les entrées suivantes de l'utilisateur pour construire des rectangles (entre 2 et 5): hauteur, largeur, x-pos, y-pos. Tous ces rectangles existeront parallèlement aux axes x et y, c'est-à-dire que toutes leurs arêtes auront des pentes de 0 ou infini.
J'ai essayé de mettre en œuvre ce qui est mentionné dans cette question mais je n'ai pas beaucoup de chance.
Mon implémentation actuelle fait ce qui suit:
// Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1
// point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on...
// Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2
// rotated edge of point a, rect 1
int rot_x, rot_y;
rot_x = -arrRect1[3];
rot_y = arrRect1[2];
// point on rotated edge
int pnt_x, pnt_y;
pnt_x = arrRect1[2];
pnt_y = arrRect1[3];
// test point, a from rect 2
int tst_x, tst_y;
tst_x = arrRect2[0];
tst_y = arrRect2[1];
int value;
value = (rot_x * (tst_x - pnt_x)) + (rot_y * (tst_y - pnt_y));
cout << "Value: " << value;
Cependant, je ne sais pas trop si (a) j'ai correctement implémenté l'algorithme auquel j'ai lié, ou si j'ai fait exactement comment interpréter cela?
Aucune suggestion?
Réponses:
ou, en utilisant des coordonnées cartésiennes
(Avec X1 étant la coordonnée gauche, X2 étant la coordonnée droite, augmentant de gauche à droite et Y1 étant la coordonnée supérieure, et Y2 étant la coordonnée inférieure, augmentant de bas en haut - si ce n'est pas ainsi que votre système de coordonnées [par exemple, la plupart des ordinateurs ont le Direction Y inversée], permutez les comparaisons ci-dessous ) ...
Disons que vous avez Rect A et Rect B. La preuve est par contradiction. L'une des quatre conditions garantit qu'aucun chevauchement ne peut exister :
La condition de non-chevauchement est donc
Par conséquent, une condition suffisante pour Overlap est le contraire.
La loi de De Morgan dit que
Not (A or B or C or D)
c'est la même chose qu'enNot A And Not B And Not C And Not D
utilisant De Morgan, nous avons
Cela équivaut à:
RectA.Left < RectB.Right
] etRectA.Right > RectB.Left
] etRectA.Top > RectB.Bottom
] etRectA.Bottom < RectB.Top
]Note 1 : Il est assez évident que ce même principe peut être étendu à n'importe quel nombre de dimensions.
Note 2 : Il devrait également être assez évident de compter les chevauchements d'un seul pixel, de changer le
<
et / ou le>
sur cette frontière en a<=
ou a>=
.Remarque 3 : Cette réponse, lorsque vous utilisez des coordonnées cartésiennes (X, Y), est basée sur des coordonnées cartésiennes algébriques standard (x augmente de gauche à droite et Y augmente de bas en haut). De toute évidence, lorsqu'un système informatique peut mécaniser les coordonnées de l'écran différemment (par exemple, en augmentant Y de haut en bas ou X de droite à gauche), la syntaxe devra être ajustée en conséquence /
la source
la source
B.height
devrait êtreA.height
#undef min
et#undef max
, ou en utilisant différents noms de paramètres.#define BETWEEN(value,min,max) \ (\ value > max ? max : ( value < min ? min : value )\ )
xOverlap
est en une dimension;rectOverlap
est à deux dimensions. Il peut être étendu à N dimensions à l'aide d'une boucle.la source
Il est plus facile de vérifier si un rectangle est complètement en dehors de l'autre, donc s'il est soit
sur la gauche...
ou à droite ...
ou en haut ...
ou en bas ...
du deuxième rectangle, il ne peut pas entrer en collision avec lui. Donc, pour avoir une fonction qui renvoie un dicton booléen lorsque les rectangles entrent en collision, nous combinons simplement les conditions par des OU logiques et annulons le résultat:
Pour recevoir déjà un résultat positif en touchant seulement, nous pouvons changer le "<" et ">" par "<=" et "> =".
la source
Posez-vous la question opposée: comment puis-je déterminer si deux rectangles ne se croisent pas du tout? De toute évidence, un rectangle A complètement à gauche du rectangle B ne se coupe pas. Aussi si A est complètement à droite. Et de même si A est complètement au-dessus de B ou complètement en dessous de B. Dans tous les autres cas, A et B se croisent.
Ce qui suit peut avoir des bugs, mais je suis assez confiant sur l'algorithme:
la source
Supposons que vous ayez défini les positions et les tailles des rectangles comme ceci:
Mon implémentation C ++ est comme ceci:
Un exemple d'appel de fonction selon la figure ci-dessus:
Les comparaisons à l'intérieur du
if
bloc ressembleront à ci-dessous:la source
Voici comment cela se fait dans l'API Java:
la source
Dans la question, vous établissez un lien avec les mathématiques lorsque les rectangles ont des angles de rotation arbitraires. Cependant, si je comprends un peu les angles de la question, j'interprète que tous les rectangles sont perpendiculaires les uns aux autres.
Un général connaissant la zone de formule de chevauchement est:
En utilisant l'exemple:
1) rassemblez toutes les coordonnées x (à gauche et à droite) dans une liste, puis triez-la et supprimez les doublons
2) rassemblez toutes les coordonnées y (en haut et en bas) dans une liste, puis triez-la et supprimez les doublons
3) créer un tableau 2D par nombre d'espaces entre les coordonnées x uniques * nombre d'espaces entre les coordonnées y uniques.
4) peignez tous les rectangles dans cette grille, en incrémentant le nombre de chaque cellule sur laquelle elle se produit:
5) Lorsque vous peignez les rectangles, il est facile d'intercepter les chevauchements.
la source
la source
Ne pensez pas aux coordonnées comme indiquant où se trouvent les pixels. Considérez-les comme étant entre les pixels. De cette façon, l'aire d'un rectangle 2x2 doit être 4, pas 9.
la source
Le moyen le plus simple est
tout d'abord, pensez à ce que, dans les ordinateurs, le système de coordonnées est à l'envers. L'axe des x est le même qu'en mathématiques, mais l'axe des y augmente vers le bas et diminue en montant vers le haut. si les coordonnées x1 sont supérieures à x2 plus sa moitié de largeur. alors cela signifie qu'en allant la moitié, ils se toucheront. et de la même manière en descendant + la moitié de sa hauteur. ça va entrer en collision ..
la source
Disons que les deux rectangles sont le rectangle A et le rectangle B. Que leurs centres soient A1 et B1 (les coordonnées de A1 et B1 peuvent être facilement découvertes), que les hauteurs soient Ha et Hb, la largeur soit Wa et Wb, que dx soit le largeur (x) distance entre A1 et B1 et dy soit la hauteur (y) distance entre A1 et B1.
Maintenant, nous pouvons dire que nous pouvons dire que A et B se chevauchent: quand
la source
J'ai implémenté une version C #, elle est facilement convertie en C ++.
la source
J'ai une solution très simple
soit x1, y1 x2, y2, l1, b1, l2, soient respectivement leurs coordonnées et leurs longueurs et largeurs
considérer la condition ((x2
maintenant, la seule façon dont ces rectangles se chevauchent est si la diagonale du point à x1, y1 se trouve à l'intérieur de l'autre rectangle ou de la même manière la diagonale du point à x2, y2 se trouve à l'intérieur de l'autre rectangle. ce qui est exactement la condition ci-dessus implique.
la source
A et B sont deux rectangles. C soit leur rectangle de couverture.
Il prend en charge tous les cas possibles.
la source
Il s'agit de l'exercice 3.28 du livre Introduction to Java Programming- Comprehensive Edition. Le code teste si les deux rectangles sont indenticulaires, si l'un est à l'intérieur de l'autre et si l'un est à l'extérieur de l'autre. Si aucune de ces conditions n'est remplie, les deux se chevauchent.
** 3.28 (Géométrie: deux rectangles) Écrivez un programme qui invite l'utilisateur à entrer les coordonnées centrales x, y, la largeur et la hauteur de deux rectangles et détermine si le deuxième rectangle se trouve à l'intérieur du premier ou chevauche le premier, comme le montre la figure 3.9. Testez votre programme pour couvrir tous les cas. Voici les exemples d'exécutions:
Entrez les coordonnées x, y, centre et largeur de r1: 2,5 4 2,5 43 Entrez les coordonnées x, y, centre et largeur de r2: 1,5 5 0,5 3 r2 est à l'intérieur de r1
Entrez les coordonnées x, y, largeur et hauteur du centre de r1: 1 2 3 5.5 Saisissez les coordonnées x, y, largeur et hauteur du centre de r2: 3 4 4.5 5 r2 chevauche r1
Entrez les coordonnées x, y, largeur et hauteur du centre de r1: 1 2 3 3 Entrez les coordonnées x, y, largeur et hauteur du centre de r2: 40 45 3 2 r2 ne chevauche pas r1
la source
la source
Pour ceux d'entre vous qui utilisent des points centraux et des demi-tailles pour leurs données rectangulaires, au lieu des x, y, w, h ou x0, y0, x1, x1 typiques, voici comment vous pouvez le faire:
la source
la source
Si les rectangles se chevauchent, la zone de chevauchement sera supérieure à zéro. Maintenant, trouvons la zone de chevauchement:
S'ils se chevauchent, le bord gauche du chevauchement rect sera le
max(r1.x1, r2.x1)
bord droit et le seramin(r1.x2, r2.x2)
. Ainsi, la longueur du chevauchement seramin(r1.x2, r2.x2) - max(r1.x1, r2.x1)
La zone sera donc:
Si
area = 0
alors ils ne se chevauchent pas.C'est simple non?
la source
"Si vous effectuez la soustraction des coordonnées x ou y correspondant aux sommets des deux face à chaque rectangle, si les résultats sont du même signe, les deux rectangle ne chevauchent pas les axes" (je suis désolé, je ne suis pas sûr que ma traduction soit correcte )
Source: http://www.ieev.org/2009/05/kiem-tra-hai-hinh-chu-nhat-chong-nhau.html
la source
Code Java pour déterminer si les rectangles se contactent ou se chevauchent
...
...
la source