假设我有一个基于2d数组坐标的图像,如下所示:
{
{ ' ', ' ', ' ', ' ' },
{ ' ', ' ', 'x', ' ' },
{ ' ', 'x', ' ', ' ' },
{ ' ', 'x', 'x', ' ' }
};
想将它裁剪成更小的数组:
{
{ ' ', 'x' },
{ 'x', ' ' },
{ 'x', 'x' }
};
我该怎么做?有什么想法吗?
答案 0 :(得分:1)
迭代一次数组。
在迭代时,找到left
列(x
第一次出现的列)和最right
列(x
上次出现的列) )。两行相同:一行top
,一行bottom
。这4行为您的图像提供了界限。
left right
{ ' ', ' ', ' ', ' ' },
top { ' ', ' ', 'x', ' ' },
{ ' ', 'x', ' ', ' ' },
bottom { ' ', 'x', 'x', ' ' }
伪代码:
int left = INT_MAX, right = -1, top = INT_MAX, bottom = -1
for (int y = 0; y < Y; y++)
for (int x = 0; x < X; x++)
if (t[x][y] == 'x')
{
if (left > x) left = x
if (right < x) right = x
if (top > y) top = y
bottom = y // we don't need if! :)
}
根据您的输入示例,它将生成此类索引:
left == 1
right == 2
top == 1
bottom == 3
使用包含该边界的子矩阵将给出您的示例性输出图像。