我尝试用java编写一个算法来旋转二维像素数组(不限于90度),我遇到的唯一问题是:最终结果在图像中留下了点/孔。
这是代码:
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
int xp = (int) (nx + Math.cos(rotation) * (x - width / 2) + Math
.cos(rotation + Math.PI / 2) * (y - height / 2));
int yp = (int) (ny + Math.sin(rotation) * (x - width / 2) + Math
.sin(rotation + Math.PI / 2) * (y - height / 2));
int pixel = pixels[x + y * width];
Main.pixels[xp + yp * Main.WIDTH] = pixel;
}
}
“Main.pixels”是一个连接到画布显示器的数组,这就是显示器上显示的内容。
“像素”和函数本身位于精灵类中。 sprite 类在程序初始化时从“.png”图像中获取像素。
我尝试过查看“旋转矩阵”解决方案。但它们对我来说太复杂了。我注意到当图像接近 45 度时,图像会有些拉伸?出了什么问题?正确的代码是什么?将像素添加到更大范围的数组(例如 Main.pixels[])。
必须是java!并相对于上面的代码格式。我不是在寻找复杂的例子,只是因为我不会理解(如上所述)。简单而直接,正是我所追求的。
我希望回答这个问题。
- 你的公式是错误的,因为......
- 这样做的话,效果就是...
- 简化这个...
- 我推荐...
如果我要求太多,我很抱歉,但我一直在寻找与这个问题相关的答案,我可以理解和使用。但总是要么给出 90 度的旋转,要么给出另一种编程语言的示例。
您正在向前推动像素,但并不是每个像素都会受到离散旋转图的影响。您可以通过计算每个像素的来源来消除间隙。
代替
for each pixel p in the source
pixel q = rotate(p, theta)
q.setColor(p.getColor())
try
for each pixel q in the image
pixel p = rotate(q, -theta)
q.setColor(p.getColor())
这仍然会有视觉伪影。您可以通过插值而不是将源像素 p 的坐标四舍五入为整数值来改进这一点。
编辑:您的旋转公式看起来很奇怪,但在使用 cos(r+pi/2) = -sin(r) 和 sin(r+pi/2)=cos(r) 等三角恒等式后,它们看起来没问题。它们不应该成为任何拉伸的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)