执行 2 个位图的重叠检测

2024-02-19

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

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

执行 2 个位图的重叠检测 的相关文章

随机推荐

  • 会话与会话工厂之间的区别 - Hibernate?

    除了以下几点之外 我们还有其他差异吗 另请验证以下是否正确 SessionFactory每个应用程序都有一个对象 并且Session每个客户只有一个对象 SessionFactory是创建和管理Sessions Session就是提供一个C
  • Android TableLayout 不垂直滚动

    预先感谢您的任何帮助 我对 Android 很陌生 这是我的问题 我正在使用 TableLayout 来显示可编辑字段 大约有二十行要显示 在较小的设备上 行会溢出屏幕 我需要视图允许用户上下滚动 我缺少什么 尝试将 TableLayout
  • 在windows上打开指定目录下的Cygwin命令

    我使用 phpstorm 和它的终端设施 在终端部分我输入F Projects cygwin64 bin mintty exe i Cygwin Terminal ico 所以它使用 Cygwin 作为终端 但它会在主文件夹中打开它 是否可
  • XML 不可能是整个程序

    当我包含以下 js 文件 其中包含 jquery 时 我在 Firebug 中收到错误 XML 不能是整个程序 JS文件包含参考 JS文件内容 id txtAddress1S blur function id txtAddress1S va
  • WPF 中延迟后重置变量值

    我有一些执行并获取执行返回值的代码 我将此值设置为窗口的依赖属性 因为有样式触发器绑定到它 当变量为 0 时 使用默认样式 1 时使用偏红色样式 2 时使用绿色样式 但一段时间后我必须以某种实际的方式重置这种风格 做到这一点最简单的方法是什
  • High Sierra 中的 NSCollectionView 内存泄漏?

    我通过 Instruments 注意到 NSCollectionView 中存在内存泄漏 当我追踪代码时 它显示了下面的特定行 collectionView makeItem withIdentifier identifier for in
  • Python 变量声明

    我想澄清一下 Python 中如何声明变量 我见过变量声明 https www learnpython org en Variables and Types as class writer path 有时 没有显式声明 而只是使用初始化 i
  • 如何通过 XPath 选择第一个元素?

    我有以下 HTML 结构 div class carousel ul class carousel view li li ul div
  • 如何解决Hibernate“未能延迟初始化角色集合”异常

    我有这个问题 org hibernate LazyInitializationException 未能延迟初始化角色集合 mvc3 model Topic comments 没有会话或会话被关闭 这是模型 Entity Table name
  • 如何转义包含空格的路径

    要将带有空格的路径传递给 NET 控制台应用程序 您应该转义它 可能不是转义而是用双引号引起来 myapp exe path C Program Files MyApp becomes new string path C Program F
  • 从 A[a,b] 到 A[c,d] 的不同非循环路径的计数?

    我正在编写一个推箱子求解器 用于娱乐和练习 它使用一个简单的算法 类似于 BFS 但略有不同 现在我想估计它的运行时间 O 和 omega 但需要知道如何计算网络中从一个顶点到另一个顶点的非循环路径的计数 实际上我想要一个表达式来计算 m
  • Eclipse:无法从 SDK 获取所需的 ADT 版本号 [重复]

    这个问题在这里已经有答案了 我尝试设置一个新的 eclipse 安装 包括 android sdk 和 adt 插件 所有部件的安装均已完成 没有错误 使用 eclipse 设置 sdk 路径后出现此错误 Failed to get the
  • Android 上的预定警报管理器不工作

    我正在尝试启动每天在特定时间重复的闹钟服务 我已经在堆栈溢出方面经历了很多线程 但没有运气 我遵循了一些教程 http karanbalkar com 2013 07 tutorial 41 using alarmmanager and b
  • 为什么这个版本的 strcmp 速度较慢?

    我一直在尝试提高性能的实验strcmp在某些条件下 然而 不幸的是 我什至无法实现普通的香草strcmp执行以及库实现 I saw a 类似的问题 https stackoverflow com q 20734934 774658 但答案表
  • 用户开始输入后如何在 EditText 中添加字符

    我有一个 editText 用户在其中输入电话号码 但是当他们单击第一个号码时 我希望在文本开头出现一个 我有这段代码 但 始终存在 我只希望它在用户输入数字时出现 我该如何解决这个问题 final EditText editText fi
  • JQuery TableSorter 逗号数字解析器不工作

    这是我的问题 我目前正在使用 JQuery Table Sorter 并且在网上找到了一个逗号数字解析器 我遇到的问题是它似乎不起作用 因此 该列的排序如下 4 666 141 666 293 341 666 346 461 676 这应该
  • xcodebuild 错误:“删除方案时出错:无法修改数据,因为该进程不允许保存。”

    我正在尝试使用测试 Swift 包xcodebuild 命令是 Applications Xcode 13 3 1 app Contents Developer usr bin xcodebuild test scheme BokenEng
  • Android 应用 XML 中的上标和下标

    我正在解析 XML 文件中的数据 该文件中包含从字符映射表中获取的下标和上标字符 就像这样
  • 如何在 Ionic 5 中获得 canGoBack 功能?

    我试图在 Ionic 应用程序中放置一个后退按钮 并在根目录中隐藏后退按钮 该根目录不是固定的 可以根据流程进行更改 我在这里找到了以下代码 constructor private router Router private ionRout
  • 执行 2 个位图的重叠检测

    我有一个自定义图片框控件 允许在主图像上单独拖动 2 个位图 从而允许用户选择 2 个位图的位置 对于第一个位图 Point src e Location PointF ratio new PointF float src X Client