Android学习Matrix对称变换<5>

网上很多的倒影特效实际上就是一个对称变换,在改变透明度即可。

Matrix对称变换包括很多种,有关于Y轴对称,关于X轴对称,关于y= -x对称等等。

1 关于Y轴对称

[java]  view plain copy
 
  1. // 获取资源文件的引用res  
  2.         Resources res = getResources();  
  3.         // 获取图形资源文件  
  4.         Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.v);  
  5.         // 设置canvas画布背景为白色  
  6.         canvas.drawColor(Color.BLACK);  
  7.         // 在画布上绘制缩放之前的位图,以做对比  
  8.         //屏幕上的位置坐标是0,0  
  9.         canvas.drawBitmap(bmp, 0, 0, null);  
  10.         // 定义矩阵对象  
  11.         Matrix matrix = new Matrix();  
  12.         float[] values ={-1f,0.0f,0.0f,0.0f,1f,0.0f,0.0f,0.0f,1.0f};  
  13.         matrix.setValues(values);  
  14.         System.out.println("matrix:" + matrix.toString());  
  15.         Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),  
  16.                 matrix, true);  
  17.         canvas.drawBitmap(dstbmp, bmp.getWidth(), 0, null);  

 

屏幕上包括两幅图片,一张原图,一张对称图,来形成对比效应。

 

 

2 关于X轴对称

[java]  view plain copy
 
  1. // 获取资源文件的引用res  
  2.         Resources res = getResources();  
  3.         // 获取图形资源文件  
  4.         Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.v);  
  5.         // 设置canvas画布背景为白色  
  6.         canvas.drawColor(Color.BLACK);  
  7.         // 在画布上绘制缩放之前的位图,以做对比  
  8.         //屏幕上的位置坐标是0,0  
  9.         canvas.drawBitmap(bmp, 0, 0, null);  
  10.         // 定义矩阵对象  
  11.         Matrix matrix = new Matrix();  
  12.         float[] values ={1f,0.0f,0.0f,0.0f,-1f,0.0f,0.0f,0.0f,1.0f};  
  13.         matrix.setValues(values);  
  14.         System.out.println("matrix:" + matrix.toString());  
  15.         Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),  
  16.                 matrix, true);  
  17.         canvas.drawBitmap(dstbmp, 0, bmp.getHeight(), null);  


 

3 关于原点对称

[java]  view plain copy
 
  1. // 获取资源文件的引用res  
  2.         Resources res = getResources();  
  3.         // 获取图形资源文件  
  4.         Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.v);  
  5.         // 设置canvas画布背景为白色  
  6.         canvas.drawColor(Color.BLACK);  
  7.         // 在画布上绘制缩放之前的位图,以做对比  
  8.         //屏幕上的位置坐标是0,0  
  9.         canvas.drawBitmap(bmp, 0, 0, null);  
  10.         // 定义矩阵对象  
  11.         Matrix matrix = new Matrix();  
  12.         float[] values ={-1f,0.0f,0.0f,0.0f,-1f,0.0f,0.0f,0.0f,1.0f};  
  13.         matrix.setValues(values);  
  14.         System.out.println("matrix:" + matrix.toString());  
  15.         Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),  
  16.                 matrix, true);  
  17.         canvas.drawBitmap(dstbmp, bmp.getWidth(), bmp.getHeight(), null);  


 

4 关于y = x 对称

[java]  view plain copy
 
  1. // 获取资源文件的引用res  
  2.         Resources res = getResources();  
  3.         // 获取图形资源文件  
  4.         Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.v);  
  5.         // 设置canvas画布背景为白色  
  6.         canvas.drawColor(Color.BLACK);  
  7.         // 在画布上绘制缩放之前的位图,以做对比  
  8.         //屏幕上的位置坐标是0,0  
  9.         canvas.drawBitmap(bmp, 0, 0, null);  
  10.         // 定义矩阵对象  
  11.         Matrix matrix = new Matrix();  
  12.         float[] values ={0f,1f,0.0f,1f,0f,0.0f,0.0f,0.0f,1.0f};  
  13.         matrix.setValues(values);  
  14.         System.out.println("matrix:" + matrix.toString());  
  15.         Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),  
  16.                 matrix, true);  
  17.         canvas.drawBitmap(dstbmp, bmp.getWidth(), bmp.getHeight(), null);  


 

5 关于y = -x对称

[java]  view plain copy
 
  1. // 获取资源文件的引用res  
  2.         Resources res = getResources();  
  3.         // 获取图形资源文件  
  4.         Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.v);  
  5.         // 设置canvas画布背景为白色  
  6.         canvas.drawColor(Color.BLACK);  
  7.         // 在画布上绘制缩放之前的位图,以做对比  
  8.         //屏幕上的位置坐标是0,0  
  9.         canvas.drawBitmap(bmp, bmp.getHeight(), 0, null);  
  10.         // 定义矩阵对象  
  11.         Matrix matrix = new Matrix();  
  12.         float[] values ={0f,-1f,0.0f,-1f,0f,0.0f,0.0f,0.0f,1.0f};  
  13.         matrix.setValues(values);  
  14.         System.out.println("matrix:" + matrix.toString());  
  15.         Bitmap dstbmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),  
  16.                 matrix, true);  
  17.         canvas.drawBitmap(dstbmp, 0, bmp.getHeight(), null);  


`cuda <<< >>>` 是 CUDA API 中的一个函数,用于在 GPU 上并行地执行计算任务。CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算架构,它允许开发者利用 GPU 的强大并行处理能力来进行高性能计算。 ### `cuda <<< >>>` 函数的基本用法: ```c++ int cudaCall( const char * routineName, void ** arguments ); ``` 在这个函数中,`routineName` 是你要执行的内核函数的名称,并作为字符串传递。`arguments` 是函数需要的参数列表,这可以是一个数组或结构体。 这个函数的主要作用是在 CUDA 程序中启动 GPU 内核执行,并指定块(block)和网格(grid)的数量。块和网格的概念是 CUDA 并行化模型的核心部分,它们决定了如何将数据分配到 GPU 计算资源上以及如何组织计算任务。 #### 参数解释: - **block size** (`blockDim`):每个块包含多少线程。通常表示为 (x, y, z),其中 x、y 和 z 分别代表在 x 轴、y 轴和 z 轴方向的线程数。 - **grid size** (`gridDim`):由多少个块组成网格。同样可以用 (x, y, z) 来表示,意味着有多少个这样的块在各个轴向分布。 例如,如果你想在一个单精度浮点矩阵乘法的 GPU 实现中,启动两个有 512 个线程的块,分布在四个网格上,你可以这样调用 `cuda <<< >>>`: ```cpp void* matrixA = ...; // 指针指向矩阵 A 的内存位置 void* matrixB = ...; // 指针指向矩阵 B 的内存位置 void* result = ...; // 结果矩阵的指针 int block_dim_x = 512; int grid_dim_x = 4; cudaCall("matrix_multiplication", &matrixA, &matrixB, &result, block_dim_x, block_dim_x, 1, grid_dim_x, 1, 1); ``` 在这个例子中,“matrix_multiplication”是你的内核函数名,`&matrixA`, `&matrixB`, 和 `&result` 是传递给内核的数据指针,而 `block_dim_x` 和 `grid_dim_x` 则分别代表了块尺寸和网格尺寸。 ### `cuda <<< >>>` 的注意事项: 1. **错误检查**:在实际应用中,应该总是对返回值进行检查,确保函数调用成功。 2. **性能优化**:合理选择块大小和网格大小对于性能至关重要。过大或过小都可能导致性能下降。 3. **内存管理**:注意避免不必要的内存复制操作,因为这可能会导致较高的延迟。 通过这种方式,在 C++ 或其他支持 CUDA 的语言中,你可以有效地利用 GPU 的并行处理能力来加速计算密集型任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值