Ethan Mark
Ethan Mark

Reputation: 309

Logical flaw in CS50 Problem Set 4 - Filter (Edges)?

I am having some issues fulfilling the requirements for the edges filter in Problem Set 4 of CS50. A description of the problem can be found here: https://cs50.harvard.edu/x/2020/psets/4/filter/more/. My code makes sense to me, so hopefully someone can shed some light on this for me, as I have been staring at my code for days on end now ): To be clear, my code does compile, so I do not think there are any bugs per se, but probably a logical flaw in my thinking.

My code is as follows:

void edges(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE tempimage[height][width];
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            tempimage[i][j] = image[i][j];
            int sGxRed = 0;
            int sGxGreen = 0;
            int sGxBlue = 0;
            int sGyRed = 0;
            int sGyGreen = 0;
            int sGyBlue = 0;
            if (j + 1 < width)
            {
                sGxRed += 2 * image[i][j + 1].rgbtRed;
                sGxGreen += 2 * image[i][j + 1].rgbtGreen;
                sGxBlue += 2 * image[i][j + 1].rgbtBlue;
            }
            if (j > 0)
            {
                sGxRed += -2 * image[i][j - 1].rgbtRed;
                sGxGreen += -2 * image[i][j - 1].rgbtGreen;
                sGxBlue += -2 * image[i][j - 1].rgbtBlue;
            }
            if (i + 1 < height)
            {
                sGyRed += 2 * image[i + 1][j].rgbtRed;
                sGyGreen += 2 * image[i + 1][j].rgbtGreen;
                sGyBlue += 2 * image[i + 1][j].rgbtBlue;
            }
            if (i > 0)
            {
                sGyRed += -2 * image[i - 1][j].rgbtRed;
                sGyGreen += -2 * image[i - 1][j].rgbtGreen;
                sGyBlue += -2 * image[i - 1][j].rgbtBlue;
            }
            if (i + 1 < height && j + 1 < width)
            {
                sGxRed += image[i + 1][j + 1].rgbtRed;
                sGxGreen += image[i + 1][j + 1].rgbtGreen;
                sGxBlue += image[i + 1][j + 1].rgbtBlue;
                sGyRed += image[i + 1][j + 1].rgbtRed;
                sGyGreen += image[i + 1][j + 1].rgbtGreen;
                sGyBlue += image[i + 1][j + 1].rgbtBlue;
            }
            if (i > 0 && j + 1 < width)
            {
                sGxRed += image[i - 1][j + 1].rgbtRed;
                sGxGreen += image[i - 1][j + 1].rgbtGreen;
                sGxBlue += image[i - 1][j + 1].rgbtBlue;
                sGyRed += -1 * image[i - 1][j + 1].rgbtRed;
                sGyGreen += -1 * image[i - 1][j + 1].rgbtGreen;
                sGyBlue += -1 * image[i - 1][j + 1].rgbtBlue;
            }
            if (i > 0 && j > 0)
            {
                sGxRed += -1 * image[i - 1][j - 1].rgbtRed;
                sGxGreen += -1 * image[i - 1][j - 1].rgbtGreen;
                sGxBlue += -1 * image[i - 1][j - 1].rgbtBlue;
                sGyRed += -1 * image[i - 1][j - 1].rgbtRed;
                sGyGreen += -1 * image[i - 1][j - 1].rgbtGreen;
                sGyBlue += -1 * image[i - 1][j - 1].rgbtBlue;
            }
            if (i + 1 < height && j > 0)
            {
                sGxRed += -1 * image[i + 1][j - 1].rgbtRed;
                sGxGreen += -1 * image[i + 1][j - 1].rgbtGreen;
                sGxBlue += -1 * image[i + 1][j - 1].rgbtBlue;
                sGyRed += image[i + 1][j - 1].rgbtRed;
                sGyGreen += image[i + 1][j - 1].rgbtGreen;
                sGyBlue += image[i + 1][j - 1].rgbtBlue;
            }
            int sRed = 0;
            int sGreen = 0;
            int sBlue = 0;
            sRed = round((float)(sqrt(sGxRed^2 + sGyRed^2)));
            if (sRed > 255)
            {
                sRed = 255;
            }
            sGreen = round((float)(sqrt(sGxGreen^2 + sGyGreen^2)));
            if (sGreen > 255)
            {
                sGreen = 255;
            }
            sBlue = round((float)(sqrt(sGxBlue^2 + sGyBlue^2)));
            if (sBlue > 255)
            {
                sBlue = 255;
            }
            tempimage[i][j].rgbtRed = sRed;
            tempimage[i][j].rgbtGreen = sGreen;
            tempimage[i][j].rgbtBlue = sBlue;
        }
    }
    for(int i = 0; i < height; i++)
    {
        for(int j = 0; j < width; j++)
        {
            image[i][j].rgbtRed = tempimage[i][j].rgbtRed;
            image[i][j].rgbtGreen = tempimage[i][j].rgbtGreen;
            image[i][j].rgbtBlue = tempimage[i][j].rgbtBlue;
        }
    }
    return;
}

I am very new to coding. Prior to taking this course, I have only tried my hand at a little VBA. This is my first time coding in C and the learning curve for CS50 is steep, so pardon me if my question is trivial!

Thank you all in advance! :)

P.S Apart from my actual question, please feel free to comment on how my code can be more efficient/shortened as well. I am always open to different points of view!

Upvotes: 0

Views: 146

Answers (1)

Lundin
Lundin

Reputation: 214920

Common misunderstanding: ^ does not mean power-of, it means bit-wise XOR, which is not what you want here. Replace it with pow() from math.h.

Or in case of power of 2 specifically, simply do variable * variable.

Upvotes: 1

Related Questions