<rect x='50' y='50' width='100' height='50' fill='none' stroke='blue' transform='translate(100,75) rotate(45) translate(-100,-75)'/>
这样一个矩形,坐标(x=50,y=50,w=100,h=50),中心点(100,75),transform的意思是以矩形中心点为旋转中心点顺时针旋转45度
1、直接用D2D1::Matrix3x2F::Rotation(45, Point2F(100,75))的到的矩阵:
0.707106769, 0.707106769
-0.707106769, 0.707106769
82.3223343, -48.7436867
2、用D2D1::Matrix3x2F::Translate(100,75)*D2D1::Matrix3x2F::Rotation(45, Point2F(0,0))*D2D1::Matrix3x2F::Translate(-100,-75)连续变换用矩阵乘法算出来的矩阵:
0.707106769, 0.707106769
-0.707106769, 0.707106769
-82.3223267, 48.7436829
两种方法得到的矩阵为什么不一样,从绘图结果来看第二种方法得到的矩阵是不正确的,到底哪里错了?
这条SVG代码可以用两种矩阵乘法实现,不同的实现方式会得到不同的结果。
1、第一种实现方式:
使用D2D1::Matrix3x2F::Rotation(45, Point2F(100,75)),可以得到:
0.707106769, 0.707106769
-0.707106769, 0.707106769
82.3223343, -48.7436867
2、第二种实现方式:
使用D2D1::Matrix3x2F::Translate(100,75)*D2D1::Matrix3x2F::Rotation(45, Point2F(0,0))*D2D1::Matrix3x2F::Translate(-100,-75),可以得到:
0.707106769, 0.707106769
-0.707106769, 0.707106769
-82.3223267, 48.7436829
这两种实现方式得到的矩阵是不一样的,原因在于使用矩阵乘法时,采用的顺序不一样,而不同的顺序会导致不同的结果。由于SVG中的变换指令是按照从右到左的顺序执行的,所以第一种实现方式才是正确的