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