Matrix SVG解析&变换矩阵分解

Matrix SVG解析&变换矩阵分解,matrix,svg,transformation,decomposition,Matrix,Svg,Transformation,Decomposition,我需要解析SVG(只是简单的东西),唯一要做的就是从矩阵变换中正确地提取位置和角度。我知道这个问题已经被问过很多次了,我相信我已经看过了很多答案、文件等,但仍然不能恰当地处理它。下面是我准备的最简单的例子: 我已经创建了1000x1000个文档(所有数字都在px中),并在100100位置放置了一个100x100大小的矩形。它生成了以下SVG文件(我删除了样式属性和父标记)。文件中没有其他转换: <rect width="100" height="100"

我需要解析SVG(只是简单的东西),唯一要做的就是从矩阵变换中正确地提取位置和角度。我知道这个问题已经被问过很多次了,我相信我已经看过了很多答案、文件等,但仍然不能恰当地处理它。下面是我准备的最简单的例子:

我已经创建了1000x1000个文档(所有数字都在px中),并在100100位置放置了一个100x100大小的矩形。它生成了以下SVG文件(我删除了样式属性和父标记)。文件中没有其他转换:

    <rect
       width="100"
       height="100"
       x="100"
       y="100" />
结果是: t=0.575958787(33度)-非常精细

然而 x'=-90.72230563和y'=128.8770646
这正是让我完全困惑的地方——为什么它不是100100?

以下是如何找到坐标的方法。我在这里使用Python进行计算

应用矩阵变换,旋转中心为(0,0)。坐标(-5.895157.496)是正方形需要的位置,因此如果将矩形旋转33度,旋转中心位于(0,0),它将围绕其中心旋转33度

首先,计算旋转角度似乎没有问题。我们将集中讨论如何确定位置

让我们从我们知道的开始:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> c = math.cos(33 * math.pi / 180)
>>> s = math.sin(33 * math.pi / 180)
>>> c
0.838670567945424
>>> s
0.5446390350150271
>>> x0 = -5.8952699
>>> y0 = 157.49644
这些是正方形旋转前左上角的坐标。正方形围绕其中心旋转,我们想知道其中心旋转到哪里:

>>> x1 = x0 + 50
>>> y1 = y0 + 50
>>> x1
44.1047301
>>> y1
207.49644
现在,旋转正方形的中心:

>>> x2 = c * x1 + s * y1
>>> y2 = -s * x1 + c * y1
>>> x2
149.9999998927001
>>> y2
149.9999995401914
从这里可以清楚地看到,如果正方形不旋转,我们如何到达正方形的左上角

>>> x3 = x2 - 50
>>> y3 = y2 - 50
>>> x3
99.99999989270009
>>> y3
99.9999995401914

你在Inkscape中旋转正方形的中心是什么?另外,你能澄清一下你计算中的
a
b
c
d
tx
ty
x
y
是什么吗?好的,看起来旋转是在正方形的中心附近。@user2273369:很高兴听到我的回答。希望你没有把它复制得太近;x3的计算存在错误,应根据x2而不是y2进行计算。我现在已经修好了。没关系——我没有注意到这个缺陷。很好!嘿,再一次:)看起来算法对以下矩阵不起作用:0,1,-1,0,0,0。知道为什么吗?@user2273369:我不知道为什么,不提供任何关于实际发生的事情和应该发生的事情的信息,你不容易找到原因。一个0,1,-1,0,0,0的矩阵是一个90度的旋转,不管是这样还是那样。你是对的,这次我描述得不够详细-我道歉。我将准备一个基于数字的示例,并很快在这里发布。谢谢你迄今为止的帮助。
>>> x2 = c * x1 + s * y1
>>> y2 = -s * x1 + c * y1
>>> x2
149.9999998927001
>>> y2
149.9999995401914
>>> x3 = x2 - 50
>>> y3 = y2 - 50
>>> x3
99.99999989270009
>>> y3
99.9999995401914