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! 并且相对于上面的代码格式。 我不是在寻找复杂的例子,因为我不理解(如上所述)。 简单而直接,我正在寻找。
如何回答这个问题。
- 你的公式错了,因为….
- 这样做,效果将是……
- 简化这个……
- 我推荐……
对不起,如果我要求很多,但我已经找到了相对于这个问题的答案,我可以理解和使用。 但总是要么给予90度的旋转,要么给出另一种编程语言的例子。
为了避免漏洞,您可以:
-
计算目的地的源坐标
(只是将计算反转到当前状态)它与Douglas Zare的回答相同
-
使用双线性或更好的过滤
-
使用少于单个像素的步骤
通常
0.75
像素就足以覆盖这些洞,但你需要使用float
而不是int
s,这有时是不可能的(由于性能和/或缺少实现或其他原因)
失真
如果您的图像失真,那么您没有正确应用宽高比,因此x像素大小与y像素大小不同。 您需要将缩放添加到一个轴,以便它与应用的设备/变换匹配。 这里有一些提示:
-
源图像和目标图像是否分开(不到位)? 所以
Main.pixels
和pixels
是不一样的…否则你在使用之前会覆盖一些像素,这可能是失真的另一个原因。 -
刚刚意识到你有
cos,cos
和sin,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)这样的三角形标识后它们看起来很好。 它们不应该是任何拉伸的原因。