工作中,因为涉及到坐标系变换。所以使用到矩阵。但因为数学基础不佳,矩阵变换始终困扰着我。
此处,作为记录。
PS:矩阵具体介绍详情百度。
首先,矩阵变换,影响的是每一个点,所以使用矩阵进行转换,本质上是将这个坐标系的所有坐标点进行了偏移。
这是一个三维矩阵,简称为CTM。因为只需要平面坐标系,所以第三行为零。可以理解成二维坐标系。
使用此矩阵可以进行平面坐标系的旋转,缩放和方向变换。
{ a, b, t1 }
{ c, d, t2 }
{ 1, 1, 1 }
首先忽略 b, c。b, c使用在旋转坐标系中。暂时不是本文讲述内容。
最终得到
{ a, 0, t1 }
{ 0, d, t2 }
{ 1, 1, 1 }
使用本身很容易。
但需要注意的是代表的含义:假设原坐标系为:A,转换坐标系为:B。A->B 使用CTM,B->A 则可以使用逆变换。
使用坐标系变换的原因是:其中一个坐标系会动态的进行相对移动。所以,使用CTM时,应该以相对不变的坐标系来作为原坐标系。
此矩阵的逆变换公式为(t1,t2=0):A1-A4对应a,b,c,d。dbX和dbY对应:转换坐标系中的X,Y。
dFactor = dA3/dA1;
dResultY = ( dbY - dFactor*dbX ) / ( dA4 - dFactor*dA2 );
dResultX = ( dbX - dA2*dY ) / dA1;
当A2,A3为0时,则可以简化为:
dFactor = 0;
dResultY = dbY / DdA4;
dResultX = dbX / dA1;
然后再添加t1,t2,因为是逆变换,所以需要减去t1,t2。(需要注意:此式子只只用于A2,A3为0时。如果不为零,则需要考虑A2,A3)
dResultY -= (dA1 * t2);
dResultX -= (dA4 * t1);
闲话总结:
在使用矩阵变换的前后近2个月中,我总迷失在转换坐标系里。迷失的原因,是因为对定义和逻辑不明确。
最开始没有定义CTM的转换方向,导致一个星期时间修改多次却没有正确的结论。
后来,因为矩阵本身知识不足,却没有尝试真正理解。使用投机方式完成代码。看似正确,并且实际也正确的代码,却因为自身的问题,反复修改。
代码里,定义本身和知识逻辑是最不能马虎的地方。
同样,在解释定义和函数时,最需要的,就是说明使用意图。
人不是神,遗忘是正常的。此时,意图解释,才能够真正让编程者理解代码含义。