Java旋转像素arrays

我试图在java中制作一个算法来旋转一个二维像素arrays(不限于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类中。 精灵类在程序初始化时从’.png’图像中抓取像素。


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

需要成为java! 并且相对于上面的代码格式。 我不是在寻找复杂的例子,因为我不理解(如上所述)。 简单而直接,我正在寻找。


如何回答这个问题。

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

对不起,如果我要求很多,但我已经找到了相对于这个问题的答案,我可以理解和使用。 但总是要么给予90度的旋转,要么给出另一种编程语言的例子。

为了避免漏洞,您可以:

  1. 计算目的地的源坐标

    (只是将计算反转到当前状态)它与Douglas Zare的回答相同

  2. 使用双线性或更好的过滤

  3. 使用少于单个像素的步骤

    通常0.75像素就足以覆盖这些洞,但你需要使用float而不是int s,这有时是不可能的(由于性能和/或缺少实现或其他原因)

失真

如果您的图像失真,那么您没有正确应用宽高比,因此x像素大小与y像素大小不同。 您需要将缩放添加到一个轴,以便它与应用的设备/变换匹配。 这里有一些提示:

  • 源图像和目标图像是否分开(不到位)? 所以Main.pixelspixels是不一样的…否则你在使用之前会覆盖一些像素,这可能是失真的另一个原因。

  • 刚刚意识到你有cos,cossin,sin旋转公式中的sin,sin是非标准的,可能是你在某处错误地签署了角度delta

这是一个子弹#1的例子。 (反向)标准旋转公式( C ++ ):

 float c=Math.cos(-rotation); float s=Math.sin(-rotation); int x0=Main.width/2; int y0=Main.height/2; int x1= width/2; int y1= height/2; for (int a=0,y=0; y < Main.height; y++) for (int x=0; x < Main.width; x++,a++) { // coordinate inside dst image rotation center biased int xp=x-x0; int yp=y-y0; // rotate inverse int xx=int(float(float(xp)*c-float(yp)*s)); int yy=int(float(float(xp)*s+float(yp)*c)); // coordinate inside src image xp=xx+x1; yp=yy+y1; if ((xp>=0)&&(xp=0)&&(yp 

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

代替

 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)这样的三角形标识后它们看起来很好。 它们不应该是任何拉伸的原因。