旋转位图并将浮点格式的结果坐标转换回像素数组的整数 x,y 值

Rotating a bitmap and transform the resulting coordinates in float format back to integer x,y values for pixel array

我正在实现一个函数,该函数获取包含位图的输入像素数组,将位图旋转 50 度并将结果写入输出像素数组。输出像素阵列显示在屏幕上。我正在使用 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]);
}

为输入数组的每个像素调用该函数。 cosLookupsinLookup 是用于加速计算的查找表。红色方块的结果如下所示:

因此,旋转总体上是有效的,但有很多未写入像素的空闲点。为了找出问题所在,我调整了我的程序,如果一个像素被投影到已经有一个像素所在的坐标上,就用绿色和蓝色标记像素。结果如下所示:

我认为这是因为:

我的问题是:如何解决这个问题?我认为像 gimp、Photoshop 等工具旋转对象没有这个问题。我考虑过内部升级,以便能够将生成的像素更精确地写入目的地。或者也许应用一个过滤器来平滑转换后的结果?

如果反转旋转并向后计算怎么办

new_x, new_x -> old_x, old_y

这将解决舍入错误。

for new_pixel_coordinates:
    old_pixel_coordinates = inverse_rotate(new_pixel_coordinates)
    color = lookup_color(old_bitmap, old_pixel_coordinates)
    color_new_picture(new_bitmap, new_pixel_coordinates, color)