gpt4 book ai didi

像素数组的Java旋转

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:43:59 25 4
gpt4 key购买 nike

我试图在 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' 是一个连接到 Canvas 显示器的数组,这是显示在监视器上的内容。

'pixels' 和函数本身在 Sprite 类中。 Sprite 类在程序初始化时从“.png”图像中获取像素。


我试过查看“旋转矩阵”解决方案。但它们对我来说太复杂了。我注意到当图像接近 45 度时,图像会有些拉伸(stretch)?出了什么问题?什么是正确的代码;将像素添加到更大比例的数组(例如 Main.pixels[])。

需要是java!并且相对于上面的代码格式。我不是在寻找复杂的例子,只是因为我不明白(如上所述)。简单明了,正是我想要的。


如何回答问题。

  1. 你的公式是错误的,因为......
  2. 这样做,效果会...
  3. 简化这个...
  4. 我推荐...

如果我问的太多,我很抱歉,但我已经在寻找与这个问题相关的答案,我可以理解和使用。但是总是要么给出 90 度的旋转,要么给出来自另一种编程语言的示例。

最佳答案

您正在向前插入像素,并不是每个像素都被离散化旋转贴图击中。您可以通过计算每个像素的来源来消除间隙。

代替

for each pixel p in the source
pixel q = rotate(p, theta)
q.setColor(p.getColor())

尝试

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) 这样的三角恒等式后它们看起来没问题。它们不应成为任何拉伸(stretch)的原因。

关于像素数组的Java旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739809/

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