2014-01-26 52 views
0

在变更路径我有SVG图形的一组固定的(围绕hundered),每个包含单一的<path>。想象一下,任何数量的这些形状都放置在新文档的任何位置。然后我应用任何以下操作中的每个形状多次我想:识别SVG文档

  • 旋转
  • 镜像(垂直/水平)
  • 量表(X/Y)

这些然后将操作呈现到新路径(不使用任何svg操作,如transform属性)。基本上,这是一个Adobe Illustrator save-as-svg的输出。

给定一个任意此类文件,我想找到反向工程的算法到这个形状和操作的列表,像

  1. 形船:位置(4,5),旋转20deg,比例×50%Y 100%,反映v =是,H =没有
  2. 形状汽车:等...

这将有可能强加在文档中的形状后,各自命名为“原始“形状使用图层ID,但我想尽可能地避免这种情况。

我首先想到的是让某种散列的形状来识别它们(可能是X哈希值,每个镜像操作),然后使用两个参考点的形状找到旋转。这个版本可以用来测量形状中各点之间所有距离的绝对值,并用这个距离除点之间的每个距离,得到一个唯一的散列。尽管Scale x/y要求似乎把这个想法搞得很糟糕。不幸的是我不能放弃这个要求。

回答

1

你正在做的形状,什么叫affine transformation,你的问题是要找到可以通过仿射变换映射到彼此的形状。假设点的顺序保持不变,这并不难。
仿射变换可以写成线性映射:(1)P'_k = A P_k+bP_k是原始点,写成包含x和y分量的2向量:P_k = (x, y)P'_k是映射点。 A是一个未知的2x2矩阵。 b是一个2x1矢量。两个形状相互对应,当且仅当存在Ab,以便可以使用(1)将一个形状的点映射到另一个形状的点。 A具有2x2 = 4个值,b有2个值,因此它们共有6个值。这些值可以通过将上述等式写入至少3个点来确定:P'1 = A P1+b; P'2 = A P2+b; P'3 = A P3+b;每个是一个二维矢量方程,所以这3个矢量方​​程可以写成6个标量方程。这6个标量方程形成一个线性方程组,可以解出Ab的系数。因此,一般位置上三个点(即不在一条直线上)足以确定Ab的元素。当你有这些值时,你可以检查剩下的点是否也符合该映射(1),如果是这种情况,那么形状相互对应。
更强大的方法是写(1)形状中的所有点,产生一个over-determined linear equation system。我不会详细讨论这个问题,但基本上你必须找到least-square solution,并检查解决方案的准确性。如果残差足够低,则形状相互对应。这是更稳健的,因为你平等对待所有的点,而不是选择三点。

+0

如何为每个方程选择P'_k和P_k?据我了解,它们应该对应于变换形状中的相同点,以使方程可解?我可能很幸运,起点总是相同的(用svg中的M标记),但在其他任何情况下,我是否必须在变换后的形状中选择一个随机起点,然后遍历原始中的所有点直到我找到相应的点? whoosh我希望我的问题很明确 – Tewr

+0

是的,你需要找到相应的点。尝试每一个作为起点将工作。即使您选择了错误的方程,也可以解决这个方程,但您很容易识别出正确的选择,因为它最合适,即残差最小。 – pentadecagon