在变换中缩放和旋转矩阵?
Posted
技术标签:
【中文标题】在变换中缩放和旋转矩阵?【英文标题】:scale and rotate matrices in transformation? 【发布时间】:2013-02-27 09:02:22 【问题描述】:我有一组 2D 点,我只需要对其进行变换(2D),并且我知道变换集的边界。我试图将这些点放在受限边界内。我正在使用 R 进行这种转换。
首先,我将原始区域和转换区域的边界点相等。我正在使用缩放和旋转矩阵。所以等式是:
newpoint = 缩放矩阵 * 旋转矩阵 * 原点。
缩放矩阵和旋转矩阵都是 2x2 矩阵。
但是,当我对边界点执行上述操作并获取旋转和缩放矩阵,然后使用这两个矩阵来获取原始点集的新边界点时,我无法将其限制在边界内.有人可以提出问题所在吗?
在下面的代码中,xnewrange
是变换点的边界,xorigrange
是原始点的边界,myorigmat
是包含需要变换的原始点的矩阵。
到目前为止我所做的代码如下:
xnewrange<-c(-0.2588,4.036885)
ynewrange<-c(-2.653607,4.069070)
xorigrange<-c(-0.6810824,1.3324875)
yorigrange<-c(-1.419355,2.459154)
myorigmat
[,1] [,2]
31 1.3324875 -1.4193554
32 0.5755337 0.4543802
33 -0.3365769 1.0730593
34 0.8752970 -1.1013751
35 -0.6810824 0.9655893
36 0.2439643 0.1838974
37 -0.3893538 0.5326981
38 0.2241310 0.7273958
39 -0.1219151 0.2176043
40 0.8737421 2.4591542
coord<-matrix(c(xorigrange[1],xorigrange[2],yorigrange[1],yorigrange[2]),2,2,byrow=T)
trans_coord<-matrix(c(xnewrange[1],xnewrange[2],ynewrange[1],ynewrange[2]),2,2,byrow=T)
costheta<-sum(trans_coord[,1]*coord[,1])/(sqrt(sum((coord[1,1])^2,(coord[2,1])^2)) * sqrt(sum((trans_coord[1,1])^2,(trans_coord[2,1])^2))) #using dot product
sintheta<-sqrt(1-(costheta^2))
rotate_mat<-matrix(c(costheta,sintheta,(-sintheta),costheta),2,2,byrow=T)
scale_mat<-(trans_coord) %*% solve(rotate_mat %*% coord)
使用这样得到的scale_mat和rotate_mat得到新的点如下:
newmat<-matrix(0,10,2)
for(i in 1:10)
newmat[i,]<-scale_mat %*% rotate_mat %*% matrix(c(mymat[i,1],mymat[i,2]),2,1,byrow=T)
newmat
但newmat中的点不在xnewrange
和ynewrange
之内。
【问题讨论】:
你能把你到目前为止所做的代码放进去吗? 矩阵乘法不可交换。您确定它们的顺序正确吗? 是的,我已经处理了矩阵乘法。我现在也添加了代码。 我是喝咖啡的,所以我可能在这里遗漏了一些东西,但是:如果你旋转和平移原始矩阵的角(手动,而不是通过代码),你得到想要的新角落位置?尝试将问题分解为步骤。首先旋转并验证角度是否正确。然后平移,使最左边的点位于 x=0,最底部位于 y=0,并观察“拟合”相反极值所需的比例因子。现在检查你的代码产生的中间值,看看哪里出现了差异。 谢谢 Carl.. 我会尝试将其分解为不同的步骤... 我尝试过一次基于质心的旋转。但这并没有给我带来任何丰硕的成果。我会尝试使用第一个角,然后看看第二个角是否正常工作.. 【参考方案1】:a<-c(-0.2588,-2.653607)
b<-c(-0.6810824,-1.419355)
costheta<-sum(a*b)/((sqrt(sum((a[1]^2),(a[2]^2))))*(sqrt(sum((b[1]^2),(b[2]^2)))))
sintheta<-sqrt(1-(costheta^2))
m1output_corner<-matrix(c(a[1],a[2]),2,1)
m1input_corner<-matrix(c(b[1],b[2]),2,1)
rotate_mat<-matrix(c(costheta,sintheta,(-sintheta),costheta),2,2,byrow=T)
mint<-rotate_mat %*% m1input_corner
tran<-matrix(c(-mint[1,1],-mint[2,1]),2,1)
m2output_corner<-matrix(c(4.036885,4.069070),2,1)
m2input_corner<-matrix(c(1.332488,2.459154),2,1)
smat<- m2output_corner / ((rotate_mat%*% m2input_corner)+tran)
scalemat<-matrix(c(smat[1,1],0,0,smat[2,1]),2,2,byrow=T)
newmat<-matrix(0,10,2)
for(i in 1:10)
newmat[i,]<-(scalemat %*% ((rotate_mat %*% matrix(c(mymat[i,1],mymat[i,2]),2,1,byrow=T)) + tran ))
newmat
【讨论】:
编辑时请不要加空行。要使代码可读,请选择整个代码块并点击以上是关于在变换中缩放和旋转矩阵?的主要内容,如果未能解决你的问题,请参考以下文章