CS50 - 过滤器边缘 4x4 测试用例不起作用

问题描述 投票:0回答:1

我一直在做CS50,现在正在做Filter。但是,我在使用 Edges 的 4x4 测试用例时遇到了问题。我已经成功完成了所有其他测试用例,但只有 4x4 不起作用。

以下是该计划信息的链接:https://cs50.harvard.edu/x/2023/psets/4/filter/more/

我的代码相当混乱,但我遇到的主要问题是为什么它适用于 3x3,但不适用于 4x4?

https://pastebin.com/jXkmH9CH

可能是因为它检测像素是否超过255的方式? (这样做是为了停止收到说我无法发送这篇文章的错误消息)

for (int x = 0; x < height; x++)
    {
    for (int y = 0; y < width; y++)
        {
            if (temp_arrayred[x][y] > 255)
            {
                temp_arrayred[x][y] = 255;
            }
            else if (temp_arraygreen[x][y] > 255)
            {
                temp_arrayblue[x][y] = 255;
            }
            else if (temp_arrayblue[x][y] > 255)
            {
                temp_arrayblue[x][y] = 255;
            }

            image[x][y].rgbtRed = temp_arrayred[x][y];
            image[x][y].rgbtGreen = temp_arraygreen[x][y];
            image[x][y].rgbtBlue = temp_arrayblue[x][y];
        }
    }

    return;
}

我尝试多次检查代码,将其写下来并检查逻辑。我觉得还可以。但显然,我可能搞砸了一些东西。

c cs50
1个回答
0
投票

在对您链接到的代码感到困惑之后,这似乎是处理任务的一种有趣的方式......

您已经使用

if/else
梯子创建了 9 个独立的块,然后将代码放入每个块中以处理访问所有合法的相邻单元格...这是相当多的代码(并且非常容易出错!)我祝贺您因为我无法检测到您的代码中不正确的单元格引用。 (这表明问题可能是您帖子代码中的排他
if/else
梯子。)

然而,这确实提供了一个考虑以非典型方式解决此作业的机会。以下“未经测试”的代码是在键盘上花费一些时间的结果。我希望我没有把任何东西掉在地板上...... void edges(int height, int width, RGBTRIPLE image[height][width]) { RGBTRIPLE copy[height][width]; // second "canvas" to store results enum { gxUL = -1, gxUN = 0, gxUR = 1, // can be enum when handled this way gxNL = -2, gxNN = 0, gxNR = 2, gxDL = -1, gxDN = 0, gxDR = 1, }; enum { gyUL = -1, gyUN = -2, gyUR = -1, gyNL = 0, gyNN = 0, gyNR = 0, gyDL = 1, gyDN = 2, gyDR = 1, }; #define R rgbtRed // shorter names mean less to read and more obvious if wrong #define G rgbtGreen #define B rgbtBlue // Loop through all pixels, handling "self" and up to 8 "neighbours" for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { // 1: Self - easy... int gx = gxNN, gy = gyNN; RGBTRIPLE p = image[ i + 0 ][ j + 0 ]; int gxR = p.R * gx, gxG = p.G * gx, gxB = p.B * gx; int gyR = p.R * gy, gyG = p.G * gy, gyB = p.B * gy; // 2: Above - exclude top row if (i > 0) { gx = gxUN, gy = gyUN; p = image[ i - 1 ][ j + 0 ]; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 3: Below - exclude bottom row if (i < height - 1) { gx = gxDN, gy = gyDN; p = image[ i + 1 ][ j + 0 ]; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 4: To the Right - exclude right column if (j < width - 1) { p = image[ i + 0 ][ j + 1 ]; gx = gxNL, gy = gyNL; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 5: To the Left - exclude left column if (j > 0) { p = image[ i + 0 ][ j - 1 ]; gx = gxNR, gy = gyNR; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 6: Above Left - exclude top row and left margin if (i > 0 && j > 0) { p = image[ i - 1 ][ j - 1 ]; gx = gxUL, gy = gyUL; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 7: Above Right - exclude top row and right margin if (i > 0 && j != width - 1) { p = image[ i - 1 ][ j + 1 ]; gx = gxUR, gy = gyUR; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 8: Below Left: exclude bottom row and left margin if (i < height - 1 && j > 0) { p = image[ i + 1 ][ j - 1 ]; gx = gxDL, gy = gyDL; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } // 9: Below Right: exclude bottom row and right margin if (i < height - 1 && j < width - 1) { p = image[ i + 1 ][ j + 1 ]; gx = gxDR, gy = gyDR; gxR += p.R * gx; gxG += p.G * gx; gxB += p.B * gx; gyR += p.R * gy; gyG += p.G * gy; gyB += p.B * gy; } gxR = round( sqrt( gxR * gxR + gyR * gyR ) ); gxG = round( sqrt( gxG * gxG + gyG * gyG ) ); gxB = round( sqrt( gxB * gxB + gyB * gyB ) ); // Each colour is independent, not exclusive copy[x][y].R = (gxR > 255) 255 : gxR; copy[x][y].G = (gxG > 255) 255 : gxG; copy[x][y].B = (gxG > 255) 255 : gxB; } } memcpy( image, cpy, sizeof image ); }

© www.soinside.com 2019 - 2024. All rights reserved.