Преобразование плоскости, заданной XYZ в координаты xy в R (3D в 2D)

моя проблема-это просто! Как я могу преобразовать точки xyz координаты (все принадлежат одной плоскости) только xy координаты. Я не могу найти функцию R или R-решение.

enter image description here

исходные данные:

# cube with plain
library(scatterplot3d)
my.plain <- data.frame(ID = c("A","B","C","D","E","F","G","H"),
                        x = c(1,1,1,2,2,2,3,3),
                        y = c(1,1,1,2,2,2,3,3),
                        z = c(1,2,3,1,2,3,1,2))

scatterplot3d(my.plain$x, my.plain$y, my.plain$z,
              xlim = c(0,3), ylim = c(0,3), zlim = c(0,3))

Как я могу получить данные.рамка точек, где точка A равна [0,0], тогда как расстояние между A и D равно sqrt(2)?

1 ответов


Итак, то, что у вас есть прямо сейчас, - это координаты в 3D копланарных точек (вы действительно можете проверить, что ваши точки копланарны, вычисляя ранг матрицы my.plain[, c("x", "y", "z")], который 2).

вы хотите, чтобы ваш новый "кадр" определялся точкой A как начало координат и векторы (A->B)/|A->B|^2 и (A->D)/|A->D|^2.

чтобы преобразовать ваши координаты xyz в координаты в новом "кадре", вам нужно умножить прежние координаты, сдвинутые на координаты A, на матрицу преобразования из старой рамы на новую.

Итак, в коде R это дает:

# Get a matrix out of your data.frame
row.names(my.plain) <- my.plain$ID
my.plain <- as.matrix(my.plain[, -1])

# compute the matrix of transformation
require(Matrix)
AB <- (my.plain["B", ] - my.plain["A", ])
AD <- (my.plain["D", ] - my.plain["A", ])
tr_mat <- cbind(AD/norm(AD, "2"), AB/norm(AB, "2"))

# compute the new coordinates
my.plain.2D <- (my.plain - my.plain["A", ]) %*% tr_mat

# plot the 2D data
plot(my.plain.2D, pch=19, las=1, xlab="x", ylab="y")

# and the plot with the letters, the polygon and the color:
plot(my.plain.2D, pch=3, las=1, xlab="x", ylab="y")
polygon(my.plain.2D[c("A", "B", "C", "F", "H", "G", "D"), ], col="magenta")
points(my.plain.2D, pch=3, lwd=2)
text(my.plain.2D[, 1], my.plain.2D[, 2], row.names(my.plain.2D), pos=2, font=2)

enter image description here