我有一组 2D 点,我只需要转换(2D)并且我知道转换集的边界。我试图将这些点放在受限边界内。我正在使用 R 进行此转换。
首先,我将原始区域和转换区域的边界点等同起来。我正在使用缩放和旋转矩阵。所以方程是:
新点 = 缩放矩阵 * 旋转矩阵 * 原点。
缩放矩阵和旋转矩阵都是 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
。