将C矩阵(指向指针的指针)除以t除以t的瓦片网格

时间:2019-03-24 11:11:10

标签: c

现在我有一个C矩阵网格[n] [n],将板看成完美地覆盖了at by t的图块网格(即t除以n,每个图块包含n / t x n / t个像元) :

例如,这是一个8 * 8的矩阵,由2 * 2的瓷砖网格覆盖,每个瓷砖具有4 * 4的元素:

样本矩阵:

enter image description here

这是一个16 * 16的矩阵,由2 * 2的瓷砖网格覆盖,每个瓷砖都有8 * 8的元素:

样本矩阵2:

enter image description here

  int ** grid;
  grid0 = malloc(N * N * sizeof(int));
  grid = malloc(N * sizeof(int *));
  for (i = 0; i < N; i++)
     grid[i] = &grid0[i * N];

  for (i = 0; i < N; i++)
     for (j = 0; j < N; j++)
        grid[i][j] = 0;

现在,我想分别获取每个图块,例如位置[0] [0]上的图块。但是我不知道如何编写计算部分。我看到了类似的问题,但结果存储在一维数组中,

1 个答案:

答案 0 :(得分:0)

首先,我将其简化。

注意:calloc的作用与malloc相同,但是它用0个字节填充了数组。

  int i;
  int** grid;

  grid = (int**) calloc(N, sizeof(int *));
  for (i = 0; i < N; i++)
     grid[i] = (int*) calloc(N, sizeof(int));

然后,由于磁贴是虚拟的,因此您无法生成新矩阵,只能使用由您控制的索引在其中移动。 要获取任何图块的坐标,我将编写如下函数:

void get_tile(int index_x, int index_y, int tile_dim, int matrix_dim, int* base_x, int* base_y){

  if(tile_dim == 0)
    return;

  int new_dim = matrix_dim / tile_dim;

  *base_x = index_x * new_dim ;
  *base_y = index_y * new_dim ;

}

因此,在base_xbase_y中,该函数将返回新的基本坐标,您将不得不使用该新的基本坐标在图块中移动。

请记住,新的基本坐标将以dim = old_dim / tile_dim;驻留在新矩阵中。