C 旋转实体对象会在目标内部生成空白点

C 旋转实体对象会在目标内部生成空白点,c,math,rotation,2d,C,Math,Rotation,2d,我使用标准公式旋转带有轴点的实心(填充)矩形/对象。 该映像是一个开/关字节数组 const uint8_t *srcBuf; color_t *dstBuf[]; double angle = 25.0; double roCos = cos(angle); double roSin = sin(angle); int16_t src_val; for(int y = 0; y < src_h; y++) { for(int x = 0; x < src_w ; x+

我使用标准公式旋转带有轴点的实心(填充)矩形/对象。 该映像是一个开/关字节数组

const uint8_t *srcBuf;
color_t *dstBuf[];
double angle = 25.0;
double roCos = cos(angle);
double roSin = sin(angle);

int16_t src_val;

for(int y = 0; y < src_h; y++) {

    for(int x = 0; x < src_w ; x++) {

        src_val = srcBuf[y * src_w + x];
        if (src_val == 0) { continue; }

        deltaX = (double)(x - src_piv_x);
        deltaY = (double)(y - src_piv_y);

        xp = (int16_t)(deltaX * roCos - deltaY * roSin);
        yp = (int16_t)(deltaX * roSin + deltaY * roCos);

        xp += pivot_x;
        yp += pivot_y;
        if (xp >= 0 && xp < dst_w && yp >= 0 && yp <= dst_h) {
            dstBuf[yp * dst_w + xp] = color ;
        }
    }
}
const uint8_t*srcBuf;
颜色_t*dstBuf[];
双角度=25.0;
双roCos=cos(角度);
双松香=sin(角);
int16_t src_val;
对于(int y=0;y如果(xp>=0&&xp=0&&yp要避免旋转后图像中出现孔洞,必须循环通过目标像素(而不是源像素)。这(使用最近邻)适用于具有以下特征的图像:

source resolution <= destination resolution
可能会出现混叠(如果设置动画,则会通过旋转来强调)。有几种方法可以处理混叠:

使用双线性滤波可以进行1/2的缩放

使用双三次过滤可以进行1/4缩放

对于更高的收缩,常用的方法是使用Mip贴图(使用每4个像素的平均值将图像收缩因子2,直到分辨率接近目标像素)

所有3种方法都将提供抗锯齿(混合不完全适合像素的边缘),因此如果您在大LED上观看,并且能够调节其强度(不仅是BW,还有灰度或颜色),那么它们将提供更好的图像质量(更好地被人感知)

相关QA:

  • …与最近邻的旋转
  • …带双线性滤波的旋转
  • …双三次插值示例

该问题是由于旋转后的像素坐标不再与像素网格对齐。您可以通过在目标坐标而不是源坐标上迭代x和y来解决此问题。在每个点上,选择距离变换后的目标坐标最近的源像素(如果存在)。显然,您需要在大范围内扫描(将高度和宽度乘以√2)。或者,尝试使用Alan Paeth提出的三切变方法,不管怎样,该方法应该运行得更快。是否有明确的说明/公式?尝试搜索
Paeth旋转c源
,或者。谢谢@Spektre。这是一个更简单的答案,因为我的几何体是简单的图像。但生成的图像将具有不同的维度和链接答案假设结果图像与输入图像相同。我应该计算结果图像并循环通过它吗?谢谢@r3mainer。我找到了具有3-shear方法的FreeImage库,已经开始为“C”自定义它,直到(Spektre)发布他的。谢谢@Spektre。
source resolution > destination resolution