您的位置:首页 > 移动开发 > Android开发

利用Android的Matrix类实现J2ME的drawRegion的镜像方法

2011-04-13 17:30 627 查看
在用Android实现J2ME的drawRegion方法时,发现网上介绍的镜像翻转都是用像素数组行变列实现的,其实这还是j2me式的实现方法,Android中有Matrix类,如果学过计算机图形学,只要按其原理,进行矩阵变换即可。



一、对称变换








1. 对称于Y轴

其变换矩阵:







其变换为:






2. 对称于X轴:







3. 对称于原点O:






4. 对称于直线y=x:






5. 对称于直线y=-x:






二、drawRegion方法的实现



Ruby代码



public void drawRegion(Image image_src,

int x_src, int y_src,

int width, int height,

int transform,

int x_dest, int y_dest,

int anchor){



if((anchor&VCENTER) != 0){

y_dest -= height/2;

}else if((anchor&BOTTOM) != 0){

y_dest -= height;

}

if((anchor&RIGHT) != 0){

x_dest -= width;

}else if((anchor&HCENTER) != 0){

x_dest -= width/2;

}



Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);



Matrix mMatrix = new Matrix();

Matrix temp = new Matrix();

Matrix temp2 = new Matrix();



float[] mirrorY = {

-1, 0, 0,

0, 1, 0,

0, 0, 1

};

temp.setValues(mirrorY);



switch(transform){

case Sprite.TRANS_NONE:



break;



case Sprite.TRANS_ROT90:

mMatrix.setRotate(90,width/2, height/2);

break;



case Sprite.TRANS_ROT180:

mMatrix.setRotate(180,width/2, height/2);

break;



case Sprite.TRANS_ROT270:

mMatrix.setRotate(270,width/2, height/2);

break;



case Sprite.TRANS_MIRROR:

mMatrix.postConcat(temp);

break;



case Sprite.TRANS_MIRROR_ROT90:

mMatrix.postConcat(temp);

mMatrix.setRotate(90,width/2, height/2);

break;



case Sprite.TRANS_MIRROR_ROT180:

mMatrix.postConcat(temp);

mMatrix.setRotate(180,width/2, height/2);

break;



case Sprite.TRANS_MIRROR_ROT270:

mMatrix.postConcat(temp);

mMatrix.setRotate(270,width/2, height/2);

break;



}



mMatrix.setTranslate(x_dest, y_dest);



canvas.drawBitmap(newMap, mMatrix, mPaint);





}





利用Matrix类,不止可实现对称变换,还可以实现其它的几何变换,包括组合变换。附件中是从网上找到的关于图形变换原理的ppt,希望对大家有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: