当前位置:编程学习 > JS >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,