gpt4 book ai didi

c - 消除c中图像旋转的舍入误差

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:45 24 4
gpt4 key购买 nike

长期潜伏者...第一次提问...

我有一个例程,它获取存储在数组 {x, y, colour} 中的图像并旋转它。如果旋转角度不是 90 的倍数,则存在使像素为空的舍入误差。有没有人有更好的旋转解决方案,或者有办法捕捉错位的像素?

void 
PlaceGraphicRot(unsigned int graphic[][3], int xcent, int ycent, int intangle) {
int i = 0;
double xorig, yorig, xdraw, ydraw;
double rotangle = (3.14159265358979323846 * intangle) / 180; // convert provided integer angle to radians
do {
xorig = graphic[i][0];
yorig = graphic[i][1];
xdraw = (cos(rotangle) * (xorig - xcent) - sin(rotangle) * (yorig - ycent) + xcent);
ydraw = (sin(rotangle) * (xorig - xcent) + cos(rotangle) * (yorig - ycent) + ycent);
//place pixel
TFT_DrawPixel(round(xdraw), round(ydraw), RGBDown(graphic[i][2]));
i++;
} while (graphic[i][0] != 999); //delimiter to indicate end of image
}

非常感谢...罗布

最佳答案

避免有效像素之间存在间隙的方法是向后工作。与其获取源图像中的每个像素并通过将像素旋转到新位置将其移动到目标图像中的位置,不如迭代目标图像中的每个像素并找出它对应于源图像中的哪个像素.

为此,您只需遍历目标图像中的每个像素 (xdraw,ydraw) 并应用反向 旋转以获得相应的像素 (xorig,yorig) 在源图像中。

幸运的是,旋转矩阵的逆非常简单:它只是矩阵的转置。因此,对您的计算的唯一改变是改变两个方程中 sin(rotangle) 的符号(当然,将 *orig 替换为 *draw):

xorig = ( cos(rotangle) * (xdraw - xcent) + sin(rotangle) * (ydraw - ycent) + xcent);
yorig = (-sin(rotangle) * (xdraw - xcent) + cos(rotangle) * (ydraw - ycent) + ycent);
^---- sign changes here ---------^

从那里开始,假设 (xorig,yorig) 在原始图像的范围内,您可以获取最近的像素,或从邻居中插入值。

如果像素超出范围,您需要决定要做什么。除非您裁剪目标图像(或者您的图像是方形的并且您只旋转了 90° 倍数),否则拐角处总会有一些缺失的像素。您可以将像素设为黑色或白色,或任何适合您的应用的颜色。

关于c - 消除c中图像旋转的舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com