我有一组2D点,我只需要变换(2D),我知道变换集的边界。我试图把点放在限制范围内。我正在使用R进行这种转换。
首先,我将原始区域和变换区域的边界点等同起来。我正在使用比例和旋转矩阵。所以等式是:
newpoint = scale matrix * rotate matrix * original point。
比例矩阵和旋转矩阵都是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
范围内。
答案 0 :(得分:-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