1

変換(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のポイントはと内に制限されていませxnewrangeynewrange

4

1 に答える 1

-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
于 2013-02-27T15:31:33.107 に答える