2015-03-09 31 views
8

Il mio problema è semplice! Come posso trasformare i punti xyz coordinate (tutti appartengono a un singolo piano) a solo coordinate xy. Non riesco a trovare alcuna funzione R o soluzione R. DatiConverti aereo dato da xyz a coordinate xy in R (3D a 2D)

enter image description here

Fonte:

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

Come posso ottenere un data.frame di punti, dove il punto A è [0,0], mentre la distanza tra A e D è sqrt (2)?

risposta

4

Quindi quello che hai adesso sono le coordinate in 3D di punti complanari (puoi effettivamente verificare che i tuoi punti sono complanari calcolando il grado della matrice my.plain[, c("x", "y", "z")], che è 2).

Si desidera che il nuovo "frame" sia definito dal punto A come origine e vettori (A->B)/|A->B|^2 e (A->D)/|A->D|^2.

Per convertire le coordinate xyz in coordinate nel nuovo "frame", è necessario moltiplicare le coordinate precedenti, spostate dalle coordinate di A, dalla matrice di trasformazione dal vecchio frame a quello nuovo.

Così, nel codice R, questo dà:

# 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