Wpf 将屏幕坐标转换为世界坐标

Wpf 将屏幕坐标转换为世界坐标,wpf,math,matrix,coordinates,transform,Wpf,Math,Matrix,Coordinates,Transform,我正在为我正在编写的地图应用程序编写转换矩阵 我在屏幕坐标中有一个点,在目标坐标空间中有一个点,出于某种愚蠢的原因,我似乎无法找到转换矩阵——将屏幕坐标中的点转换为世界坐标 例如: 坐标(1005.758673.661)应转换为(786382.62961730.3) 坐标(1010.240665.217)应转换为(786488.32961837)。我使用的是WPF,这就是为什么屏幕坐标实际上是double,而不是int,使用两个坐标可以提取比例因子和平移(如果地图仅使用这两个操作) 第一维中的缩

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

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

例如:

坐标(1005.758673.661)应转换为(786382.62961730.3)
坐标(1010.240665.217)应转换为(786488.32961837)。我使用的是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

因此,你的转变是由

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

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

第一维中的缩放比例由以下公式给出:

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

因此,你的转变是由

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

如果使用带平移的变换(仿射变换),则您提供的数据不足-请检查(0,0)映射到的位置以及(1,0)和(0,1)的位置你可以在这里找到你需要的一切:-或者发布更多的代码,我们可能会直接帮助你。我认为不同坐标系中的两点就足够了。我不使用平移-场景是我得到一个WPF对象,它实际上是一个地图,我得到了不同坐标系中的两点。用户可以在周围平移WPF控件(地图),但由于坐标相对于地图所在的画布,因此平移不会更改点。如果不使用平移((0,0)贴图到(0,0)),则两个点就足够了,但问题相当简单(仅是比例变换)-在您的情况下,您只需在x方向上缩放786382.6/1005.758,在y方向上缩放296173.3/673.661谢谢您的输入卡斯滕!如果使用带平移的变换(仿射变换),则您提供的数据不足-请检查(0,0)映射到的位置以及(1,0)和(0,1)的位置你可以在这里找到你需要的一切:-或者发布更多的代码,我们可能会直接帮助你。我认为不同坐标系中的两点就足够了。我不使用平移-场景是我得到一个WPF对象,它实际上是一个地图,我得到了不同坐标系中的两点。用户可以在周围平移WPF控件(地图),但由于坐标相对于地图所在的画布,因此平移不会更改点。如果不使用平移((0,0)贴图到(0,0)),则两个点就足够了,但问题相当简单(仅是比例变换)-在您的情况下,您只需在x方向上缩放786382.6/1005.758,在y方向上缩放296173.3/673.661谢谢您的输入卡斯滕!真棒,霍华德!感谢您快速而优雅的解决方案!真棒,霍华德!感谢您快速而优雅的解决方案!