# 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