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

嗨,我正在尝试创建仿射变换,这将允许我将三角形变换为另一个。 我所拥有的是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);
}

我会假设你在这里谈论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=0a9=1 ,那么解就是唯一的(这个选择是自然的,因为它意味着如果输入点是( xy ,1),那么输出点将会总是具有齐次坐标1,所以得到的变换只是一个2×2变换加上一个翻译)。

因此,这将方程式减少为:

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个点不共线时,它将具有独特的解决方案。


嘿,伙计们,在不失一般性的情况下,让这两个三角形的起点作为一个顶点(你可以稍后加入仿射移位),所以它们由点0,a,b,c,d定义然后将你的点x由矩阵NM表示

哪里

M = inverse( ab )<---这是以点ab为列的2x2矩阵

N =( cd

这应该做到这一点。


如果我正确理解这一点,你的三角形具有相同的大小和角度,所以你应该能够转换它们,使它们具有(至少)一个共同点。 在此之后,它们应该只在旋转方面有所不同或者可以被镜像,因此您可以获取三角形线条之间的角度并尝试旋转这些角度,并且可以在没有任何角度的情况下反射其中一个三角形。

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

OTOH,你难道不能为此解决一些方程式吗? 毕竟,应该有一个转换矩阵和3个点(新的和旧的)...

链接地址: http://www.djcxy.com/p/50041.html

上一篇: Transform a triangle to another triangle

下一篇: Set default syntax to different filetype in Sublime Text 2