Reputation: 309
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
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