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

Savvas Dalkitsis:

嗨,我正在尝试创建仿射变换,使我可以将一个三角形变换为另一个三角形。我所拥有的是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);
}
亚当·罗森菲尔德(Adam Rosenfield):

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

    | A1 A2 A3 | 
A = | A4 A5 A6 | 
    | A7 A8 A9 |

有3个顶点输入x1x2x3,当其转化应该成为y1y2y3然而,由于我们在齐次坐标的工作,应用Ax1不一定给y1-它给人的倍数y1所以,我们也有未知的乘法器k1k2以及k3,用公式:

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

每一个都是一个向量,因此我们实际上有12个未知数中的9个方程,因此解决方案将受到约束。如果我们要求a7=0a8=0以及a9=1,然后将溶液将是唯一的(这种选择是自然的,因为这意味着如果输入点为(xy,1),则输出点总是有齐次坐标1,因此所得到的变换是只是一个2x2的转换加上翻译)。

因此,这将等式简化为:

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

因此,k1= k2= k3=1。将它们插入并转换为矩阵形式会产生:

| 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方程组可得出仿射变换矩阵A当且仅当源三角形的3个点不是共线时,它将具有唯一的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章