使用平移和缩放计算正确的光标位置

2024-02-25

我已经在这个问题上折腾了大约一个小时了。

我有一个支持平移和缩放的视口,平移是通过存储 X 和 Y 轴的偏移来处理的。缩放只是一个从 0.2 到 14 的浮动值。

我的问题是,我需要能够将内容放置在用户在视口中单击的位置,但是当我缩放和平移时,鼠标坐标不正确。我一直无法弄清楚如何正确计算鼠标坐标。

这是一张显示我到目前为止所拥有的内容的图片:https://i.stack.imgur.com/3hKHH.png https://i.stack.imgur.com/3hKHH.png

正如您所看到的,鼠标原点始终位于视口组件的左上角。您可以在图像左下角看到平移 X 和 Y 偏移以及缩放值。我还添加了一个与视口左上角相关的鼠标坐标的示例。

现在,由于在该图像中,当前放大的对象我放置的对象将被偏移。

感谢您的时间!

使用适合我的案例的解决方案进行编辑:

void Viewport_MouseClick(object sender, MouseEventArgs e){
    Point mousePosition = new Point((int)((e.X - Pan.X) / Zoom),
                                    (int)((e.Y - Pan.Y) / Zoom));
}

这会计算正确的“屏幕空间”鼠标位置,同时考虑平移和缩放。 我通过尝试 TaWs 答案得到了这个解决方案。感谢您的帮助! :)


使用 TrackBar 进行缩放,再使用两个 TrackBar 进行偏移,这似乎有效:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    using (Bitmap bmp = new Bitmap(filename))
    {
        e.Graphics.ScaleTransform(zoom, zoom);
        e.Graphics.DrawImage(bmp, trb_offsetX.Value, trb_offsetY.Value);
    }
}

float zoom = 1f;

private void panel1_MouseMove(object sender, MouseEventArgs e)
{

  Point mouseLocation = e.Location;
  Point imageLocation = new Point((int)((mouseLocation.X / zoom - trb_offsetX.Value)),
                                  (int)((mouseLocation.Y / zoom - trb_offsetY.Value)));

   st_mousePos.Text = "   "  +  imageLocation.ToString();

}


private void trackBar1_Scroll(object sender, EventArgs e)
{
    zoom = trackBar1.Value;
    panel1.Invalidate();
}

我已经添加了 Paint 事件的代码,因此您可以看看这是否也是您处理它的方式。

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

使用平移和缩放计算正确的光标位置 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定

随机推荐

  • 没有应用程序与此操作的指定文件关联 (VB.NET)

    我们有一个 Win Forms 应用程序 它使用 iTextSharp 生成 pdf 将其保存到本地目录 然后应用程序打开该文件 对于一名客户 所有 XP 机器和 Adob e Reader 11 它会抛出以下错误 No applicati
  • 文本区域的值?怎样填写呢?

    我正在尝试填补一个textarea使用javascript 问题是我发现textarea没有值标签 并且
  • Android 资源 ID

    我正在从自定义 xml 视图类型检索自定义资源 ID 我被要求为检索指定一个默认的 int 值 并且想知道 ID 的范围是多少 它们总是正数还是包含零 即 1 是一个有效的 空 引用和 或 0 是一个有效的 空 引用吗 Thanks EDI
  • 将嵌套的 for 循环转换为单个 LINQ 语句

    有人可以帮我将此嵌套结构转换为单个 LINQ 语句吗 EventLog logs EventLog GetEventLogs for int i 0 i lt logs Length i if logs i LogDisplayName E
  • 尝试为 ARM 构建 GDB 时出错

    我正在尝试为我的 Ubuntu 16 04 机器上的手臂构建 GDB 版本 8 0 我打算直接在arm机器上调试 目前没有服务器 我已经执行了这些指令 正如所解释的那样here https sourceware org gdb wiki B
  • 在 Python 中使用数量时消除单位

    我正在使用伟大的数量 http pypi python org pypi quantitiesPython 的包 我想知道如何在没有单位的情况下仅获得数量的数值 即 如果我有 E 5 3 quantities joule 我只想得到5 3
  • Android 是否将从 HTTP 下载的图像保留在缓存中?

    这就是我的程序的工作原理 1 显示来自服务器的图片 2 用户更改图片并上传到服务器 3 从服务器重新下载显示图片 这是我从服务器获取图片的方式 String src http www getyourpicture com mypicture
  • Scala Map 实现按插入顺序保留条目?

    在Java中 我使用LinkedHashMap以此目的 Java 的文档LinkedHashMap很明显它有 可预测的迭代顺序 我在 Scala 中也需要同样的东西 斯卡拉有ListMap and LinkedHashMap 但是关于他们到
  • 将数据框中的列乘以向量

    我想要做的是将 data frame 的第 1 列中的所有值乘以向量中的第一个元素 然后将第 2 列中的所有值乘以向量中的第二个元素 依此类推 c1 lt c 1 2 3 c2 lt c 4 5 6 c3 lt c 7 8 9 d1 lt
  • 使用 XMLHTTP 方法时等待页面加载

    在下面的工作代码中 我尝试导航到特定的 YouTube 频道 要将视频名称放入 Excel 中 它可以工作 但部分工作 因为代码只列出了大约 30 个视频 Dim x html As Object ele As Object sKeyWor
  • 当 ASP.net 验证摘要已填写时,如何调用 javascript 函数

    我的页面中有一个validationSummary 我想在validationSummary填充后调用一个javascript函数 我怎样才能做到这一点 我认为我应该在后面的代码中添加一个属性 但我无法弄清楚该属性的键是什么 有什么帮助吗
  • VirtualPathUtility 的 ASP.Net Core 替换

    有替代品吗VirtualPathUtility ToAbsolute在 ASP Net Core 中 似乎不可用 我想转换相对路径 例如将 bob 转换为绝对路径 例如 应用程序 鲍勃 我试图从类库中执行此操作 因此无法访问控制器和视图的常
  • 每个块的最大线程数

    我有以下信息 Maximum number of threads per block 512 Maximum sizes of each dimension of a block 512 x 512 x 64 这是否意味着 2d 线程块中的
  • Git:添加非暂存文件

    我对文件进行了更改 尝试暂存文件后git add 像往常一样 我继续承诺git commit m 然而 终端向我吐出了这样的信息 no changes added to commit use git add and or git commi
  • pandas 中 DataFrame.div 和 DataFrame.divide 的区别

    我试图将 pandas 数据帧的一列元素与另一列的相同行索引元素分开 在尝试寻找库函数来实现此目的时 我遇到了两个函数数据框 div https pandas pydata org pandas docs stable generated
  • 计算数据框中每列的非 NA 值的数量[重复]

    这个问题在这里已经有答案了 我有一个很大的数据集 其中包含很多NAs 和一些非 Na 值 此刻我数着我的非NA每列的值如下所示 attach df 1000 sum is na X1 1000 sum is na X2 1000 sum i
  • 带有用于 NTLM 身份验证的 http 客户端的 Spring Rest 模板

    我们在 IIS 服务器中部署了一个 Web 服务 该服务基于 NTLM 身份验证进行身份验证 当我尝试通过在 httpClient UserNamePasswordCredentials 中传递用户名和密码来访问 Web 服务时 收到警告
  • React应用程序未在azure应用程序服务中启动

    我已将一个简单的反应应用程序部署到 azure 应用程序服务 但它无法启动 如何让应用程序运行index html 将此命令添加到您的 azure 仪表板 gt 配置 gt 启动命令中 pm2 serve home site wwwroot
  • 在 sailsjs 视图中访问会话变量

    我对 sailsjs 和 nodejs 很陌生 我正在尝试创建一个身份验证页面 其中一旦用户通过身份验证 我想设置 req session user user id req session authenticated true 然后我需要在
  • 使用平移和缩放计算正确的光标位置

    我已经在这个问题上折腾了大约一个小时了 我有一个支持平移和缩放的视口 平移是通过存储 X 和 Y 轴的偏移来处理的 缩放只是一个从 0 2 到 14 的浮动值 我的问题是 我需要能够将内容放置在用户在视口中单击的位置 但是当我缩放和平移时