Как перевести начало координат из (0,0) в (x, y) с умножением матрицы? - PullRequest
1 голос
/ 21 апреля 2019

У меня есть матрица 2 на 4 coor, которая определяет четыре точки: (0,0), (a,0), (a, -b) и (a-c, -b) линии на плоскости:

a<-3; b<-1; c<-1
coor <- matrix(0,2,4)
coor <- t(matrix(c(0,0, a,0, a,-b, a-c, -b), nrow=2));

Я добавил в матрицу coor 3-й столбец «1», чтобы использовать эту матрицу в умножении.

coor <- cbind(coor, 1) 

Мне нужно 1) перевести начало координат из (0,0) в четвертую точку с координатами (a-c,-b) и 2) повернуть линию на угол alpha:

# translation matrix
I <- matrix(0,3,3); diag(I) <- 1

I[1, 3] <- -coor[4, 1]
I[2, 3] <- -coor[4, 2]

alpha = -pi/2

# rotation matrix
M <- matrix(c(cos(alpha), sin(alpha), 0,
             -sin(alpha), cos(alpha), 0,
                 0,          0, 1), nrow=3)


coor1 <- matrix()
coor1 <- coor %*% I %*% M %*% solve(I)

Результат двух операций:

> cbind(coor1[,1], coor1[,2])
            [,1] [,2]
[1,] 0.00000e+00    0
[2,] 1.83691e-16    3
[3,] 1.00000e+00    3
[4,] 1.00000e+00    2

Ожидаемый результат:

> coor2 <- matrix(c(2,-1, 2,2, 3,2, 3,1),nrow=2); t(coor2);
     [,1] [,2]
[1,]    2   -1
[2,]    2    2
[3,]    3    2
[4,]    3    1

Сюжет с оригинальными очками и результатами ниже. На графике я сгруппировал данные точки в красной линии, где a, b, c - длины соответствующих отрезков.

plot(t(coor[1,]), t(coor[2,]), col='red', type= 'l', xlim=c(0,3), ylim=c(-1,3), xlab='x', ylab='y')
points(round(cbind(coor1[,1], coor1[,2]),2), col='green', type= 'l')
points(t(coor2), col='blue', type= 'l')

enter image description here

Вопрос. Как правильно умножить матрицу coor %*% I %*% M %*% solve(I), чтобы переместить первую точку линии с (0,0) на (a-c, -b)?

Редактировать.

Совмещение перевода и вращения

Полный код:

a<-3; b<-1; c<-1
coor <- matrix(0,2,4)
coor <- t(matrix(c(0,0, a,0, a,-b, a-c, -b), nrow=2));

coor <- cbind(coor, 1) 

# translation matrix
I <- matrix(0,3,3); diag(I) <- 1

I[1, 3] <- -coor[4, 1]
I[2, 3] <- -coor[4, 2]
alpha = -pi/2

# rotation matrix
M <- matrix(c(cos(alpha), sin(alpha), 0,
             -sin(alpha), cos(alpha), 0,
                 0,          0, 1), nrow=3)


coor1 <- matrix()
coor1 <- coor %*% I %*% M %*% solve(I) 
coor2 <- matrix(c(2,-1, 2,2, 3,2, 3,1),nrow=2)

plot(coor[,1], coor[,2], col='red', type= 'l', xlim=c(-3,6), ylim=c(-2,6), xlab='x', ylab='y')
points(x=coor1[,1], y=coor1[,2], col='green', type= 'l')
points(t(coor2), col='blue', type= 'l')

1 Ответ

0 голосов
/ 23 апреля 2019

Собственный ответ на вопрос:

a <- 3; b <-1 ; c <- 1

coor <- matrix(0, 2, 4)
coor <- t(matrix(c(0,0, a,0, a,-b, a-c, -b), nrow=2));
coor <- cbind(coor, 1)

alpha = -pi/2

coor1 <- matrix(0, 3, 3)

# new origin (x, y)
x <- coor[4,1]; y <- coor[4,2]

T <- matrix(0, 3, 3)
T <- matrix(c(cos(alpha), sin(alpha),  x,
             -sin(alpha), cos(alpha),  y,
                       0,          0,  1), nrow=3);
coor1 <- coor %*% T

plot(coor[,1], coor[,2], col='red', type= 'l', xlim=c(0,3), ylim=c(-1,2), xlab='x', ylab='y')
points(round(cbind(coor1[,1], coor1[,2]),2), col='green', type= 'l')

enter image description here

...