我一直在做CS50,现在正在做Filter。但是,我在使用 Edges 的 4x4 测试用例时遇到了问题。我已经成功完成了所有其他测试用例,但只有 4x4 不起作用。
以下是该计划信息的链接:https://cs50.harvard.edu/x/2023/psets/4/filter/more/
我的代码相当混乱,但我遇到的主要问题是为什么它适用于 3x3,但不适用于 4x4?
可能是因为它检测像素是否超过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;
}
我尝试多次检查代码,将其写下来并检查逻辑。我觉得还可以。但显然,我可能搞砸了一些东西。
在对您链接到的代码感到困惑之后,这似乎是处理任务的一种有趣的方式......
您已经使用
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 );
}