将屏幕坐标转换为世界坐标
问题描述:
我正在为我正在编写的地图应用程序创建转换矩阵。将屏幕坐标转换为世界坐标
我在屏幕坐标和目标坐标空间中的点有一个点,对于一些愚蠢的原因,我似乎无法弄清楚如何找到转换矩阵转换我的屏幕坐标点到世界坐标。
例如:
坐标(1005.758,673.661)应当被转换成(786382.6,2961730.3) 和坐标(1010.240,665.217)应当被转换成(786488.3,2961837)。我使用的是WPF,这就是为什么屏幕坐标实际上是double
而不是int
。
答
使用两个坐标可以提取比例因子和平移(如果地图仅使用这两个操作)。在第一维
缩放由
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
和
如果您使用的是与转换(仿射变换)变换210因此您的转化由
(x, y) -> (o1+s1*x, o2+s2*y) = (762663.586+23.583*x, 2970242.809-12.636*y)
+0
令人敬畏的工作霍华德!感谢您的快速和优雅的解决方案! –
你给我们的数据给出的是不够的 - 检查其中(0,0)映射到何地(1 ,0)和(0,1)指向,你可以在这里找到你需要的一切:http://en.wikipedia.org/wiki/Affine_transformation - 或者发布一些更多的代码,我们可能会直接帮助你 – Carsten
我认为不同坐标系中的两点应该足够了。我不使用翻译 - 场景是我得到一个实际上是地图的WPF对象,并且我在不同的坐标系中得到了两个点。用户可以翻译WPF控件(地图),但由于坐标相对于坐标所在的画布,因此翻译不会改变点。 –
如果你不使用翻译((0,0)贴图到(0,0))确实有两点是足够的,但问题很简单(只是一个尺度转换) - 在你的情况下,你只需要缩放通过786382.6/1005.758在x方向和296173.3/673.661在y方向 – Carsten