变换三角形到另一个三角形(Transform a triangle to another trian

2019-06-25 16:30发布

嗨,我想创建仿射变换,让我到一个三角形转换成另一个。 我有什么都为2个三角形的坐标。 你能帮助我吗?

继亚当罗森菲尔德答案我想出了这个代码的情况下,任何人被闷求解方程自己:

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);
}

Answer 1:

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

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

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

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个点不共线。



Answer 2:

嘿,伙计们,不失一般性,使两个三角形有原点为一个顶点(您可以在仿射移位后粘性),所以他们被点0定义,A,B,C,D,然后乘以你的点X由矩阵NM

哪里

M =逆(AB)<---这是2×2矩阵与点AB作为它的列

N =(CD)

这应该这样做。



Answer 3:

如果我理解正确这,你的三角形具有相同的大小和角度,所以你应该能够变换分析他们,让他们有共同的(至少)一个点。 在此之后,他们应该只在旋转不同,或者可以被镜像,所以你可以得到铁三角线之间的角度,尝试这些旋转和可反映的一个三角形,如果没有角度的作品。

编辑:好的,这还不够,仿射变换也可以包含剪切和缩放...缩放可以很容易地完成,只是划分线的长度,这也会给你一些有关相应三角形的线条,但剪切会更难...

OTOH,不能你只是解决了一些这方面的方程系统? 毕竟,应该有一个变换矩阵和3点(新老)...



Answer 4:

只是一级方程式的问题,因为一组方程,然后解决它:

P1 * M = P1'
P2 * M = P2'
P3 * M = P3'

M是3×3矩阵,如:

[m00, m01, m02;
 m10, m11, m12;
 0  ,   0,   1]

P_i是一个元组[k*x_i, k*y_i, k] (齐次坐标)...

现在,您可以尝试展开上面显示的3个matricial方程,使一个新的系统,与m_ij为incognits并解决它,但如果我不是失去了一些东西(也许我),你需要一分完整地指定改造,否则你就会有自由的额外程度(当然你可以修复它)。



文章来源: Transform a triangle to another triangle