変換(2D)のみが必要な2Dポイントのセットがあり、変換されたセットの境界を知っています。ポイントを制限された境界内に配置しようとしています。私はこの変換を行うためにRを使用しています。
まず、元の領域と変換された領域の境界点を等しくします。スケールと回転行列を使用しています。したがって、方程式は次のようになります。
newpoint=スケール行列*回転行列*元の点。
スケール行列と回転行列はどちらも2x2行列です。
ただし、境界ポイントに対して上記を実行し、回転およびスケールマトリックスを取得してから、これら2つのマトリックスを使用して、元のポイントのセットの新しい境界ポイントを取得すると、境界内に制限できません。誰かが何が悪いのかを提案できますか?
以下のコードで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
。