我正在实现一个函数,它获取包含位图的输入像素数组,将位图旋转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]);
}

对输入数组的每个像素调用该函数.cosLookupsinLookup是加快计算速度的查找表.红场的结果如下所示:

enter image description here

所以,旋转通常是有效的,但是有很多自由点没有写入像素.为了找出哪里出了问题,我调整了程序,用绿色和蓝色标记像素,如果一个像素投影在已经存在像素的坐标上.结果如下:

enter image description here

我想这是因为:

  • 旋转矩阵的结果是浮点格式的像素坐标
  • 输出数组中的目标坐标是整数
  • 简单地应用round()会导致上面的问题:像素被写在同一个x/y坐标上两次或更多次,而我的输出数组中的其他坐标保持为空

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

推荐答案

如果你反转旋转并向后计算呢

新的x,新的x->;老x老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)

C++相关问答推荐

Mbed TLS:OAEP的就地en—/decryption似乎不起作用'

为什么下面的递归基本情况在C中不起作用?

什么C代码将确定打开的套接字正在使用的网络适配器?

手动矢量化性能差异较大

*p[num]和(*p)num的区别

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

减法运算结果的平方的最快方法?

变量>;-1如何在C中准确求值?

如果我释放其他内容,返回值就会出错

在C中将通用字符名称转换为UTF-8

在传统操作系统上可以在虚拟0x0写入吗?

进程已完成,退出代码为138 Clion

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

插座打开MacOS组件

仅从限制指针参数声明推断非混叠

如何修复我的qsort()算法?它每次都给出不同的结果

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

Clang 是否为内联汇编生成了错误的代码?