C++ (Qt)void RotateImage(const int angle, const rgbQuad & bmp[][], const int widget, const int height, rgbQuad * outRGB[]) { double rad = 180.0f * angle / 3.141592f; // или M_PI double rotateMat[2][2] = {cos(rad), -sin(rad), sin(rad), cos(rad)} // или QMatrix2x2, но думаю и так ясно; // вычисление размеров результирующего изображения (координаты 3х углов) int x1 = height * rotateMat[1][0]; // sin(rad) int y1 = height * rotateMat[0][0]; // cos(rad) int x2 = width * rotateMat[0][0] + height * rotateMat[1][0]; int y2 = height * rotateMat[1][1] + width * rotateMat[0][1]; int x3 = width * rotateMat[1][1]; int y3 = width * rotateMat[0][1]; int minX = min(0, min(x1, min(x2, x3))); int minY = min(0, min(y1, min(y2, y3))); int maxX = max(0, max(x1, max(x2 ,x3))); int maxY = max(0, max(y1, max(y2, y3))); int newWidth = maxX - minX; int newHeight = maxY - minY; // нужно чтоб размеры outRGB стали newWidth x newHeight и чем-то залить // что-то типа resize(outRGB, newWidth, newHeight), fill(outRGB, Qt::gray); // применяем матрицу поворота for(int y = 0; y < height; ++y) { for(int x = 0; x < height; ++x) { int tx = x * rotateMat[0][0] + y * rotateMat[0][1]; int ty = x * rotateMat[1][0] + y * rotateMat[1][1]; outRGB[tx][ty] = bmp[x][y]; } }}
void RotateImage (int angle) { double rad = 180*angle/3.1415; double rmtrx[2][2] = { {qcos(rad),(-1)*qsin(rad)}, {qsin(rad),qcos(rad} }; for (int x=0; x< ... ; x++) { newx = (altx)*rmtrx[0][0] + (alty)*rmtrx[0][1] + offsetX; newy = (altx)*rmtrx[1][0] + (alty)*rmtrx[1][1] + offsetY; }
C++ (Qt) // вычисление размеров результирующего изображения (координаты 3х углов) int x1 = height * rotateMat[1][0]; // sin(rad) int y1 = height * rotateMat[0][0]; // cos(rad) int x2 = width * rotateMat[0][0] + height * rotateMat[1][0]; int y2 = height * rotateMat[1][1] + width * rotateMat[0][1]; int x3 = width * rotateMat[1][1]; int y3 = width * rotateMat[0][1];
C++ (Qt) // применяем матрицу поворота for(int y = 0; y < height; ++y) { for(int x = 0; x < height; ++x) { int tx = x * rotateMat[0][0] + y * rotateMat[0][1]; int ty = x * rotateMat[1][0] + y * rotateMat[1][1]; outRGB[tx][ty] = bmp[x][y]; } }}