У меня есть набор 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
Но точки в ньюмате не ограничены xnewrange
и ynewrange
.