我正在尝试编写一个Java实现Alan Paeth描述的三重剪切旋转算法(可以在此处找到描述:http://www.cipprs.org/papers/VI/VI1986/pp077-081-Paeth-1986.pdf)。问题不在于计算值,而是将旋转后的点放入图像网格中。论文中通过以下计算执行了三次连续的剪切以进行旋转:
以下是我目前的Java实现:
- x = x + alpha * y
- y= y + beta * x
- x = x + alpha * y
- beta = sin(theta)
- alpha = - tan(theta/2)
以下是我目前的Java实现:
ShiftPoint[] val = new ShiftPoint[m*n];
double minX = 0,minY = 0, maxX = 0, maxY = 0;
double alpha = -1d* Math.tan(Math.toRadians(theta)/2d);
double beta = Math.sin(Math.toRadians(theta));
for(int a = 0; a < m; a++) {
for(int b = 0; b < n; b++) {
ShiftPoint temp = new ShiftPoint(a, b, values[a][b]);
double newX = b + alpha * a; //first shear
double newY = a + beta * newX; //second shear
newX += alpha * newY; //third shear
temp.setX(newX);
temp.setY(newY);
val[m * b + b] = temp;
}
}
注意:ShiftPoint是一个简单的自编写类,用于保存矩阵中特定坐标和值(在图像处理中:像素的rgb值)。
这里展示了计算的图形表示:
![enter image description here](https://istack.dev59.com/NQsIt.webp)
问题:虽然计算出来的值似乎是正确的,并且图形表示显示旋转实际上起作用了,但我不确定如何将计算出的值适应于固定的网格或图像(或2d数组),而不会扭曲它。此外,我不完全理解Paeth论文中给出的实现方法(对于x轴剪切):
![enter image description here](https://istack.dev59.com/l1qnL.webp)
我知道skewi是计算出的值的整数部分,skewf是小数部分,但width、height、oleft和left应该是什么?此外:为什么他在第一个计算中将y值加0.5而没有考虑x值?
注意:我知道Java提供了简单的方法来旋转图像,但我正在尝试实现这个特定算法,只是为了好玩。我也知道可以通过网络搜索找到3-5个网站(如#1和#2),并尝试解释该算法,但首先它们不使用Java,其次它们大多参考Paeth的示例实现,所以它们并不非常有用。