【问题标题】:Parsing SVG - transformation matrix decomposition解析 SVG - 变换矩阵分解
【发布时间】:2013-12-29 02:18:57
【问题描述】:

我需要解析 SVG(只是简单的事情),剩下要做的就是从矩阵变换中正确提取位置和角度。我知道这个问题已经被问过很多次,我相信我已经阅读了很多答案、文件等,但仍然无法正确处理。这是我设法准备的最简单的示例:

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

    <rect
       width="100"
       height="100"
       x="100"
       y="100" />

然后我将矩形旋转了 33 度(使用“转换”inkscape 工具)。 SVG 代码如下所示:

   <rect
       width="100"
       height="100"
       x="-5.8952699"
       y="157.49644"
       transform="matrix(0.83867057,-0.54463904,0.54463904,0.83867057,0,0)" />

现在,我的目标是从矩阵中提取位置和角度,所以基本上我想取回以下值:x:100,y:100,angle:33。为了做到这一点,我假设了以下公式:

sx=sqrt(a^2+b^2)
sy=sqrt(c^2+d^2)

t=atan(c/d) OR t=atan(-b/a)
t=acos(a) if MATRIX is PURE

x' = tx + sx*(COS(t)*x-SIN(t)*y)
y' = ty + sy*(SIN(t)*x+COS(t)*y)

结果是: t = 0.575958787(即 33 度)- 非常好

然而 x'=-90.72230563 和 y'=128.8770646 这正是让我感到困惑的地方——为什么不是 100,100?

【问题讨论】:

  • 您在 Inkscape 中围绕哪个中心旋转正方形?另外,你能澄清一下abcdtxtyxy在你的计算中是什么吗?
  • 好的,看来旋转是围绕正方形的中心。

标签: matrix svg transformation decomposition


【解决方案1】:

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

应用矩阵变换,旋转中心为 (0, 0)。坐标 (-5.895, 157.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

【讨论】:

  • @user2273369:很高兴听到我的回答有帮助。希望您没有将其复制得太近;计算 x3 时出现错误,应该是从 x2 而非 y2 计算的。我现在已经修好了。
  • 没关系 - 我没有注意到这个缺陷。效果很好!
  • 嘿,再一次 :) 看起来算法不适用于以下矩阵:0,1,-1,0,0,0。知道为什么吗?
  • @user2273369:我不知道为什么,并且不提供有关实际发生的事情和应该发生的事情的任何信息,您很难找出原因。 0,1,-1,0,0,0 的矩阵是一个 90 度的旋转,一种或另一种。
  • 你说得对,这次我描述的不够充分——我很抱歉。我将准备一个基于数字的示例并很快在此处发布。感谢您迄今为止的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2017-12-22
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2014-06-06
相关资源
最近更新 更多