简单的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;
}
本文地址:http://com.8s8s.com/it/it27277.htm