具有矩形和矩阵时计算坐标

时间:2020-10-08 07:27:06

标签: javascript math svg transform

如果我有一个SVG矩形,

[x1,y1,x2,y2] = [ 456.079, 402.645, 514.841, 527.925 ]

及其SVG矩阵

[0, 1, -1, 0, 58.7617, 0]

如何计算矩形的x, y, w, h

1 个答案:

答案 0 :(得分:0)

矩阵是直接2D均匀3x3变换矩阵,其中最后3个丢失元素隐式(0,0,1),因为SVG中没有投影。它基本上是this的2D版本。

因此,您需要实现3x3矩阵* 3D向量乘法V'= M * V,其中矩阵M是您的6个值+ (0,0,1),而3D向量V是{{1} }结果为(x',y',w),您可以忽略(x,y,w=1)。因此,当以代码编写(取自几年前我写的我的C ++ SVG解码器/编码器)来转换顶点时,只需执行以下操作:

w'

如果您也有电子秤,则:

x'=M[4]+(M[0]*x)+(M[2]*y);
y'=M[5]+(M[1]*x)+(M[3]*y);

位置:

x'=M[4]+scalex*((M[0]*x)+(M[2]*y));
y'=M[5]+scaley*((M[1]*x)+(M[3]*y));

此外,如果您要转换向量(或宽度,高度,半径之类的尺寸)而不是顶点,请使用M[6]={ 0, 1, -1, 0, 58.7617, 0 }; ,以便代码忽略偏移量:

w=0

如果您也有电子秤,则:

x'=(M[0]*x)+(M[2]*y);
y'=(M[1]*x)+(M[3]*y);

因此,将位置x'=scalex*((M[0]*x)+(M[2]*y)); y'=scaley*((M[1]*x)+(M[3]*y)); 转换为具有偏移量,而将(x1,y1)转换为不偏移(作为其宽度,高度)。

(x2,y2)

如果您的SVG对象父对象具有更多矩阵,则也需要按顺序应用它们。