C++ 尝试使用旋转矩阵,但失败

C++ 尝试使用旋转矩阵,但失败,c++,arrays,image,math,rotation,C++,Arrays,Image,Math,Rotation,我一直在尝试使用旋转矩阵来旋转图像。下面是我一直在使用的代码。我已经试着这么做了好几天了,每次似乎都有什么不对劲,但我看不出我做错了什么。例如,我的图像变得倾斜,而不是旋转 下面的代码分为两部分:实际旋转和向上移动图片以使其显示在正确的位置。需要将其所有点都保持在0以上才能正确保存。它将包含位置信息x、y和颜色信息r、g、b的像素阵列作为输入,图像仅用于获取其像素计数,也称为阵列大小和宽度,以及旋转的弧度值 负责旋转的部分本身是线条上方的部分,而线条下方的部分负责计算图像中的最低点,并将所有像素

我一直在尝试使用旋转矩阵来旋转图像。下面是我一直在使用的代码。我已经试着这么做了好几天了,每次似乎都有什么不对劲,但我看不出我做错了什么。例如,我的图像变得倾斜,而不是旋转

下面的代码分为两部分:实际旋转和向上移动图片以使其显示在正确的位置。需要将其所有点都保持在0以上才能正确保存。它将包含位置信息x、y和颜色信息r、g、b的像素阵列作为输入,图像仅用于获取其像素计数,也称为阵列大小和宽度,以及旋转的弧度值

负责旋转的部分本身是线条上方的部分,而线条下方的部分负责计算图像中的最低点,并将所有像素向上或向右移动,因此all fit I仍然需要实现一个功能,在图像旋转45度或类似角度时更改图像大小

void Rotate( Pixel *p_pixelsToRotate, prg::Image* img, float rad )
{
    int imgLength = img->getPixelCount();
    int width = img->getWidth();

    int x { 0 }, y { 0 };

    for( int i = 0; i < imgLength; i++ )
    {   
        x = p_pixelsToRotate[i].x;
        y = p_pixelsToRotate[i].y;

        p_pixelsToRotate[i].x = round( cos( rad ) * x - sin( rad ) * y );   
        p_pixelsToRotate[i].y = round( sin( rad ) * x + sin( rad ) * y );
    }

===========================================================================

    Pixel* P1 = &p_pixelsToRotate[ width - 1 ];     // Definitions of these are in the supporting docs
    Pixel* P3 = &p_pixelsToRotate[ imgLength - 1 ];

    int xDiff = 0;
    int yDiff = 0;  

    if( P1->x < 0 || P3->x < 0 )
    {
        (( P1->x < P3->x )) ? ( xDiff = abs( P1->x )) : ( xDiff = abs( P3->x ));
    }

    if( P1->y < 0 || P3->y < 0 )
    {
        (( P1->y < P3->y )) ? ( yDiff = abs( P1->y )) : ( yDiff = abs( P3->y ));
    }

    for( int i = 0; i < imgLength; i++ )
    {
        p_pixelsToRotate[i].x += xDiff;
        p_pixelsToRotate[i].y += yDiff;
    }
}

我更愿意自己解决这个问题,但已经一个多星期没能解决了。我不明白为什么函数不旋转输入像素阵列的位置信息。如果有人能看一看,也许能找出我的逻辑不起作用的原因,我将不胜感激。谢谢。

您似乎在旋转矩阵本身中犯了一个错误:

p_pixelsToRotate[i].y = round( sin( rad ) * x + sin( rad ) * y );
                                                ^^^---------------change to cos

首先,这是一个错误:

    p_pixelsToRotate[i].x = round( cos( rad ) * x - sin( rad ) * y );   
    p_pixelsToRotate[i].y = round( sin( rad ) * x + >>>sin<<<( rad ) * y );
其中X和Y明确存储了像素坐标。若要使用反向采样,请考虑将相同的方程在两侧乘以R的倒数

R^(-1) Y = X 
坐标是隐式的。也就是说,为了产生Y[j][i],用逆R^-1变换j,i以获得x图像中的坐标x,Y。使用此选项对X中最近的像素X[roundx][roundy]进行采样,并将其指定为Y[j][i]

实际上,比起简单的取整,更复杂的算法将在X,y周围取X像素的加权平均值,以获得更平滑的结果。如何选择权重是一个很大的附加主题

完成这项工作后,您可以再前进一步。一些代数将显示,可以更新之前的采样坐标,以获得右或左、上或下相邻的采样坐标,而不是对每个像素执行完整的矩阵向量乘法,只需进行几次加法。这大大加快了速度

旋转的倒数很容易计算!只是抵消旋转角度

最后一点要注意的是,你使用的三元运算符是o?o:o选择作业真是糟糕透顶的风格。与此相反:

(( P1->x < P3->x )) ? ( xDiff = abs( P1->x )) : ( xDiff = abs( P3->x ));


你是否考虑过使用QT?它是跨平台的,在许多其他的东西中有这样的东西…你是想绕着点0,0旋转吗?顺便说一句,我可以理解Qt并非在所有情况下都适用。您可能希望查看此链接以更广泛地介绍这些类型的转换
(( P1->x < P3->x )) ? ( xDiff = abs( P1->x )) : ( xDiff = abs( P3->x ));
xDiff = ( P1->x < P3->x ) ? abs( P1->x ) : abs( P3->x );