масштабировать и вращать матрицы при преобразовании?

У меня есть набор 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.


person user2092000    schedule 27.02.2013    source источник
comment
Можете ли вы поместить код того, что вы сделали до сих пор?   -  person James    schedule 27.02.2013
comment
Умножение матриц не является коммутативным. Вы уверены, что получили их в правильном порядке?   -  person luser droog    schedule 27.02.2013
comment
Я позаботился о матричном умножении. Я также добавил код сейчас.   -  person user2092000    schedule 27.02.2013
comment
Я готовлюсь к кофе, поэтому, возможно, я что-то здесь упускаю, но: если вы повернете и переместите углы исходной матрицы (вручную, а не с помощью кода), вы получите желаемые новые местоположения углов? Попробуйте разбить задачу на этапы. Сначала поверните и убедитесь, что углы правильные. Затем переведите так, чтобы самая левая точка находилась в точке x = 0, самая нижняя — в точке y = 0, и наблюдайте масштабный коэффициент, необходимый для «подгонки» противоположных экстремумов. Теперь проверьте промежуточные значения, которые выдает ваш код, и посмотрите, где возникает несоответствие.   -  person Carl Witthoft    schedule 27.02.2013
comment
Спасибо, Карл .. Я попробую разбить его на разные этапы ... Однажды я пытался вращаться на основе центроидов. Но это не дало мне никакого плодотворного результата. Я попробую использовать первый угол, а затем посмотрю, хорошо ли работает второй угол.   -  person user2092000    schedule 27.02.2013
comment
@ Карл, у меня есть сомнения. Вы сказали, попробуйте повернуть, перевести, а затем масштабировать, но я не знаю, правильный ли это порядок. Я думаю, что масштабирование, вращение и перевод - правильный порядок. Я также попробовал способ, который вы предложили. Это не работает для меня. Я не уверен, может быть, я что-то упускаю здесь.   -  person user2092000    schedule 27.02.2013
comment
Ну, я не уверен, что это имеет значение. Мне просто легче увидеть, что происходит, если я поверну и центрирую, а затем выясню, какое расширение/сжатие необходимо, чтобы поместиться в целевой области.   -  person Carl Witthoft    schedule 27.02.2013
comment
@Carl Witthoft Я получил ответ. Я использовал тот же подход, который вы предложили. Ранее я сделал небольшую ошибку. Теперь я получаю это должным образом. Большое спасибо   -  person user2092000    schedule 27.02.2013


Ответы (1)


person    schedule
comment
при редактировании не добавляйте пустые строки. А чтобы сделать код читабельным, выделите весь блок кода и нажмите ‹CTRL›-K (или ‹CMD›-K на Mac), чтобы правильно отформатировать его. - person Carl Witthoft; 27.02.2013