我有两个点数组:
Point [] original;
和 Point [] transformed;
这个被转换的数组是原数组应用变换后的副本。例如:
matrix.Rotate(5f);
matrix.Scale(.8f, 1.1f);
matrix.Translate(30f, 18f);
matrix.TransformPoints(transformed);
- 原始点是已知的。
- 转换值是已知的。
- 应用变换的顺序是不确定的。
如何计算/推断变换的顺序?
编辑
- 只有一个转换回合。
- 一回合最多包含三个变换,如下所示。
- 唯一应用的变换是旋转、缩放和平移的任意组合。
为了给它一些现实世界的背景,考虑拥有一个已知兴趣点的图像。你打印图像、扫描它并试图再次读取它。图像包含方向标记,允许我在扫描过程中计算应用的变换。
现在,一种暴力的方法是:
- 读取扫描的图像。
- 计算扫描图像上的旋转。
- 在扫描的图像上应用旋转。
- 在旋转后的图像上计算比例。
- 在缩放后的图像上应用比例。
- 在缩放后的图像上计算翻译。
- 在缩放后的图像上应用翻译。
现在,你可以使用原始点从处理过的图像中读取感兴趣的点,就好像没有进行任何变换一样。当然,这种方法是昂贵的。一个500MB的图像需要同时存在于内存中至少两个副本,并且必须使用图形对象进行转换。
这个问题的前提是只读取一次图像,计算所有变换并将它们应用于坐标而不是图像本身。然后使用转换后的坐标来读取感兴趣的点。这就是“变换的顺序”的问题所在。下面有一些非常有用的答案,我希望这澄清了背景。
0,1
,你的两个变换是沿着0,-1
平移和绕原点旋转180度。显然,在旋转之前进行平移非常重要。同样的论点也适用于缩放。 - Chris