旋转位图并将浮点格式的结果坐标转换回像素数组的整数 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]);
}
为输入数组的每个像素调用该函数。 cosLookup
和 sinLookup
是用于加速计算的查找表。红色方块的结果如下所示:
因此,旋转总体上是有效的,但有很多未写入像素的空闲点。为了找出问题所在,我调整了我的程序,如果一个像素被投影到已经有一个像素所在的坐标上,就用绿色和蓝色标记像素。结果如下所示:
我认为这是因为:
- 我的旋转矩阵的结果是浮点格式的像素坐标
- 我的输出数组中的目标坐标是整数
- 简单地应用
round()
会导致上面的问题:像素被写在相同的 x/y 坐标上两次或更多次,而我的输出数组中的其他坐标仍然为空
我的问题是:如何解决这个问题?我认为像 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)
我正在实现一个函数,该函数获取包含位图的输入像素数组,将位图旋转 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]);
}
为输入数组的每个像素调用该函数。 cosLookup
和 sinLookup
是用于加速计算的查找表。红色方块的结果如下所示:
因此,旋转总体上是有效的,但有很多未写入像素的空闲点。为了找出问题所在,我调整了我的程序,如果一个像素被投影到已经有一个像素所在的坐标上,就用绿色和蓝色标记像素。结果如下所示:
我认为这是因为:
- 我的旋转矩阵的结果是浮点格式的像素坐标
- 我的输出数组中的目标坐标是整数
- 简单地应用
round()
会导致上面的问题:像素被写在相同的 x/y 坐标上两次或更多次,而我的输出数组中的其他坐标仍然为空
我的问题是:如何解决这个问题?我认为像 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)