【问题标题】:Converting screen coords to world coords将屏幕坐标转换为世界坐标
【发布时间】:2011-10-03 08:15:02
【问题描述】:

我正在为我正在编写的地图应用程序处理转换矩阵。

我在屏幕坐标中有一个点,在目标坐标空间中有一个点,出于某种愚蠢的原因,我似乎无法弄清楚如何找到将屏幕坐标中的点转换为世界坐标的转换矩阵。

例如:

坐标 (1005.758, 673.661) 应转换为 (786382.6, 2961730.3) 并且坐标 (1010.240, 665.217) 应转换为 (786488.3, 2961837)。我使用的是 WPF,所以这就是为什么屏幕坐标实际上是 double 而不是 int

【问题讨论】:

  • 如果您使用带有平移的变换(仿射变换),您提供给我们的数据是不够的 - 检查 (0,0) 映射到的位置以及 (1,0) 和 (0,1) 的位置) 被指出,你可以在这里找到你需要的一切:en.wikipedia.org/wiki/Affine_transformation - 或者发布更多代码,我们可能会直接帮助你
  • 我认为不同坐标系中的两个点应该足够了。我不使用平移 - 场景是我得到一个 WPF 对象,它实际上是一张地图,我得到了不同坐标系中的两个点。用户可以平移 WPF 控件(地图),但由于坐标相对于地图所在的画布,因此平移不会改变点。​​span>
  • 如果你不使用翻译((0,0)映射到(0,0)),那么两个点就足够了,但问题很简单(只是一个比例变换) - 在你的情况,你只需要在 x 方向上缩放 786382.6/1005.758,在 y 方向上缩放 296173.3/673.661
  • 感谢卡斯滕的意见!

标签: wpf math matrix coordinates transform


【解决方案1】:

使用两个坐标,您可以提取比例因子和平移(如果地图仅使用这两个操作)。

第一维的缩放由

给出
s1 = (786382.6 - 786488.3) / (1005.758 - 1010.24) => s1 ~ 23.583

在第二个通过

s2 = (2961730.3 - 2961837) / (673.661 - 665.217) => s2 ~ -12.636

而对应的偏移量是

o1 = 786382.6 - s1 * 1005.758 => o1 ~ 762663.586

o2 = 2961730.3 - s2 * 673.661 => o2 ~ 2970242.809

因此,您的转换由

给出
(x, y) -> (o1+s1*x, o2+s2*y) = (762663.586+23.583*x, 2970242.809-12.636*y)

【讨论】:

  • 霍华德的工作很棒!感谢您提供快速而优雅的解决方案!