嗨,我想创建仿射变换,让我到一个三角形转换成另一个。 我有什么都为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个顶点输入x1
, x2
和x3
,当其转化应成为y1
, y2
, y3
。 然而,由于我们在齐次坐标的工作,将A
对x1
并不一定给y1
-它给人的倍数y1
。 所以,我们也有未知的乘数k1
, k2
和k3
,用公式:
A*x1 = k1*y1
A*x2 = k2*y2
A*x3 = k3*y3
每个那些是矢量,所以,我们必须在12个未知数9个方程,因此该解决方案将是欠约束。 如果我们要求a7=0
, a8=0
,和a9=1
,则该解决方案将是唯一的(这种选择是自然的,因为这意味着如果输入点为( x
, y
,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个点不共线。
嘿,伙计们,不失一般性,使两个三角形有原点为一个顶点(您可以在仿射移位后粘性),所以他们被点0定义,A,B,C,D,然后乘以你的点X由矩阵NM
哪里
M =逆(AB)<---这是2×2矩阵与点A和B作为它的列
和
N =(CD)
这应该这样做。
如果我理解正确这,你的三角形具有相同的大小和角度,所以你应该能够变换分析他们,让他们有共同的(至少)一个点。 在此之后,他们应该只在旋转不同,或者可以被镜像,所以你可以得到铁三角线之间的角度,尝试这些旋转和可反映的一个三角形,如果没有角度的作品。
编辑:好的,这还不够,仿射变换也可以包含剪切和缩放...缩放可以很容易地完成,只是划分线的长度,这也会给你一些有关相应三角形的线条,但剪切会更难...
OTOH,不能你只是解决了一些这方面的方程系统? 毕竟,应该有一个变换矩阵和3点(新老)...
只是一级方程式的问题,因为一组方程,然后解决它:
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并解决它,但如果我不是失去了一些东西(也许我),你需要一分完整地指定改造,否则你就会有自由的额外程度(当然你可以修复它)。