旋转固体物体在目标内部产生空白点

rotating solid object produces blank dots inside destination

我使用标准公式旋转带有轴心点的实体(填充)rectangle/object。 该图像是一个 on/off 字节数组。

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 ;
        }
    }
}

图片旋转正确。但是,我在旋转的 rectangle/object 中得到了空白点(常规图案)。 我认为这些未填充的点是因为由于 rounding/precision.

等式不会在目的地生成地图 1:1

是否有克服此限制的建议?

谢谢

为避免图像在旋转后出现空洞,您必须遍历目标像素(而不是源像素)。这(使用 最近邻 )适用于具有以下特征的图像:

source resolution <= destination resolution

缩水情况:

source resolution > destination resolution

可能会出现锯齿(如果设置动画会通过旋转来强调)。有一些方法可以处理它们:

使用双线性过滤 可以放大到 1/2

使用双三次过滤 可以放大到 1/4

对于更高的缩小,常见的方法是使用 Mip-maps(使用每 4 个像素的平均值将图像缩小 2 倍,直到分辨率接近目标像素)。

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

相关问答:

  • Rotating a square TBitmap on its center ...最近邻旋转
  • ...双线性过滤旋转
  • ...双三次插值示例