将一个三角形转换为另一个三角形

2022-09-04 02:34:16

嗨,我正在尝试创建仿射变换,这将允许我将一个三角形转换为另一个三角形。我所拥有的是2个三角形的坐标。你可以帮我吗?

在亚当·罗森菲尔德(Adam Rosenfield)的回答之后,我想出了这个代码,以防有人无聊地自己解决这个方程:

public static AffineTransform createTransform(ThreePointSystem source,
            ThreePointSystem dest) {        
    double x11 = source.point1.getX();
    double x12 = source.point1.getY();
    double x21 = source.point2.getX();
    double x22 = source.point2.getY();
    double x31 = source.point3.getX();
    double x32 = source.point3.getY();
    double y11 = dest.point1.getX();
    double y12 = dest.point1.getY();
    double y21 = dest.point2.getX();
    double y22 = dest.point2.getY();
    double y31 = dest.point3.getX();
    double y32 = dest.point3.getY();

    double a1 = ((y11-y21)*(x12-x32)-(y11-y31)*(x12-x22))/
                ((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
    double a2 = ((y11-y21)*(x11-x31)-(y11-y31)*(x11-x21))/
                ((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
    double a3 = y11-a1*x11-a2*x12;
    double a4 = ((y12-y22)*(x12-x32)-(y12-y32)*(x12-x22))/
                ((x11-x21)*(x12-x32)-(x11-x31)*(x12-x22));
    double a5 = ((y12-y22)*(x11-x31)-(y12-y32)*(x11-x21))/
                ((x12-x22)*(x11-x31)-(x12-x32)*(x11-x21));
    double a6 = y12-a4*x11-a5*x12;
    return new AffineTransform(a1, a4, a2, a5, a3, a6);
}

答案 1

我假设你在这里谈论的是2D。仿射变换矩阵中有 9 个值:

    | a1 a2 a3 |
A = | a4 a5 a6 |
    | a7 a8 a9 |

有 3 个输入顶点 、 、 和 ,当变换时应变为 、 、 。但是,由于我们在齐次坐标中工作,因此应用到并不一定给出 - 它给出了.因此,我们还有未知乘数 、 和 ,其方程为:x1x2x3y1y2y3Ax1y1y1k1k2k3

A*x1 = k1*y1
A*x2 = k2*y2
A*x3 = k3*y3

这些都是一个向量,所以我们在12个未知数中确实有9个方程,所以解将是不受约束的。如果我们要求 , , 和 , 则解将是唯一的(此选择是自然的,因为它意味着如果输入点为 (, , 1),则输出点将始终具有齐次坐标 1,因此生成的变换只是一个 2x2 变换加上一个平移)。a7=0a8=0a9=1xy

因此,这会将等式简化为:

a1*x11 + a2*x12 + a3 = k1*y11
a4*x11 + a5*x12 + a6 = k1*y12
                   1 = k1
a1*x21 + a2*x22 + a3 = k2*y21
a4*x21 + a5*x22 + a6 = k2*y22
                   1 = k2
a1*x31 + a2*x32 + a3 = k3*y31
a4*x31 + a5*x32 + a6 = k3*y32
                   1 = k3

所以, = = = 1.插入这些并转换为矩阵形式可产生:k1k2k3

| x11 x12   1   0   0   0 |   | a1 |   | y11 |
| x21 x22   1   0   0   0 |   | a2 |   | y21 |
| x31 x32   1   0   0   0 | * | a3 | = | y31 |
|   0   0   0 x11 x12   1 |   | a4 |   | y12 |
|   0   0   0 x21 x22   1 |   | a5 |   | y22 |
|   0   0   0 x31 x32   1 |   | a6 |   | y32 |

求解这个6x6方程组可以得到仿射变换矩阵。当且仅当源三角形的 3 个点不是共线时,它将具有唯一的解决方案。A


答案 2

嘿,伙计们,在不失去普遍性的情况下,使两个三角形的原点作为一个顶点(您可以稍后附加仿射移位移),因此它们由点0,a,b,c,d定义,然后将点x乘以矩阵NM

哪里

M = 逆(a b) <---这是 2x2 矩阵,其中点 ab 作为其列

N = (c d)

这应该可以做到。