我有两个正方形,S1 =(x1,y1,x2,y2)和S2 =(a1,b1,a2,b2)
我正在寻找A变换矩阵 A * S1 = S2
据我所知,A是一个仿射3x3矩阵,所以我有9个未知值。
如何计算这些值?
谢谢,最好的, 尤
答案 0 :(得分:6)
这里只有四个未知值。旋转角度,比例因子和x和y平移。在你的三乘三矩阵中,底行总是0,0,1
,这会使你减少到六个未知数。右侧列将是Tx,Ty,1
,这是您的翻译(以及我们已经知道的1)。
左边两个“矩阵”将是你的旋转和缩放。这将(在我的头顶)是这样的:
ACos(B), -Asin(B)
ASin(B), aCos(B)
所以总的来说:
ACos(B), -Asin(B), Tx
ASin(B), ACos(B), Ty
0 , 0 , 1
使用每个坐标末尾的1扩展坐标矩阵,得到2x3矩阵,然后乘以得到四个变量需要求解的四个方程式。这留给读者练习。
答案 1 :(得分:2)
变换矩阵是缩放矩阵Ss,转移矩阵St和旋转矩阵Sr的因子。
假设旧点是Po是(Xo,Yo)并且向量将表示为(Xo Yo 1)'对于新点Pn相同 然后Pnv = Ss St SrPov Sx在哪里
Sx 0 0
0 Sy 0
0 0 1
St是
1 0 Tx
0 1 Ty
0 0 1
Sr是
Cos(th) -Sin(th) 0
Sin(th) Cos(th) 0
0 0 1
现在回到你的问题。如果两个点表示矩形,我们可以找到两个矩阵的参数,第三个将是一个单位矩阵。
Rect1表示为左上点P11和右下点P12 Rect2表示为左上点P21和右下点P22
S = SS * ST
Sx 0 Tx
0 Sy Ty
0 0 1
现在你有4个缺失参数和4组方程
P21=S*P11
P22=S*P12
X[P21] =Sx*X[P11]+Tx
Y[P21] =Sy*Y[P11]+Ty
X[P22] =Sx*X[P12]+Tx
Y[P22] =Sy*Y[P12]+Ty
解决它,你会得到答案。
如果你有过渡和旋转那么 S =锶* ST
Cos(th) -Sin(th) Tx
Sin(th) Cos(th) Ty
0 0 1
现在您有3个缺失参数和4组方程式
P21=S*P11
P22=S*P12
X[P21] =Cos(th)*X[P11]-Sin(th)*Y[P11]+Tx
Y[P21] =Sin(th)*X[P11]+Cos(th)*Y[P11]+Ty
X[P22] =Cos(th)*X[P11]-Sin(th)*Y[P12]+Tx
Y[P22] =Sin(th)*X[P11]+Cos(th)*Y[P12]+Ty
用A替换Cos(th)和用B替换Sin(th)并求解方程式。
X[P21] =A*X[P11]-B*Y[P11]+Tx
Y[P21] =B*X[P11]+A*Y[P11]+Ty
X[P22] =A*X[P11]-B*Y[P12]+Tx
Y[P22] =B*X[P11]+A*Y[P12]+Ty
检查其是否正确A^2+B^2 =? 1
if是否为th = aCos(A)
解决方案的最后一部分,如果你有三个矩阵,那么S = Sr St Ss
Sx*sin(th) -Sx*cos(th) Tx
Sy*cos(th) Sy*sin(th) Ty
0 0 1
现在我们有5个缺失的变量,我们需要6个不同的方程组来解决它。这意味着每个矩形的3个点。
答案 2 :(得分:0)
如果您只是想要转换2D对象,则不应该有3x3矩阵。您正在寻找的是一个2x2矩阵,可以解决A * S1 = S2。这可以通过许多不同的方式完成;在MATLAB中,你需要S2/S1
(right matrix division),通常这会执行某种Gaussian elimination。
答案 3 :(得分:0)
如何计算这些值?
当应用于2d / 3d变换时,矩阵可以表示为坐标系,除非我们讨论的是投影。
矩阵行(或列,取决于符号)形成新坐标系的轴,如果每个对象顶点乘以矩阵,将放置对象。最后一行(或柱状,取决于符号)指向新坐标系的中心。
标准OpenGL / DirectX变换矩阵(非投影矩阵):
class Matrix{//C++ code
public:
union{
float f[16];
float m[4][4];
};
};
可以表示为4个向量vx(新坐标系的x轴),vy(新坐标系的y轴),vz(新坐标系的z轴)和vp(中心的新系统)。像这样:
vx.x vx.y vx.z 0
vy.x vy.y vy.z 0
vz.x vz.y vz.z 0
vp.x vp.y vp.z 1
所有“计算旋转矩阵”,“计算尺度矩阵”等都归结为这个想法。
因此,对于2d矩阵,你将有3x3矩阵由3个向量组成 - vx,vy,vp,因为在2d中没有z向量。即:
vx.x vx.y 0
vy.x vy.y 0
vp.x vp.y 1
要找到将quad A变换为quad B的变换,您需要找到两个变换:
如果四边形的相对边不平行,则不能这样做。即平行四边形是好的,但随机的4面多边形不是。
四边形可以由基点(vp)表示,基点(vp)可以是四边形的任何顶点,两个矢量定义四边形尺寸(边缘的方向乘以边缘的长度)。即“向上”向量和“侧”向量。这使它成为一个矩阵:
side.x side.y 0
up.x up.y 0
vp.x vp.y 1
因此,通过此矩阵乘以四元组(vp.x = 0,vp.y = 0,side.x = 1,side.y = 0,up.x = 0,up.y = 1)将转向原始四边形到您的四边形。这意味着,为了改造 四A到四B,你需要这样做:
1)制作一个矩阵,将“base 1unit quad”变换为quad A.让我们称它为matA。
2)制作一个矩阵,将“base 1 unit quad”变换为quad B.让我们称它为matB
3)反转matA并将结果存储到invMatA中
4)结果矩阵是invMatA * matB。
完成。如果将四A乘以结果矩阵,则会得到四边形B.如果四边形的宽度或高度为零,则无效。如果四边形不是平行四边形,则无效。
这很难理解,但我不能让它变得更简单。
答案 4 :(得分:-1)
S1 = (x1,y1,x2,y2)
你是什么意思?
它们代表广场的左上角和右下角吗?
另外,你能保证正方形之间只有旋转吗?或者你需要一个完整的仿射变换,它允许缩放,倾斜和平移吗?
或者您还需要透视转换吗?
只有当它是透视变换时,你需要3x3矩阵和8自由度,如你在帖子中提到的那样。