js对几何变换的简单封装
如果是涉及到游戏或动画的编程,我们很可能会用到几何变换。如果在大学过线性代数的话,我们就会知道,无论是2d还是3d的几何变换,矩阵都是实现线性变换的一个重要工具。任意线性变换都可以用矩阵表示为易于计算的一致形式,并且多个变换也可以很容易地通过矩阵的相乘连接在一起。本文章主要对如下的变换进行简单的封装,并简单阐述其中的变换原理:1.平移变换:只改变图形的位置,不改变大小。
2.旋转变换:保持图形各部分之间的关系,变换后形状不变。
3.比例变换:可改变图形大小和形状。
4.错切变换:引起图形角度关系的改变,甚至导致图形发生畸变。
5.对称变换:使图形对称于x轴或y轴或y=x或y=-x的变换。
程序中,我们将定义一个矩阵类Matrix,其中的matrix属性保存以二维数组表示的矩阵形式,当我们初始化矩阵对象时,需要传入该矩阵的具体数据:
var mtx= new matrix({
matrix:[
[1,0,0],
[0,1,0],
[0,0,1]
]
});
由于在变换过程中需要用到矩阵操作的一些通用方法,因此我们可以先在矩阵类中添加这些实例方法:
/**
*矩阵相加
**/
add:function(mtx){
var omtx=this.matrix;
var newMtx=[];
if(!mtx.length||!mtx[0].length||mtx.length!=omtx.length||mtx[0].length!=omtx[0].length){//如果矩阵为空,或行或列不相等,则返回
return;
}
for(var i=0,len1=omtx.length;i<len1;i++){
var rowMtx=omtx[i];
newMtx.push([]);
for(var j=0,len2=rowMtx.length;j<len2;j++){
newMtx[i][j]=rowMtx[j]+mtx[i][j];
}
}
this.matrix=newMtx;
return this;
},
/**
*矩阵相乘
**/
multiply:function(mtx){
var omtx=this.matrix;
var mtx=mtx.matrix;
var newMtx=[];
//和数字相乘
if(cg.core.isNum(mtx)){
for(var i=0,len1=omtx.length;i<len1;i++){
var rowMtx=omtx[i];
newMtx.push([]);
for(var j=0,len2=rowMtx.length;j<len2;j++){
omtx[i][j]*=mtx;
}
}
return new matrix({matrix:newMtx});
}
//和矩阵相乘
var sum=0;
for(var i=0,len1=omtx.length;i<len1;i++){
var rowMtx=omtx[i];
newMtx.push([]);
for(var m=0,len3=mtx[0].length;m<len3;m++){
for(var j=0,len2=rowMtx.length;j<len2;j++){
sum+=omtx[i][j]*mtx[j][m];
}
补充:web前端 , JavaScript ,