Performing overlap detection from 2 bitmaps

I have a custom image control that allows 2 bitmaps to be dragged separately onto the main image, allowing the user to choose the location of the two bitmaps.

For the first bitmap

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;

      

For the second bitmap

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;

      

This location is returned to the main form containing the full resolution image. To translate 2 points correctly (from 2 bitmaps) I do the following.

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;

      

This works very well when 2 Bitmaps are placed in distant locations.But when 2 Bitmaps are closer to each other and the full resolution of the image becomes less than the reference image used to place the Bitmaps, these 2 Bitmaps overlap.

Am I doing something wrong? Or do I need to do some overlap?

I ask for advice ..

0


source to share


1 answer


I have typed in some sample code that works in a form. The form has an image that gets the image from the button. You can change it if the solution works. The form has components (pictureBox, btnImage)

Here is the complete code



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;
            }
        }

    }
}

      

0


source







All Articles