#------------------------------------------------------------------
# vettori nel piano, con somma prodotto scalare
#
# GdA marzo 2023
#-------------------------------------------------------------------

pausa <- function() { cat ("\n >> press Enter to continue\n"); scan() }

print.vec <- function(v, nd) {
  if(length(v) == 2) {   # versione 2D 
    fmt <- sprintf("%%.%df, %%.%df", nd, nd)
    cat(sprintf(fmt, v[1], v[2] ))
  } else {
      cat(sprintf("Errore: il vettore ha dimensionalità %d\n",length(v)))
  }
} 

prod.scal <- function(v1, v2)  sum(v1*v2) 
mod.vec <- function(v) sqrt( prod.scal(v,v) )  

plot.vuoto <- function(xyM) {
#  plot(NULL,  xaxt = 'n', yaxt = 'n', bty = 'n', pch = '', asp=1,
     plot(NULL, bty = 'n', pch = '', asp=1,
       ylab = '', xlab = '', xlim=c(-xyM,xyM), ylim=c(-xyM,xyM))
  # aggiungiamo gli assi cartesiani
  abline(v=0)
  abline(h=0)
  # ... con tanto di frecce (l'uso di f è un piccolo trucco pratico)
  f <- 1.2; arrows(f*xyM, 0, f*xyM*1.01, 0, length=0.2 )
  text(f*xyM, -0.04*xyM, pos=1, 'x', cex=1.5)
  f <-1.; arrows(0, f*xyM, 0, f*xyM*1.01, length=0.2 )
  text(0.06*xyM, f*xyM, pos=1, 'y', cex=1.5)
  grid()
}

# ploy vuoto
xyM <- 10
plot.vuoto(xyM)

cat(sprintf("\n   Clicca in due punti della finestra grafica\n \n"))
# vettore a
p <- locator(1)  # legge le coordinate di un punto
a <- c(p$x, p$y)
arrows(0, 0, a[1], a[2], len=0.1, col='cyan', lwd=2  )
cat(sprintf("a: "))
print.vec(a, 2)
cat(sprintf("  (modulo = %.2f)\n", mod.vec(a)))
# vettore b
p <- locator(1)
b <- c(p$x, p$y)
arrows(0, 0, b[1], b[2], len=0.1, col='magenta', lwd=2 )
cat(sprintf("b: "))
print.vec(b, 2)
cat(sprintf("  (modulo = %.2f)\n", mod.vec(b)))
# punto all'origine
points(0,0, pch=19, cex=0.7)
cat(sprintf("\n  -> facciamone la somma \n"))
pausa()

# somma
c <- a + b
arrows(0, 0, c[1], c[2], len=0.1, col='blue' , lwd=2)
arrows(a[1], a[2], a[1]+b[1], a[2]+b[2], len=0.1, col='magenta' , lwd=2, lty=2)
arrows(b[1], b[2], a[1]+b[1], a[2]+b[2], len=0.1, col='cyan' , lwd=2, lty=2)
cat(sprintf("a+b: "))
print.vec(c, 2)
cat(sprintf("  (modulo = %.2f)\n", mod.vec(c)))

cat(sprintf("\n  -> guarda la somma, poi passiamo all'angolo \n"))
pausa()
plot.vuoto(xyM)
arrows(0, 0, a[1], a[2], len=0.1, col='cyan', lwd=2  )
arrows(0, 0, b[1], b[2], len=0.1, col='magenta', lwd=2 )

cat(sprintf("\n prodotto scalare fra a e b: %.4f \n", prod.scal(a,b)))
costh <- prod.scal(a,b) / (mod.vec(a) * mod.vec(b))
th <- acos(costh)
cat(sprintf("\n  cos(th) fra a e b: %.4f \n", costh))
cat(sprintf("\n  th fra a e b: %.4f rad (%.2f gradi)\n", th, th*180/pi))

# proiezione di b su a: 

pr.b.su.a <- mod.vec(b) * costh
cat(sprintf("\n  Proiezione di b su a: %.4f\n", pr.b.su.a ))
pba <- a * pr.b.su.a / mod.vec(a)
arrows(0, 0, pba[1], pba[2], col='magenta', lwd=2, len=0 )
arrows(pba[1],  pba[2], b[1], b[2], col='magenta', lty=2, len=0)    

# proiezione di a su b: 
pausa()
plot.vuoto(xyM)
arrows(0, 0, a[1], a[2], len=0.1, col='cyan', lwd=2  )
arrows(0, 0, b[1], b[2], len=0.1, col='magenta', lwd=2 )
pr.a.su.b <- mod.vec(a) * costh
cat(sprintf("\n  Proiezione di a su b: %.4f \n", pr.a.su.b))
pab <- b * pr.a.su.b / mod.vec(b)
arrows(0, 0, pab[1], pab[2], col='cyan', lwd=2, len=0 )
arrows(pab[1],  pab[2], a[1], a[2], col='cyan', lty=2, len=0)   


