sin((M_PI/4)*(180.0/M_PI));
не является синусом "45 градусов". Это синус 45 радиан. То же самое о double cosx
Предложить double sinx = sin(45.0/180.0*M_PI);
Также рассмотрим lround()
против (int) round()
.
Кроме того, диапазон xRotate, yRotate
примерно в 2 раза больше, чем диапазон height, width
. При конвертации из double
.
код должен следить за переполнением целых чисел
Итерация в ответ на вопрос @ Крис Тернер с комментариями @ M Oehm
Ниже используется OP-подобный код, но с поворотом на -45 при отображении кода из inputImage
.
#defined SIND(a) (sin((a)/180.0 * M_PI)
#defined COSD(a) (cos((a)/180.0 * M_PI)
double sinx = SIND(-45); // -degrees
double cosx = COSD(-45);
xCenter = height; // Rotate image by its center.
yCenter = width;
for(x=0; x<height; x++) {
xt = x - xCenter;
double xt_cosx = xt*cosx;
double xt_sinx = xt*sinx;
for(y=0; y<width; y++) {
yt = y - yCenter;
long xRotate = lround(xt_cosx - (yt*sinx)) + xCenter;
long yRotate = lround((yt*cosx) + xt_sinx) + yCenter;
if( (xRotate >= 0) && (xRotate < height) && (yRotate >= 0) && (yRotate < width) ) {
rotatedImage[x][y] = inputImage[xRotate][yRotate];
} else {
rotatedImage[x][y] = Default_Pixel;
}
}
}