执行2个位图的重叠检测

我有一个自定义的图片框控件,允许在主图像上单独拖动2位图,从而允许用户选择2位图的位置。

对于第一个位图

Point src = e.Location; PointF ratio = new PointF((float)src.X / ClientSize.Width, (float)src.Y / ClientSize.Height); LaunchOrigin.textratio = ratio; Point origin = new Point((int)(backupbit1.Width * ratio.X), (int)(backupbit1.Height * ratio.Y)); LaunchOrigin.textorigin = origin; point.X = src.X - origin.X; point.Y = src.Y - origin.Y; 

对于第二个位图

 Point src = e.Location; PointF ratio = new PointF((float)src.X / Width, (float)src.Y / Height); LaunchOrigin.logoratio = ratio; Point origin = new Point((int)(backupbit2.Width * ratio.X), (int)(backupbit2.Height * ratio.Y)); LaunchOrigin.logoorigin = origin; point2.X = src.X - origin.X; point2.Y = src.Y - origin.Y; 

这是位置返回到包含全分辨率图像的主窗体。为了正确转换2个点(2个位图),我执行以下操作。

 Point origin = new Point((int)(bitmap.Width * textratio.X), (int)(bitmap.Height * textratio.Y)); Point pos2 = new Point((int)(textratio.X * img.Width), (int)(textratio.Y * img.Height)); cpoint.X = pos2.X - (int)(origin.X); cpoint.Y = pos2.Y - (int)(origin.Y); Point origin = new Point((int)(worktag.Width * logoratio.X), (int)(worktag.Height * logoratio.Y)); Point logopositionpoint = new Point((int)(logoratio.X * img.Width), (int)(logoratio.Y * img.Height)); imgpoint.X = logopositionpoint.X - origin.X; imgpoint.Y = logopositionpoint.Y - origin.Y; 

当2个位图放置在远处时,这非常好。但是当2个位图彼此靠近并且全分辨率图像的高度小于用于放置位图的参考图像时,这2个位图重叠。

我做错了什么? 或者我需要做一些重叠检测?

请指教..

我创建了一个在表单上工作的示例代码。 该表单具有从按钮获取图像的图片框。 如果解决方案有效,您可以更改它。 表单有组件(pictureBox,btnImage)

这是完整的代码

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { Image img1; Image img2; public Form1() { InitializeComponent(); Image img = Image.FromFile(@"C:\pics\1.jpg"); this.btnImage.Image = img; this.pcitureBox.AllowDrop = true; } private void btnImage_MouseDown(object sender, MouseEventArgs e) { Button btnPic = (Button)sender; btnPic.DoDragDrop(btnPic.Image, DragDropEffects.Copy); } private void picBox_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Bitmap)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } } int img1X = 0; int img1Y = 0; private void picBox_DragDrop(object sender, DragEventArgs e) { var point = this.PointToClient(new Point(eX, eY)); int X = point.X - pcitureBox.Left; int Y = point.Y - pcitureBox.Top; PictureBox picbox = (PictureBox)sender; Graphics g = picbox.CreateGraphics(); if (img1 == null) { img1 = (Image)e.Data.GetData(DataFormats.Bitmap); img1X=X; img1Y = Y; g.DrawImage(img1, new Point(img1X, img1Y)); return; } else { #region add img2 img2 = (Image)e.Data.GetData(DataFormats.Bitmap); //img1 has standart 0,0 point u can change Rectangle r1 = new Rectangle(img1X, img1Y, img1.Width, img1.Height); Rectangle r2 = new Rectangle(X, Y, img2.Width, img2.Height); Rectangle overlapRect = Rectangle.Intersect(r1, r2); int img2X = X; int img2Y = Y; if (overlapRect.Width > 0 || overlapRect.Height > 0) { bool betweenX = overlapRect.X >= r1.X && overlapRect.X <= (r1.X + r1.Height); bool betweenY = overlapRect.Y >= r1.Y && overlapRect.Y <= (r1.Y + r1.Width); if (betweenX) { img2X = GetNewX(r1, r2); } else if (betweenY) { img2Y = GetNewY(r1, r2); } else { if (overlapRect.Width <= overlapRect.Height) { img2X = GetNewX(r1, r2); } else { img2Y = GetNewY(r1, r2); } } } g.DrawImage(img1, new Point(img2X, img2Y)); #endregion } } private int GetNewX(Rectangle r1, Rectangle r2) { if (r2.X < r1.X) { return r1.X - r2.Width; } else { return r1.X + r1.Width; } } private int GetNewY(Rectangle r1, Rectangle r2) { if (r2.Y < r1.Y) { return r1.Y - r2.Height; } else { return r1.Y + r1.Height; } } } }