[技術討論] 點樣 rotate 1 個 2D array?

喺 Google search 到嗰啲,
都係 3x3, 4x4, 5x5 ... 方陣。

我想 Rotate 一個 X*Y 嘅 array 真係搵唔到。

如果array唔係方形, 基本上唯有開新array再deep copy
連dimension都唔同

p.s. Matlab一粒character (')就做到以上既野

TOP

本帖最後由 ghostkcleung 於 2021-7-4 16:05 編輯

開多一個嘅話,唔夠 memory。

我個 2d array 係用一條 1d array 去 store。

int w = width;
void set ( int x, int y, int value ) {
  arr [ y*w+x ] = value ;
}

int get ( int x, int y ) {
  return arr[y*w+x];
}

不過我已經用咗其他方法解決。

如果array唔係方形, 基本上唯有開新array再deep copy
連dimension都唔同

p.s. Matlab一粒character  ...
KinChungE 發表於 2021-7-4 14:07

TOP

開多一個嘅話,唔夠 memory。

我個 2d array 係用一條 1d array 去 store。

int w = width;
void set ( i ...
ghostkcleung 發表於 2021-7-4 16:03


如果係咁的話, rotate應該唔好改任何data, 純綷加支boolean flag記住係咪rotate左
然後響set同get入面加個if

TOP

本帖最後由 ghostkcleung 於 2021-7-4 23:37 編輯

終於鬥惦咗。

// w: width, h:height,
//r: rotate ( 0 to 7 )
// rotate 0: CW0, 2: CW90, 4: CW180, 6: CW270
// rotate 1, 3, 5, 7 are mirror of 0, 2, 4, 6

for(int16_t y=0; y<=h; y++) {
        for(int16_t x=0; x<=w; x++) {
                switch ( r ) {
                case 0:
                        data[y*w+x]=value;
                        break;
                case 1:
                        data[(y+1)*w-x-1]=value;
                        break;
                case 2:
                        data[(x+1)*w-y-1]=value;
                        break;
                case 3:
                        data[(h-x)*w-y-1]=value;
                        break;
                case 4:
                        data[(h-y)*w-x-1]=value;
                        break;
                case 5:
                        data[(h-y-1)*w+x]=value;
                        break;
                case 6:
                        data[(h-1-x)*w+y]=value;
                        break;
                case 7:
                        data[x*w+y]=value;
                        break;
                }
        }
}

TOP

提示: 作者被禁止或刪除 內容自動屏蔽

TOP