C语言 反射无过滤器CS50



目前,我正在做pset4无过滤器,反映和挣扎与我写的代码。它编译得很好,但是输出图片看起来与输入图片完全一样。我试图首先将反射图像存储在临时数组中,并将其传输到图像数组。我找不到任何做过类似尝试的人。这是我到目前为止所写的。

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i;                              //row
int j;                              //column for img
int z;                              //column of tmp img
RGBTRIPLE tmpi[height][width];      //tmp img
for (i = 0; i < height; i++)
{
for (j = 0, z = width; j > z; j++, z--)
{
image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
image[i][j].rgbtBlue = tmpi[i][z].rgbtBlue;
image[i][j].rgbtGreen = tmpi[i][z].rgbtGreen;
}
}
for (i = 0; i < height; i ++)
{
for (j = 0; j < width; j++)
{
tmpi[i][j].rgbtRed = image[i][j].rgbtRed;
tmpi[i][j].rgbtBlue = image[i][j].rgbtBlue;
tmpi[i][j].rgbtGreen = image[i][j].rgbtGreen;
}
}
return;
}

你能帮帮我吗?

你有两个错误:

  1. 首先复制未初始化的内存。
for (i = 0; i < height; i++)
{
for (j = 0, z = width; j > z; j++, z--)
{
image[i][j].rgbtRed = tmpi[i][z].rgbtRed;

数组tmpi包含不确定的值,因为您从未对其赋值。

您首先需要将数组复制到tmpi,然后才能将其复制回来。

  1. 你的循环限制是错误的:
for (j = 0, z = width; j > z; j++, z--)
{
image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
...
  • 这里z只能上升到width-1
  • j>z条件错误。这永远不会是真的。
  • 正确的条件是j<width
  • 不是错误,但你并不需要z。使用width-j-1
  • 也不是错误,但不需要复制结构体的每个成员。你可以一次赋值整个结构体。

一个固定的版本看起来像这样:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i;                              //row
int j;                              //column for img
RGBTRIPLE tmpi[height][width];      //tmp img
for (i = 0; i < height; i ++)
{
for (j = 0; j < width; j++)
{
tmpi[i][j] = image[i][j];
}
}

for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
image[i][j] = tmpi[i][width - j - 1];
}
}
return;
}

或者你甚至可以组合外部循环:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i;                              //row
int j;                              //column for img
RGBTRIPLE tmpi[height][width];      //tmp img
for (i = 0; i < height; i ++)
{
for (j = 0; j < width; j++)
{
tmpi[i][j] = image[i][j];
}
for (j = 0; j < width; j++)
{
image[i][j] = tmpi[i][width - j - 1];
}
}
return;
}

或者你可以在适当的地方交换值:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i;                              //row
int j;                              //column for img
for (i = 0; i < height; i ++)
{
for (j = 0; j < width / 2; j++)
{
RGBTRIPLE temp = image[i][j];
image[i][j] = image[i][width - j - 1];
image[i][width - j - 1] = temp;
}
}
return;
}

可以自由地考虑更多的优化,一旦它正常工作。

您正在重新初始化颜色字节,而我们需要在这里交换出像素,我建议首先创建一个这样的交换函数:

void swap (RGBTRIPLE *a, RGBTRIPLE *b)
{
RGBTRIPLE temp = *a;
*a = *b;
*b = temp;
}

然后交换像素,当我们交换到一半时确保为width/2运行j

下面的代码供您参考:

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
int k = width - 1;
for (int j = 0; j < width/2; j++)
{
swap(&image[i][j], &image[i][k]);
k--;
}
}
return;
}

相关内容

  • 没有找到相关文章

最新更新