J'ai les cas suivants où les rectangles se chevauchent. Décalage des positions rectangle pour éviter le chevauchement
J'ai les coordonnées pour le rectangle d'intersection (bleu). Comment puis-je compenser les coordonnées de départ (XY en haut à gauche) des 2 rectangles pour éviter les chevauchements, à condition que i ont les coordonnées du rectangle d'intersection en utilisant
rectangle3 = Rectangle.Intersect(rectangle1, rectangle2);
UPDATE:
Selon Mise à jour de @MBo i ont ajouté le code suivant
Blue = Rectangle.Intersect(First, Second);
if (Blue != Rectangle.Empty)
{
if (First.Right == Blue.Right)
{
imgpoint.X += (Blue.Right - Blue.Left);
}
if (First.Bottom == Blue.Bottom)
{
imgpoint.Y += (Blue.Bottom - Blue.Top);
}
if (First.Left == Blue.Left)
{
imgpoint.X-= (Blue.Right - Blue.Left);
}
if (First.Top == Blue.Top)
{
imgpoint.Y -= (Blue.Bottom - Blue.Top);
}
}
MAJ2:
Conformément à la logique de @MBo j'ai mis en place le code ci-dessus.Cela fonctionne dans la plupart des cas.Mais dans certaines images, même lorsque l'intection est détectée et le décalage est ajouté, je me chevauche.Voir l'image ci-dessous.
Le problème réel que je suis en train de résoudre est liée à ces 2 questions Translating a Point(X,Y) for Images of Different Sizes from a Custom PictureBox Control
Performing Overlap Detection of 2 Bitmaps
conseils S'il vous plaît.
MISE À JOUR:
Selon votre mise à jour je traduis le code Delphi à C#
Blue = Rectangle.Intersect(First, Second);
if (Blue != Rectangle.Empty)
{
int dcy,dcx;
int dy,dx;
int fl=First.Left,fw=First.Width,fh=First.Height,ft=First.Top,fb=First.Bottom,fr=First.Right;
int sl=Second.Left,sr=Second.Right,st=Second.Top,sb=Second.Bottom,sw=Second.Width,sh=Second.Height;
dcy = (sb + st) - (fb + ft); //doubled center y-difference
dcx = (sl + sr) - (fl + fr);
if ((int)(dcx) >= (fw + sw) || ((int)(dcy) >= (fh + sh)))
{//no intersection
}
else
{
dx = fw + sw - (int)dcx; //doubled needed x-shift absolute value
dy = fh + sh - (int)dcy;
if (dx > dy)
{
if (dcy < 0)
{
dy = - dy/2;
}
else
{
dy = dy/ 2; //needed y-shift accounting for direction
}
dx = 0;
}
else
{
if (dcy < 0)
{
dx = - dx/ 2;
}
else
{
dx = dx/2;
dy = 0;
}
}
imgpoint.X+=dx;
imgpoint.Y+=dy;
}
}
En utilisant ce code, la deuxième image est déplacé trop loin Dans certains cas.S'il vous plaît laissez-moi savoir si le code est correct.
Vous utilisez '(int) (DCX)' et DCY en deux endroits où la valeur absolue est nécessaire (quelque chose comme 'math.abs') – MBo
@MBo Thanks.Will vérifier et revenir. – techno
@MBo Merci beaucoup :) Votre deuxième mise à jour fonctionne très bien après l'utilisation de 'Math.Abs'.Vraiment apprécier l'effort. – techno