我知道仿射变换前后 3 个点(p0、p1、p2)的位置(X 和 Y)。我想构建匹配此转换的 AffineTransformation 对象。换句话说,我想找到将已知点 p0、p1、p2 移动到它们已知目的地的仿射变换。
这是我到目前为止所做的:
package image_transformation;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import math.Vector2d;
public class ImageTransformation {
public static void main(String[] args) throws IOException {
// the position of the points before the transformation
Vector2d[] src = new Vector2d[] {
new Vector2d(486, 191),
new Vector2d(456, 565),
new Vector2d(149, 353)
};
// the position of the points after the transformation
Vector2d[] dest = new Vector2d[] {
new Vector2d(0, 0),
new Vector2d(0, 600),
new Vector2d(600, 600)
};
// the transformation that we are building
AffineTransform at = new AffineTransform();
// the translation to move the p0 to its destination
Vector2d translationVec = dest[0].sub(src[0]);
at.translate(translationVec.x, translationVec.y);
// the rotation around p0 (it will not move) to align p0, p1 and p1's destination
Vector2d vec0 = src[1].sub(src[0]);
Vector2d vec1 = dest[1].sub(dest[0]);
double angle = orientedAngle(vec0, vec1);
at.rotate(angle, src[0].x, src[0].y);
}
Vector2d 类做一些关于向量的基本数学运算,它的每个方法都通过它们的名称(sub[stract]、mult[iply]、length、normalize 等)不言自明。
我不知道如何终止这个算法。此外,如果已经存在可以完成所有这些操作的方法,我会非常乐意使用它。
波斯汪
相关分类