我正在实现一个函数,它获取包含位图的输入像素数组,将位图旋转50度,并将结果写入输出像素array.输出像素数组显示在屏幕上.我使用rotation matrix来将输入的每个像素转换为输出.
旋转像素的功能通过以下方式实现:
void rotatePixel(int x, int y, float *new_x, float *new_y)
{
float f_x, f_y;
UWORD i;
f_x = (float)x;
f_y = (float)y;
i = currentDegree / DEGREE_RESOLUTION - 1;
*new_x = (f_x * cosLookup[i] - f_y * sinLookup[i]);
*new_y = (f_x * sinLookup[i] + f_y * cosLookup[i]);
}
对输入数组的每个像素调用该函数.cosLookup
和sinLookup
是加快计算速度的查找表.红场的结果如下所示:
所以,旋转通常是有效的,但是有很多自由点没有写入像素.为了找出哪里出了问题,我调整了程序,用绿色和蓝色标记像素,如果一个像素投影在已经存在像素的坐标上.结果如下:
我想这是因为:
- 旋转矩阵的结果是浮点格式的像素坐标
- 输出数组中的目标坐标是整数
- 简单地应用
round()
会导致上面的问题:像素被写在同一个x/y坐标上两次或更多次,而我的输出数组中的其他坐标保持为空
我的问题是:我如何解决这个问题?我认为gimp、Photoshop等工具旋转对象时没有这个问题.我考虑过内部放大,以便能够将生成的像素更精确地写入目标.或者应用一个过滤器来平滑变换后的结果?