2015-03-09 78 views
8

Vấn đề của tôi rất đơn giản! Làm thế nào tôi có thể chuyển đổi các tọa độ xyz (tất cả thuộc về một mặt phẳng đơn) chỉ với các tọa độ xy. Tôi không thể tìm thấy bất kỳ giải pháp R hoặc R nào. dữ liệuChuyển đổi mặt phẳng do xyz thành xy tọa độ trong R (3D thành 2D)

enter image description here

Nguồn:

# 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)) 

Làm thế nào tôi có thể nhận được một data.frame điểm, nơi điểm A là [0,0], trong khi khoảng cách giữa A và D là sqrt (2)?

Trả lời

4

Vì vậy, những gì bạn có ngay bây giờ là tọa độ trong 3D của điểm đồng phẳng (bạn thực sự có thể xác minh rằng điểm của bạn là đồng phẳng bằng cách tính thứ hạng ma trận my.plain[, c("x", "y", "z")], là 2).

Bạn muốn "khung" mới của mình được xác định theo điểm A là nguồn gốc và vectơ (A->B)/|A->B|^2(A->D)/|A->D|^2.

Để chuyển đổi tọa độ xyz của bạn thành tọa độ trong "khung" mới, bạn cần phải nhân các toạ độ cũ, được dịch chuyển bởi tọa độ của A, bởi ma trận chuyển đổi từ khung cũ sang khung mới.

Vì vậy, trong mã R, điều này mang lại:

# 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

Các vấn đề liên quan