Phi*_*sen 2 math lua svg matrix coronasdk
我正在从SVG文件中读取矩形的位置和旋转,该文件具有以下格式的矩阵:
<rect transform="matrix(1.02414 -0.133308 0.122628 0.942091 190.767 780.999)" width="122" height="20"/>
Run Code Online (Sandbox Code Playgroud)
现在我正试图将这些值解析成Lua以用这样的Corona和物理画出,但它们部分地出现了错误,并且在我目前的半猜测方法中也常常是NAN.我需要做什么才能将上面的矩阵转换为正确的Lua旋转度?
到目前为止我所拥有的是(值数组是SVG顺序的矩阵值).谢谢!
local x = values[5]; local y = values[6]
local rotation = math.acos(values[1])
if values[2] < 0 then rotation = -rotation end
rotation = math.floor( math.deg(rotation) )
rotation = rotation % 360
app.spritesHandler:createBar( math.floor(x), math.floor(y), rotation )
Run Code Online (Sandbox Code Playgroud)

首先,我认为您需要从0到5进行索引,而不是从1到6.
根据规范,旋转矩阵是:
a c e
b d f
0 0 1
Run Code Online (Sandbox Code Playgroud)
其中af是矩阵列表中的6个数字.
我们还发现rotate(angle,cx,cy)周围cx,cy相当于
这将是:
|1 0 cx| |cos(t) -sin(t) 0| |1 0 -cx|
|0 1 cy| |sin(t) cos(t) 0| |0 1 -cy|
|0 0 1 | | 0 0 1| |0 0 1 |
|cos(t) -sin(t) cx| |1 0 -cx|
= |sin(t) cos(t) cy| |0 1 -cy|
| 0 0 1| |0 0 1 |
|cos(t) -sin(t) (-cx cos(t) + cy sin(t) + cx) |
= |sin(t) cos(t) (-cx sin(t) - cy cos(t) + cy) |
| 0 0 1 |
Run Code Online (Sandbox Code Playgroud)
因此,这表明角度信息在系数a,b,c和d中完全独立地可用.如果唯一应用的是这个矩阵,则a和d应该匹配,而b和c应该是相反的符号.
但是,看看你的数字列表,它们不是,所以我想知道是否还应用了其他一些转换?正如评论者指出的那样,数字大于1,因此不是在一个角度上进行简单的三角操作的结果.
一种可能性是,也存在扩展.该矩阵是:
| sx 0 0|
| 0 sy 0|
| 0 0 1|
Run Code Online (Sandbox Code Playgroud)
因此,如果首先应用,然后轮换,我们将获得:
| sx 0 0| |cos(t) -sin(t) (-cx cos(t) + cy sin(t) + cx) |
| 0 sy 0| |sin(t) cos(t) (-cx sin(t) - cy cos(t) + cy) |
| 0 0 1| | 0 0 1 |
|sx cos(t) -sx sin(t) sx (-cx cos(t) + cy sin(t) + cx) |
= |sy sin(t) sy cos(t) sy (-cx sin(t) - cy cos(t) + cy) |
| 0 0 1 |
Run Code Online (Sandbox Code Playgroud)
从那个矩阵:
a/c = sx cos(t) / (-sx sin(t))
= - cos(t) / sin(t)
= 1/tan(t)
tan(t) = c/a
tan(t) = 0.122628/1.02414
= 0.119738
t = 6.82794 degrees.
Run Code Online (Sandbox Code Playgroud)
从图像来看,我认为这看起来是正确的.
所以既然我们知道t,我们可以解决sx和sy:
a = sx cos(t)
sx = a/cos(t) = 1.0315
Run Code Online (Sandbox Code Playgroud)
和sy:
d = sy cos(t)
sy = d/cos(t) = 0.94882
Run Code Online (Sandbox Code Playgroud)
然后,使用我们已经获得的值,获得cx并cy找到旋转中心,然后进一步替换为上面的e和f的等式.
| 归档时间: |
|
| 查看次数: |
1764 次 |
| 最近记录: |