将 xyz 给定的平面转换为 R 中的 xy 坐标(3D 到 2D)
Convert plane given by xyz to xy coordinates in R (3D to 2D)
我的问题很简单!如何将点 xyz 坐标(都属于一个平面)转换为仅 xy 坐标。 我找不到任何 R 函数或 R 解决方案。
源数据:
# 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))
如何获得 data.frame 个点,其中点 A 为 [0,0],而 A 和 D 之间的距离为 sqrt(2)?
所以你现在拥有的是共面点的 3D 坐标(你确实可以通过计算矩阵的秩 my.plain[, c("x", "y", "z")]
,即 2 来验证你的点是否共面)。
您希望新 "frame" 由点 A 定义为原点和向量 (A->B)/|A->B|^2
和 (A->D)/|A->D|^2
。
要将您的 xyz 坐标转换为新 "frame" 中的坐标,您需要将之前的坐标乘以 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)
我的问题很简单!如何将点 xyz 坐标(都属于一个平面)转换为仅 xy 坐标。 我找不到任何 R 函数或 R 解决方案。
源数据:
# 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))
如何获得 data.frame 个点,其中点 A 为 [0,0],而 A 和 D 之间的距离为 sqrt(2)?
所以你现在拥有的是共面点的 3D 坐标(你确实可以通过计算矩阵的秩 my.plain[, c("x", "y", "z")]
,即 2 来验证你的点是否共面)。
您希望新 "frame" 由点 A 定义为原点和向量 (A->B)/|A->B|^2
和 (A->D)/|A->D|^2
。
要将您的 xyz 坐标转换为新 "frame" 中的坐标,您需要将之前的坐标乘以 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)