简单的2维数组操作(90度,180/270度旋转,镜像,flip),希望有人提供更好/更快的方法。Use it at your own risk!
//By Onega
#include <iostream> #include <sstream> using namespace std; template<typename DT> void array_rotateL90(const DT* psrc,int h,int w,DT* dest) { //psrc[h][w] , dest[w][h] if(0==psrc || h<= 0 || w<=0 || 0==dest) return; int index = 0; int constant1 = (w-1)*h; for(int i = 0; i < h; i++) { int var = 0; for(int j = 0; j< w; j++) { //dest[ (w-1-j)*h +i] = psrc[index]; //dest[ (w-1)*h - j*h +i] = psrc[index]; dest[ constant1 - var +i] = psrc[index]; var += h; index++; } } }
template<typename DT> void array_rotateR90(const DT* psrc,int h,int w,DT* dest) { //psrc[h][w] , dest[w][h] if(0==psrc || h<= 0 || w<=0 || 0==dest) return; int var = 0; int constant1 = h - 1; for(int j=0;j<w;j++) { //var = j*h int var2 = 0; // i*w; for(int i=0;i<h ;i++) { //dest[var+constant1-i] = psrc[ i*w+j]; dest[var+constant1-i] = psrc[ var2+j]; var2 += w; } var += h; } } template<typename DT2> void array_rotate180(const DT2* psrc,int n,int m,DT2* dest) { //psrc[n][m] int constant1 = (m-1)*n + n-1; int var = 0;// i * n int index = 0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { // dest[(m-1-i)*n+n-1-j] = psrc[i*n+j]; dest[constant1 -j -var] = psrc[index]; index++; } var += n; //i*n } } template<typename DT> void print_array(const DT* psrc,int w,int h, const char* desc=0) { //this is for test/debug only, efficiency is not required. if(0==psrc || h<= 0 || w<=0 ) return; std::ostringstream oss; if(desc==0) oss<<"array"<<std::endl; else oss<<desc<<std::endl; for(int i=0;i<w;i++) { for(int j=0;j<h;j++) { oss<< psrc[i*h+j] <<" "; } oss<< char(0xd)<<char(0xa); } std::cout<<oss.str(); } template<typename DT> void array_flip(const DT* psrc,int w,int h, DT* dest) { if(0==psrc || h<= 0 || w<=0 || 0==dest) return; int offset = (w-1)*h; int row_start = 0; int offset2 = 0; for(int i=0;i<w;i++) { offset2 = offset - row_start;// (w-1)*h - i*h for(int j=0;j<h;j++) { //dest[ (w-1-i)*h+j] = psrc[i*h+j]; dest[ offset2 +j] = psrc[row_start +j]; } row_start += h; // i*h } } template<typename DT> void array_mirror(const DT* psrc,int w,int h, DT* dest) { if(0==psrc || h<= 0 || w<=0 || 0==dest) return; int h_1 = h - 1; int index = 0; for(int i=0;i<w;i++) { for(int j=0;j<h;j++) { dest[index+h_1-j-j] = psrc[index]; index ++; } } }
int main (int argc, char *argv[]) { cout<< " the program is used to test rotate, flip, mirror methods"<<std::endl; cout<< " I want to deal with large 2D array with above methods"<<std::endl; cout<< " source array may range from [128][128] to [2096][2096]"<<std::endl; cout<< " DT is expected to be byte, short, int, int64"<<std::endl; int test[3][2]; { for(int i=0;i<3;i++) for(int j=0;j<2;j++) test[i][j] = i*10+j+10; } print_array((int*)test[0],3,2,"original array "); int dest[2][3]; for(int i=0;i<2;i++) for(int j=0;j<3;j++) dest[i][j] = 0; array_rotateL90<int>(test[0],3,2,dest[0]); print_array((int*)dest[0],2,3,"after array_rotateL90");
int dest180[3][2]; //array_rotate180(test[0],3,2,dest180[0]); array_rotate180(test[0],3,2,dest180[0]); print_array((int*)dest180[0],3,2,"after array_rotate180"); cout<<"press any key to exit"<<std::endl; char c; cin>>c; return 0; } 
|