gpt4 book ai didi

c++ - 如何仅使用数学来旋转 16x16 位图数组的内容(无缩放,只需剪掉角)

转载 作者:太空狗 更新时间:2023-10-29 21:18:36 24 4
gpt4 key购买 nike

另一个关于位图的问题!快速介绍一下:我正在做一个大学项目,我没有外部库,只有基本的 windows/c++,这个位图旋转必须完全通过简单地修改数组中的像素来完成。

我有一个 16x16 位图(它只是一个 16x16 元素长的 COLORREF 数组),我想围绕中心点(或实际上的任何点)旋转它。

我有一些几乎有效的代码,它将它围绕左上角旋转,所以我知道我很接近,我只是不知道要编辑什么以将其偏移 8 像素因为我能想到的所有结果都会溢出 16x16 区域。

这是我目前拥有的代码(我从 DrDobbs 抓取并稍微修改了它,它有一个我不需要的缩放参数((1.0) 部分))。

void Sprite::DrawAt(Render* render, int x, int y, double angle)
{
COLORREF* tmp = new COLORREF[width * height];
int u, v;

for (int i = 0; i<height; i++)
{
for (int j = 0; j<width; j++)
{
u = cos(-angle) * j * (1.0) + sin(-angle) * i * (1.0);
v = -sin(-angle) * j * (1.0) + cos(-angle) * i * (1.0);
tmp[(i * width) + j] = bitmap[(v * width) + u];
}
}

// x-(width/2) renders it at the centre point instead of the top-left
render->BlockShiftBitmap(tmp, x - (width/2), y - (height/2), width, height, -1);

delete[] tmp;
}

(请原谅这里的一些不良编码习惯,我只对手头的主题感兴趣,其他一切都会在下次清理)。

该代码的结果是:

http://puu.sh/hp4nB/8279cd83dd.gif http://puu.sh/hp4nB/8279cd83dd.gif

它绕着左上角旋转,它也抓取越界内存。我可以使用围绕中心旋转的解决方案(或任何点,稍后会派上用场,例如门!)并且还可以剪掉角落并确保不会在生成的位图中出现随机的内存位。

结果应该希望看起来像这样,黑色像素变成白色:

http://puu.sh/hp4uc/594dca91da.gif http://puu.sh/hp4uc/594dca91da.gif

(不要问那个生物到底是什么东西!他是某种红耳调试蜥蜴)

谢谢,你们这些很棒的人对我的这个小项目帮助很大!

最佳答案

你能试着从 i 和 j 中减去 8

u = cos(-angle) * (j-8) * (1.0) + sin(-angle) * (i-8) * (1.0);
v = -sin(-angle) * (j-8) * (1.0) + cos(-angle) * (i-8) * (1.0);

关于c++ - 如何仅使用数学来旋转 16x16 位图数组的内容(无缩放,只需剪掉角),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29846652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com