执行2个位图的重叠检测

时间:2017-05-17 07:24:02

标签: c# .net bitmap gdi+ system.drawing

我有一个自定义的图片框控件,允许在主图像上单独拖动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个位图重叠

我做错了什么?或者我是否需要进行重叠检测?

请建议..

1 个答案:

答案 0 :(得分:0)

我创建了一个在表单上工作的示例代码。表单具有从按钮获取图像的图片框。如果解决方案有效,您可以更改它。表单有组件(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(e.X, e.Y));
            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;
            }
        }

    }
}