# Un esempio di GEOMETRIA 3D: # Clicca vicino al bordo per ruotare la figura nel verso che # vuoi. Clicca verso il centro, un po' in alto, per aumentare # la distanza dell'occhio, un po' in basso per diminuirla # # SELEZIONA tutto (sino a #### per solo altre immag.) e INCOLLA in R # # Per altre immagini, arresta il tracciamento con ESC e scrivi # animaz(teta,fi,di) dove teta,fi,di indicano la posizione dell' # occhio: teta (direzione nel piano xy: 90 da un punto del piano # verticale che passa per l'asse x, 180 per l'asse y), fi (in- # clinazione: 0 se l'occhio sta nel piano xy, 90 se sta sopra O, # -90 se sta sotto) e di (indicatore di distanza: varia, ma non # coincide, con la distanza dell'occhio da O) che vuoi. # (con O abbiamo indicato il centro del box) # # Se metti thphdi(teta,fi,di) hai una sola immagine # # Se metti punto(P) hai una visione da un punto della semiretta OP # (vedi gli esempi da ### in poi) # Se non vuoi il bordo del box modifica F in questo modo: # F <- persp(...,d=di, border="white",box=FALSE) # z0 <- c(-1.5,1.5); x <- c(-1.5,1.5); y <- c(-1.5,1.5) u <- c(z0[1],z0[1],z0[1],z0[1]); z <- array(u,dim=c(2,2)) # in u metto il val. minimo di z thphdi <- function(t,p,di) { par( mai = c(0.2,0.2,0.5,0.3) ) # riduco i margini F <- persp(x,y,z,theta=t,phi=p,scale=FALSE,zlim=z0,xlim=x,ylim=y,d=di) lines(trans3d(c(-1,-1,1,1,-1),c(-1,1,1,-1,-1),c(0,0,0,0,0),pmat=F)) lines(trans3d(c(-1,-1),c(-1,-1),c(0,1),pmat=F)) lines(trans3d(c(1,1),c(-1,-1),c(0,1),pmat=F)) lines(trans3d(c(-1,-1),c(1,1),c(0,1),pmat=F)) lines(trans3d(c(1,1),c(1,1),c(0,1),pmat=F)) lines(trans3d(c(-1,1),c(-1,-1),c(1,1),pmat=F),col="red") lines(trans3d(c(-1,1),c(1,1),c(1,1),pmat=F),col="red") lines(trans3d(c(1,1),c(1,0),c(1,1.5),pmat=F),col="brown") lines(trans3d(c(1,1),c(-1,0),c(1,1.5),pmat=F),col="brown") lines(trans3d(c(-1,-1),c(-1,0),c(1,1.5),pmat=F),col="red") lines(trans3d(c(-1,-1),c(1,0),c(1,1.5),pmat=F),col="red") lines(trans3d(c(1,-1),c(0,0),c(1.5,1.5),pmat=F),col="red") lines(trans3d(c(1,1),c(-0.2,-0.2),c(0,0.7),pmat=F),col="brown") lines(trans3d(c(1,1),c(0.2,0.2),c(0,0.7),pmat=F),col="brown") lines(trans3d(c(1,1),c(-0.2,0.2),c(0.7,0.7),pmat=F),col="brown") lines(trans3d(c(0,0),c(0,0),c(0,2),pmat=F),col="blue",lty=3) lines(trans3d(c(0,2),c(0,0),c(0,0),pmat=F),col="blue",lty=3) lines(trans3d(c(0,0),c(0,2),c(0,0),pmat=F),col="blue",lty=3) } animaz <- function(teta,fi,di) { while(1 < 2) { thphdi(teta,fi,di); title(paste("teta",teta,"° ","fi",fi,"° ","ind.dist.",di)) l <- locator(1); a <- c(l$x,l$y) fi2 <- ifelse(a[2] > 0.15,fi-1,ifelse(a[2] < -0.15,fi+1,fi)) teta2 <- ifelse(a[1] > 0.15,teta-1,ifelse(a[1] < -0.15,teta+1,teta)); di2 <- ifelse(abs(a[2]) < 0.2 & abs(a[1]) < 0.2 & a[2] > 0,di*2,di); di2 <- ifelse(abs(a[2]) < 0.2 & abs(a[1]) < 0.2 & a[2] < 0,di2/2,di2); if (di2 == di) {fi <- fi2; teta <- teta2} di <- di2 title(paste("teta",teta,"° ","fi",fi,"° ","ind.dist.",di))} } punto <- function(x,y,z) {teta <- ifelse(x!=0,atan(y/x)/pi*180+90,0); phi <- atan(z/sqrt(x^2+y^2))/pi*180; di <- sqrt(sqrt(x^2+y^2+z^2)); if(teta > 180) teta <- teta-180; thphdi(teta,phi,di) } #### dev.new() animaz(55,20,1) dev.new(xpos=50,ypos=10) punto(5,5,5) dev.new(xpos=100,ypos=10) punto(5,3,4) dev.new(xpos=150,ypos=10) punto(5,0,0) dev.new(xpos=200,ypos=10) punto(0,0,5) # # # # usa graphics.off() se vuoi chiudere tutte le finestre grafiche