简单的2维数组操作

类别:编程语言 点击:0 评论:0 推荐:

简单的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